【嵌入式操作系统(Linux篇)】实验期末复习(1)

以下是关于嵌入式操作系统(Linux篇)的实验汇总,大概率都是会考的

特别是shell程序和文件IO的操作

嵌入式操作系统实验小结—涉及期末大题

(一)Linux操作系统的使用实验

1、认识Linux操作系统的目录结构

   请进入自己电脑Linux操作系统的目录,绘制出系统的目录结构树形图,并把第一层目录的作用与功能写出来(至少写6个目录的常用功能)。

图就自己画了哦很简单的。

eg:

/bin 存放二进制程序

/boot 存放内核和启动所需的文件

/dev 存放设备文件

/etc 存放系统配置文件

/home 用户根目录

/lib 存放库文件

2、文件与目录相关命令的使用

  1. 进入/bin目录,并查看该目录下有哪些文件:

cd  /bin

ls -l

(2)进入用户主目录,在用户主目录下,新建目录myshare:

cd  /home/xxxxxxxx     ( cd ~)

mkdir   myshare

ls  -ld  myshare/

(3)用pwd命令查看当前所在的目录

Pwd

(4)新建testfile文件

touch  testfile

ls  -l

(5)设置该文件的权限模式

chmod  755   testfile

ls  -l  testfile

(6)把该文件备份到/tmp/myshare目录下,并改名为testfile.bak。

cp  testfile   myshare/testfile.bak

ls  -l  myshare/

(7)在/root目录下为该文件创建1个符号连接(若无权限,可使用root账号操作)。

ln  -s  /tmp/testfile    /root/testfile.ln

ls  -l  /root/testfile.ln

(8)删除testfile.bak文件

    rm myshare/testfile.bak

    ls  -l  myshare  通过该命令检查是否删除成功。

3、用户与系统相关命令的使用

(1)将普通用户模式转变为超级用户

su

然后输入超级用户密码。

从超级用户切回到普通用户

su  xxxxxx

(2)通过ps命令查看进程列表

ps -ef

(-e  显示所有进程     -f全格式)

4. 压缩备份命令的使用

(1)把/tmp目录打包成tmp.tar,放到/root目录下

