20211316郭佳昊 《信息安全系统设计与实现(上)》学习笔记1

发布时间 2023-09-10 19:46:46作者: 20211316郭佳昊

一、任务要求

  • [ 1 ] 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)

我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题

核心是要求GPT:请你以苏格拉底的方式对我进行提问

然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:你的理解(回答)是什么?

如果你觉得差不多了,可以先问问GPT:针对我XXX知识点,我理解了吗?

GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:我的回答结束了,请对我的回答进行评价总结,让它帮你总结一下。

  • [ 2 ] 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)

  • [ 3 ] 实践过程截图,代码链接(2分)

  • [ 4 ] 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)

二、知识归纳

  • 第一章

    1. 学习目标
  • 编程背景知识。学会汇编器、编译器、链接器

  • 动态数据结构的应用。理解链表、链队列、链栈、链树等动态数据结构在实践中的用处和使用方式

  • 进程管理。学会创建进程、按优先级调度进程、通过上下文切换运行不同进程等进程操作。

  • 并发编程。学习并行计算和并发编程,了解各种线程同步工具。

  • 定时器和定时功能。学习Unix/Linux中硬件定时器的原理,定时器中断和时钟服务功能。

  • 信号、信号处理和进程间通信。学会Unix/Linux环境下信号、信号处理及进程间通信。

  • 文件系统。了解不同层次的文件操作,实现一个与Linux完全兼容的完整EXT2文件系统。

  • TCP/IP和网络编程。学习TCP/IP协议、套接字API、UDP和TCP套接字编程以及网络计算中CS模型以及HTTP及web编程。

    1. 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 文件

  • 第二章

  1. Linux中的文本编辑器(vim)
  • 操作模式:命令模式(输入命令),插入模式(输入和编辑文本),末行模式(保存文件并退出)

  • 常用命令:h:l:(左右)j:k:(上下)移动光标;i:,a:切换插入模式,esc退出;“;”进入末行模式,w:写入,q:退出,wq:保存退出,q!:强制退出

  1. 程序开发
  • 步骤:创建源文件,用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识别为异常。当某进程遇到异常时,它会陷人操作系统内核。内核的陷入处理程序将陷入错误类型转换为一个幻数,称为信号,将信号传递给进程,使进程终止

  1. gcc
  • 功能:将C源文件先转换为汇编代码文件(.c转换为.s),再将汇编代码转换为目标代码(.s转换为.o),链接(将所有.o文件组合为a.out文件,该文件为二进制可执行文件)

  • 编译选项:命令格式: gcc[选项][文件名]
    -E:仅执行编译预处理
    -S:将C代码转换为汇编代码
    -c:仅执行编译操作,不进行连接操作
    -o:指定生成的输出文件
    -I (大写i):指定头文件目录
    -l:指定程序要链接的库
    -L:指定库文件所在的目录名

  1. 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

  1. 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)

  • 上课示例