20211316郭佳昊 《信息安全系统设计与实现(上)》学习笔记1
一、任务要求
- [ 1 ] 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)
我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题
核心是要求GPT:请你以苏格拉底的方式对我进行提问
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:你的理解(回答)是什么?
如果你觉得差不多了,可以先问问GPT:针对我XXX知识点,我理解了吗?
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:我的回答结束了,请对我的回答进行评价总结,让它帮你总结一下。
-
[ 2 ] 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)
-
[ 3 ] 实践过程截图,代码链接(2分)
-
[ 4 ] 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)
二、知识归纳
-
第一章
- 学习目标
-
编程背景知识。学会汇编器、编译器、链接器
-
动态数据结构的应用。理解链表、链队列、链栈、链树等动态数据结构在实践中的用处和使用方式
-
进程管理。学会创建进程、按优先级调度进程、通过上下文切换运行不同进程等进程操作。
-
并发编程。学习并行计算和并发编程,了解各种线程同步工具。
-
定时器和定时功能。学习Unix/Linux中硬件定时器的原理,定时器中断和时钟服务功能。
-
信号、信号处理和进程间通信。学会Unix/Linux环境下信号、信号处理及进程间通信。
-
文件系统。了解不同层次的文件操作,实现一个与Linux完全兼容的完整EXT2文件系统。
-
TCP/IP和网络编程。学习TCP/IP协议、套接字API、UDP和TCP套接字编程以及网络计算中CS模型以及HTTP及web编程。
- Unix/Linux命令
-
ls:Is dirname:列出CWD 或目录的内容
-
cd dirname:更改目录
-
pwd:打印CWD的绝对路径名
-
touch filename:更改文件名时间戳(如果文件不存在,则创建文件)
-
cat filename:显示文件内容
-
cp src dest:复制文件
-
mv src dest:移动或重命名文件
-
mkdir dirname:创建目录
-
rmdir dirname:移除(空)目录
-
rm filename:移除或删除文件
-
In oldfile newfile:在文件之间创建链接
-
find:搜索文件
-
grep:搜索文件中包含模式的行
-
ssh:登录到远程主机
-
gzipfilename:将文件压缩为gz文件
-
gunzip file.gz:解压gz文件
-
tar -zcvf filetgz.:从当前目录创建压缩tar 文件
-
tar-zxvffiletgz,:从tgz 文件中解压文件
-
man:显示在线手册页
-
zip file.zip filenames:将文件压缩为.zip 文件
-
unzip file.zip:解压.zip 文件
-
第二章
- Linux中的文本编辑器(vim)
-
操作模式:命令模式(输入命令),插入模式(输入和编辑文本),末行模式(保存文件并退出)
-
常用命令:h:l:(左右)j:k:(上下)移动光标;i:,a:切换插入模式,esc退出;“;”进入末行模式,w:写入,q:退出,wq:保存退出,q!:强制退出
- 程序开发
-
步骤:创建源文件,用gcc把源文件转换为二进制可执行文件
-
静态与动态链接:在静态链接中,编译器将程序的所有依赖库(如函数库或其他对象文件)的代码和数据合并到最终的可执行文件中,因此可执行文件包含了所有需要的代码和数据,可以独立运行,不需要外部的库文件支持。但缺点是可执行文件体积较大,且更新库时需要重新编译整个程序。在动态链接中,程序的依赖库仅在运行时加载,而不是在编译时合并到可执行文件中,因此可执行文件较小,而且更新库而无需重新编译程序。缺点是依赖于系统上已安装的共享库,如果共享库版本不兼容,可能会导致运行时出现问题。
-
可执行文件格式:分为二进制可执行平面文件、a.out文件、ELF可执行文件。a.out文件分为文件头、代码段、数据段、符号表四个部分。文件头包含a.out文件的加载信息和大小,分为tsize、dsize、bsize、total_size四个部分,代码段包含程序的可执行代码,从c语言启动代码crt0.o开始。
-
程序执行过程:
1、读取a.out文件头,确定所需总内存大小,包括堆栈空间大小;
2、sh从总大小中分配一个内存区给执行映像;
3、sh放弃旧映像,开始执行新映像;
4、从crt0.o开始,调用main()函数,将argc和argv作为参数传递给main()函数。 -
程序终止:
1、正常终止:如果程序执行成功,main()最终会返回到crt0.o,调用库函数exit(0)来终止进程。exit(value)函数会执行一些清理请求,如刷新stdout、关闭I/O流等,然后发出一个_exit(value)系统调用,使进入操作系统内核的进程终止。
2、异常终止:在执行a.out时,进程可能会遇到如无效地址、非法指令、越权等错误,这些错误会被CPU识别为异常。当某进程遇到异常时,它会陷人操作系统内核。内核的陷入处理程序将陷入错误类型转换为一个幻数,称为信号,将信号传递给进程,使进程终止
- gcc
-
功能:将C源文件先转换为汇编代码文件(.c转换为.s),再将汇编代码转换为目标代码(.s转换为.o),链接(将所有.o文件组合为a.out文件,该文件为二进制可执行文件)
-
编译选项:命令格式: gcc[选项][文件名]
-E:仅执行编译预处理
-S:将C代码转换为汇编代码
-c:仅执行编译操作,不进行连接操作
-o:指定生成的输出文件
-I (大写i):指定头文件目录
-l:指定程序要链接的库
-L:指定库文件所在的目录名
- gdb
-
功能:启动程序,设置运行环境和参数来运行指定程序;让程序在指定断点处停止执行;调试程序
-
常用命令:gdb[选项][参数]
启动程序:gdb 可执行文件,启动GDB并加载要调试的可执行文件。
运行程序:run,启动程序的执行。
设置断点:break 行号 或 b 函数名,在指定的行号或函数上设置断点。
继续执行:continue 或 c,继续程序的执行,直到下一个断点或程序结束。
单步执行:step 或 s,逐行单步执行程序,如果遇到函数调用,则进入函数内部。
跳过函数调用:next 或 n,单步执行程序,但跳过函数内部的代码。
查看变量值:print 变量名 或 p 变量名,查看指定变量的值。
观察表达式:display 表达式,持续查看指定表达式的值,直到取消显示。
查看源代码:list 或 l,查看当前代码上下文的源代码。
设置 watchpoint:watch 变量名,在变量的值发生改变时触发断点。
显示:info ,显示各类信息
分离进程:detach,从已附加的进程中分离GDB。
退出GDB:quit 或 q,退出GDB调试器。
查看所有命令:help
查看某一种类的命令:help
- makefile
-
功能:用于告诉构建系统如何编译和链接源代码
-
常用命令:
make:使用 make 命令来构建目标。自动查找名为 Makefile 或 makefile 的文件,并执行其中定义的规则。
make target:构建指定的目标。
make clean:清理项目,通常用于删除生成的中间文件、可执行文件和其他临时文件。
make -n :显示执行 make 命令时要运行的命令,但不实际执行它们。
make -f filename:使用指定的 Makefile 文件来构建项目。
make -C directory:切换到指定的目录,然后运行 make 命令,用于在不同的子目录中构建项目。
三、利用chatgpt进行苏格拉底挑战
苏格拉底挑战:
chatgpt判断与总结
四、问题与解决思路
在对1.c进行编译时发现出错,询问chatgpt后了解到是编译预处理时,输入前和输入后文件名一样发生冲突,并了解到冲突的后果
五、实践过程
- helloworld为例测试gcc编译过程
创建名为hello的c语言文件
gcc -E hello.c -o hello.i 将hello.c预处理为hello.i文件后查看
gcc -S hello.i -o hello.s 将hello.i汇编为hello.s文件后查看
gcc -c hello.s -o hello.o将hello.s编译输出为hello.o文件后查看
用objdump -d命令反汇编查看文件并链接
记忆口诀(ESc,iso)
- 上课示例