tar  -cf   /root/tmp.tar   /tmp/*

(2)把/tmp目录压缩打包成tmp.tar.gz,放到/root目录下:

tar  -zcvf   /root/tmp.tar.gz   /tmp/*

(3)比较tmp.tar和tmp.tar.gz的大小:ls  -l   /root/tmp.tar   /root/tmp.tar.gz

(4)解压tmp.tar.gz的内容到/tmp/myshare目录:

tar  zxvf   /root/tmp.tar.gz   -C    /tmp/myshare/

(5)把/tmp目录下每个文件压缩成.gz格式:gzip *

(6)详细列出每个.gz压缩文件的信息,不解压:gzip –l *

把每个.gz压缩文件解压,并列出详细信息:gzip –dv *

(二)Vim编辑器的使用实验

先确保系统以安装好Vim编辑器(安装方法:sudo apt-get install vim),再启动Vim进入编辑器。

Vi编辑器有基本的三种模式:命令模式、编辑模式、底行模式。学会在三种模式之间的自由切换,以及三种模式下的常用命令的使用。参考教材中命令行模式和底行模式下的常见功能键完成如下操作练习。

1、准备

Ø 在“/tmp”目录下建一个名为“ViTest”的目录。Mkdir  /tmp/ViTest

Ø 进入“ViTest”目录。cd  /tmp/ViTest

2 基本功能使用实验

   Vim编辑的基本功能是:启动编辑器--进入编辑模式--编辑文本—退出编辑模式--保存并退出编辑器。

   请在/tmp/ViTest完成如上Vi编辑器的常规流程操作实验,并写出每一个步骤的操作命令方法是什么?

实验结果:

1启动编辑器:在终端输入`vim /tmp/ViTest`,回车。这将打开Vim编辑器并创建一个名为ViTest的文件,如果文件已经存在,则会打开该文件。

2进入编辑模式:在Vim编辑器中,按`i`键进入插入模式,这时可以开始编辑文本。

(3)编辑文本:在插入模式下,可以直接输入文本进行编辑。

4退出编辑模式:完成编辑后,按`Esc`键退出插入模式,返回到命令模式。

5保存并退出编辑器:在命令模式下,输入`:wq`,然后按回车。这将保存对文件的更改并退出Vim编辑器。

3 其他功能操作实验

Ø 进入ViTest目录,将文件“/etc/profile”复制到“/ViTest”目录下。cp /etc/profile  ./

再使用chmod命令更改ViTest目录下profile文件的权限为777。

Chmod 777 profile

Ø 使用Vi 打开“Vi”目录下的profile。 vi profile(请doublecheck是否是编辑的Vi目录下的profile,一定不要编辑etc目录下的profile)

请根据课堂讲述内容检查确认当前Vi编辑器属于什么模式?再按步骤完成如下命令的使用操作。

Vi编辑器属于命令模式

  • Ø 设定行号(:set nu),指出“判断profile.d文件(if [ -d /etc/profile.d ])是否存在”判断语句的行号。
  • Ø 将光标移到该行。如:19<enter>或20G(注意G要大写)
  • Ø 复制该行内容。yy
  • Ø 将光标移到最后一行行首。G
  • Ø 粘贴复制行的内容。p
  • Ø 撤销上一步的动作。u
  • Ø 将光标移动到行尾。$或End
  • Ø 光标移到21行。21G
  • Ø 删除该行。dd
  • Ø 存盘但不退出。:w(底行模式)——注意检查底部的英文提示信息
  • Ø 将光标移到首行。1G
  • Ø 插入模式下输入“Hello,this is Vi world!”。按i 键并输入“Hello,this is Vi world!”(插
  • 入模式)
  • Ø 返回命令行模式。Esc
  • Ø 向下查找字符串“bashrc”。  /bashrc(命令行模式)
  • Ø 再向上查找字符串“etc ?etc
  • Ø 强制退出Vi,不存盘。:q!(底行模式)

(三)Shell脚本编程实验

1、Shell命令脚本编写实验:编写一个shell程序,实现:在/tmp目录下,新建一个目录,目录名称为【当前用户名+TEST】,然后再将/etc/profile文件拷贝到该目录下。

实验内容3.1实验报告

实验题目

Shell命令脚本编写实验

Shell程序源码

///***此处贴上Shell程序源代码

注意:每个Shell脚本的第一条语句请使用下面这条语句:

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

#!/bin/bash  

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

# 获取当前用户名  

USERNAME=$(whoami)  

# 构建目录名称  

DIRNAME="${USERNAME}TEST"  

# 在/tmp目录下新建目录  

mkdir /tmp/$DIRNAME  

# 检查目录是否创建成功  

if [ -d "/tmp/$DIRNAME" ]; then  

    echo "目录 /tmp/$DIRNAME 创建成功"  

    # 将/etc/profile文件拷贝到该目录下  

    cp /etc/profile  /tmp/$DIRNAME/  

    if [ $? -eq 0 ]; then  

        echo "文件 /etc/profile 已成功拷贝到 /tmp/$DIRNAME/"  

    else  

        echo "拷贝文件时出错"  

    fi   

else  

    echo "目录创建失败"  

fi

运行过程及结果截图

///***此处贴上S  hell程序运行过程及结果截图

其他情况说明

2、数值计算程序编写实验:编写一个shell程序,实现计算100以内能被3整除的数的个数和这些数的和。(提示:可用数值运算命令expr)

实验内容3.1实验报告

实验题目

数值计算程序编写实验

Shell程序源码

///***此处贴上Shell程序源代码

注意:每个Shell脚本的第一条语句请使用下面这条语句:

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

#!/bin/bash  

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

count=0  

sum=0  

for ((num=1; num<=100; num++))  

do  

  if (( num % 3 == 0))  

  then  

    count=$((count + 1))  

    sum=$((sum + num))  

  fi  

done  

echo "100以内能被3整除的数的个数为: $count"  

echo "这些数的和为: $sum

运行过程及结果截图

///***此处贴上Shell程序运行过程及结果截图

其他情况说明

  1. 函数编程实验:编写一个shell程序,先设计一个函数NumberReverse,用于实现对输入的一串数字取反序,如:输入1234,则打印4321。然后在主函数中实现循环等待用户输入一串数字,再调用当用户输入q时,程序退出。

实验内容3.1实验报告

实验题目

函数编程实验

Shell程序源码

///***此处贴上Shell程序源代码

注意:每个Shell脚本的第一条语句请使用下面这条语句:

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"

#!/bin/bash  

echo "This is $LOGNAME's Shell Test Script._RunTime:`date`"  

NumberReverse() {  

    local reversed=""  

    local -n num_str=$1    

for (( i=${#num_str}-1; i>=0; i-- ))

do  

        reversed="${reversed}${num_str:$i:1}"  

    done  

    echo "$reversed"  

}  

while true; do   

    read -p "请输入一串数字(输入q退出): " input  

      if [ "$input" == "q" ]; then  

        echo "程序已退出。"  

        break  

    fi    

    reversed_number=$(NumberReverse input)  

    echo "反转后的数字是: $reversed_number"  

done

运行过程及结果截图

///***此处贴上Shell程序运行过程及结果截图

其他情况说明

GCC 编译器的使用

  参考教材中gcc的命令和编译选项,自行构造实验,测试总体选项、警告和出错选项以及优化选项的编译效果。请自由选择3个编译选项进行对比试验,并描述该编译选项的效果是什么。

  • -Wall(启动所有警告)【这个应该触发a未初始化的信息】
  • gcc -Wall  hello.c  -o hello
  • -Werror(将警告视为错误)
  • gcc -Werror  hello.c  -o hello
  • -O2(优化等级为2)
  • gcc  -O2  hello.c  -o hello

GDB 基本命令的使用

使用Vim 编辑源程序,在终端中输入vi gdbtest.c,输入如下源代码,

编辑完成后存盘。此代码的功能为输出倒序main 函数中string[]数组中定义的字符串,但结果没有输出显示,现通过gdb调试的方式来解决程序中存在的问题。程序源代码如下:

#include <stdio.h>

int display1 (char *string)

int display2 (char *string1)

int main ()

{

char string[] = "Embedded Linux";

display1 (string);

display2 (string);

}

int display1 (char *string)

{

printf ("The original string is %s \n", string);

}

int display2 (char *string1)

{

char *string2;

int size,i;

size = strlen (string1);

string2 = (char *) malloc (size + 1);

for (i = 0; i < size; i++)

string2[size - i] = string1[i];

string2[size+1] = ' ';

printf("The string afterward is %s\n",string2);

}

(1)用gcc 编译:gcc gdbtest.c -o gdbtest

编译是否会报错?如报错,请根据报错信息分析错误原因,修改编译错误,并把修改方法在此描述。修改编译通过后再进行后续实验。

(2)运行gdbtest:./ gdbtest,分析程序运行的输出结果是?

请分析程序输出结果,分析其存在的问题。

(3)启动Gdb 调试:gdb gdbtest

输入gdb命令l,查看源代码:观察是否可以正常查看到源代码?如不能请分析原因是什么并回答。使用q命令,退出gdb。

不可以看到源代码,未加上“-g”选项,这样编译出的可执行文件不会包含调试信息,GDB无法载入该可执行文件

(4)用gcc的-g选项重新编译:gcc -g gdbtest.c -o gdbtest

再次启动gdb调试:gdb gdbtest

输入gdb命令l,查看源代码:

Ø

在20 行(for 循环处)设置断点:b 20

Ø 在23 行(printf 函数处)设置断点:b 23。

Ø 查看断点设置情况:info b

Ø 运行代码:r

Ø 单步运行代码:n

Ø 查看暂停点变量值:p string2[size - i]

查看暂停点变量值:p i

Ø 继续单步运行代码数次,并使用命令查看变量的值,发现string2[size-1]的值正确

Ø 继续程序的运行:c

Ø 程序在printf 前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没

有被正确赋值,而后面的复制都是正确的,这时,定位程序第31 行,发现程序运

行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远

不能被赋值而保持NULL,故输不出任何结果。

Ø 退出gdb:q

Ø 重新编辑gdbtest.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] =

string1[i];”即可。

使用Gcc 重新编译,查看运行结果:./ gdbtest

The original string is Embedded Linux

The string afterward is xuniL deddedbmE

这时,输入结果正确。

(六)Make 工程管理器的使用

小结过程:

vi MakeTest.c

写测试代码

vi makefile

写Makefile代码

退出vim

make

./MakeTest.c

(1)编辑源代码,利用文本编辑器vi 创建MakeTest.c 文件,vi  MakeTest.c

#include <stdio.h>

int main()

{

printf("Welcome to Test makefile!\n");

return 1;

}

(2)编写Makefile 文件。

利用文本编辑器创建一个makefile 文件,并将其保存到与MakeTest.c 相同的目录下

CC=gcc

CFLAGS=

all: MakeTest

MakeTest: MakeTest.o

        $(CC) $(CFLAGS) MakeTest.o –o MakeTest

MakeTest.o: MakeTest.c

        $(CC) $(CFLAGS) –c MakeTest.c –o MakeTest.o

clean:

        rm *.o

  1. 使用Make 编译项目。执行make,查看并记录所生成的文件,对生成可执行程序进行运行,查看运行的结果。

文件IO编程实验

(1)基本IO(非缓冲)操作编程:编写一个基本IO操作的源代码,要求使用到基本IO操作的5个函数:打开、读取、写入、定位和关闭。编译上述源代码并调试通过,最后对运行结果予以分析验证。

open、write、lseek、read、close

(2)标准IO(缓冲)操作编程:编写一个标准IO操作的源代码,要求使用到标准IO操作的5个函数:打开、读取、写入、定位和关闭。编译上述源代码并调试通过,最后对运行结果予以分析验证。

fopen、fwrite、fseek、fread、fclose

注:文件IO编程操作实验中,要实现的具体功能自拟(只要应用到了5个函数即可),提交源代码和对应的运行结果。

补充:(期末大题)

(1)基本IO操作的综合示例:

/****fileio.c***/
#include <unistd.h>
#include<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h> 


int main(void)
{ int fd, size;
char s[] ="This program is used to show how to use open(), write(), read() function.\nHave fun!\n”;

char buffer[80];
/*以可读写的方式打开一个文件,如果不存在则创建该文件*/
fd = open("temp.log",O_WRONLY|O_CREAT );

if(-1 ==fd)

{printf("Open or create file named \"temp.log\" failed.\n");
return -1;}
write( fd, s, sizeof(s) );/*向该文件中写入一个字符串*/

close( fd );
fd =open("temp.log", O_RDONLY);
if (-1 == fd )
(printf("Open file named \"temp.log\"failed.\n”))return -1;}
/*读取文件内容保存到buffer指定的字符串数组中,返回读取的字符个数
size = read( fd, buffer, sizeof(buffer) );
close( fd );
printf( "%s", buffer );
return 0;
 

(2)标准IO操作的综合示例:

/****readrec.c***/
#include <stdio.h>
#include <stdlib.h>
struct record {
char name[10];
int age;

};
int main(void)
(
struct record array[2];
FILE *fp = fopen("recfile", "r"); if (fp ==NULL){
perror("Open file recfile”);exit(1);
}

fread(array, sizeof(struct record), 2, fp);
printf("Name1: %s\tAge1: %d\n", array[0].name, array[0].age);

printf("Name2: %s\tAge2: %d\n", array[1].name, array[1].age);

fclose(fp);
return 0;
)

/****writerec.c***/
#include <stdio.h>
#include <stdlib.h>
struct record {char name[10];int age;};
int main(void){
struct record array[2] = {{"Ken", 24), ("Knuth", 28});
FILE *fp = fopen("recfile", "w"); if (fp ==NULL)(
perror("Open file recfile");
exit(1);
fwrite(array, sizeof(struct record), 2, fp); fclose(fp);
return 0;

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理IP如何助力旅游信息聚合?

在数字化时代&#xff0c;旅游信息聚合对于提升服务质量、优化用户体验起着至关重要的作用。随着在线旅游预订的普及&#xff0c;旅游信息的采集、整合和呈现成为了一个复杂而关键的过程。在这个过程中&#xff0c;代理IP技术以其独特的优势&#xff0c;为旅游信息聚合提供了强…

APP项目测试 之 开发模型和发布

项目客户端一般分为&#xff1a;浏览器端和APP端 APP端分为&#xff1a;手机端&#xff08;安装在手机上的软件&#xff09;和PC端&#xff08;安装在电脑上的软件&#xff09; 1.开发模型 项目迭代速度不同&#xff1a;开发模型不一样 传统行业&#xff1a;瀑布模型 互联网行业…

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…

vue2axios的使用

1.安装axios npm i axios 2.配置代理服务器 1.在config.js中配置单个代理服务器 // 开启代理服务器 需要重新启动项目devServer: {proxy: http://localhost:5000}配置简单&#xff0c;请求资源时直接发给前端&#xff08;8080&#xff09;即可&#xff1b;但不能配置多个代理…

ORB-SLAM2同OpenMVS实现三维重建

ORB-SLAM2 位姿导出 Note: 为与OpenMVS进行对接本次进对ORB-SLAM2进行部分修改&#xff0c;使之可以为 OpenMVS提供稀疏点云、关键帧的位姿、内参&#xff0c;以及稀疏点云在各个View 中的可见性。 主要更改如下 . 在Map文件下增添如下函数 public: void Save(const string &a…

iOS shouldRecognizeSimultaneouslyWithGestureRecognizer 调用机制探索

shouldRecognizeSimultaneouslyWithGestureRecognizer 经常会看到&#xff0c;但是一直没有弄清楚其中的原理和运行机制&#xff0c;今天专门研究下 其运行规律 我们准备三个视图&#xff0c;如下&#xff0c;红色的是绿色视图的父视图&#xff0c;绿色视图 是蓝色视图的父视图…

Feign 配置全局日志存入mongo

1、开启feign日志 在application.yml 添加配置 feign:client:config:default:loggerLevel: FULL2、日志实体类 Document(collection "feignLogs") Data public class FeignLog {Idprivate String id;private String method;private String url;private LocalDate…

CTF-PWN-LLVM-【红帽杯-2021 simpleVM】

文章目录 参考检查逆向漏洞思路调试定位到PASS名exp 参考 https://bbs.kanxue.com/thread-274259.htm#msg_header_h2_6 http://www.blackbird.wang/2022/08/30/LLVM-PASS%E7%B1%BBpwn%E9%A2%98%E6%80%BB%E7%BB%93/ 检查 因为是用opt运行&#xff0c;加载动态库VMPASS.so的P…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(四)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

基于STM32的智能花园灌溉系统

目录 引言环境准备智能花园灌溉系统基础代码实现&#xff1a;实现智能花园灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;花园灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能花园灌溉系统通过使用ST…

普元EOS学习笔记-EOS8.3精简版安装

前言 普元EOS是优秀的高低开结合的企业应用软件开发框架。 普元&#xff1a;这是普元公司的名字&#xff0c;普元信息&#xff0c;上市公司哦&#xff0c;这里就不过多安利了。 EOS&#xff1a;普元公司的企业应用开发系统&#xff0c;开发语言是基于Java&#xff0c;技术框…

在 UBUNTU 22.04 上逐步构建 Postal SMTP 服务器

构建 Postal SMTP 服务器来发送批量电子邮件是电子邮件营销人员的不错选择。Postal 功能非常强大&#xff0c;并拥有大量开发人员的支持。它是一个用 JavaScript 和 Ruby 编写的开源邮件服务器脚本。它可用于构建内部 SMTP 服务器&#xff0c;就像 Mailgun、Sendgrid、Mailchim…

LangChain入门学习笔记(七)—— 使用检索提高生成内容质量

大模型训练使用的数据是开放的、广泛的&#xff0c;因此它显得更加的通用。然而在有些应用场景下&#xff0c;用户需要使用自己的数据使得大模型生成的内容更加贴切&#xff0c;也有时候用户的数据是敏感的&#xff0c;无法提供出来给大模型进行通用性的训练。RAG技术就是一种解…

LabVIEW项目外协时选择公司与个人兼职的比较

​在选择LabVIEW项目外协合作伙伴时&#xff0c;外协公司和个人兼职各有优劣。个人兼职成本较低且灵活&#xff0c;但在可靠性、技术覆盖面、资源和风险管理上存在不足。而外协公司拥有专业团队、丰富资源、完善的项目管理和风险控制&#xff0c;尽管成本较高&#xff0c;但能提…

基于单片机火灾自动报警系统设计

摘 要&#xff1a; 我国的火灾自动报警技术已经相对的较为成熟&#xff0c;随着信息技术的发展&#xff0c;网络化、信息化在火灾自动报警器上的应用也越来越多。无线通信的方式使得报警器本身可以方便的应用于大大小小的环境&#xff0c;例如工厂、社区和学校等等。通过对单片…

音频分离人声和伴奏可以实现吗?手机人声分离工具10款无偿分享!

随着科技的飞速发展&#xff0c;音频处理技术已经取得了显著的进步&#xff0c;其中音频分离人声和伴奏已成为现实。这一技术不仅为音乐制作人和音频工程师提供了便利&#xff0c;更为广大音乐爱好者提供了无限的创作可能性。本文将为大家分享10款手机人声分离工具&#xff0c;…

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有&#xff0c;那么必须执行类的加载过程(加载、检查…

npm安装依赖报错——npm ERR gyp verb cli的解决方法

1. 问题描述 1.1 npm安装依赖报错——npm ERR! gyp verb cli npm MARN deprecated axiosQ0.18.1: critical security vuLnerability fixed in v0.21.1. For more information, npm WARN deprecated svg001.3.2: This SVGO version is no Longer supported. upgrade to v2.x.x …

华为实训案例

案例下载 案例内包含空拓扑图、配置完整的拓扑、以及步骤脚本文档&#xff0c;可按需下载。 拓扑图 任务清单 &#xff08;一&#xff09;基础配置 根据附录1拓扑图、附录2地址规划表、附录3设备编号表&#xff0c;配置设备接口及主机名信息。 将所有终端超时时间设置为永不…

SOLIDWORKS卡顿反应慢怎么解决 慧德敏学

如果您的SOLIDWORKS软件运行缓慢或反应迟钝&#xff0c;可以尝试以下方法来提高性能和响应速度&#xff1a; 一、硬件检查与升级&#xff1a; 检查计算机硬件配置是否满足SOLIDWORKS官方推荐的要求&#xff0c;特别是CPU、内存和显卡。如果配置较低&#xff0c;考虑升级硬件以…