《信息安全系统设计与实现》第一周学习笔记
《信息安全系统设计与实现》第一周学习笔记
第一章
- 关于本书
- 介绍Unix/Linux的功能,着重探讨了编程实践,让学生通过实践来练习系统编程,涵盖Unix/Linux的所有基本组件,包括进程管理、并发编程、定时器和时钟服务、文件系统、网络编程和MySQL数据库系统。
- 系统编程的作用
- 系统编程是计算机科学和计算机工程教育不可或缺的一部分,对学习操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能等方面有着重要的作用。
- 本书的目标
- 强化学生的编程背景知识
- 动态数据结构的应用
- 进程概念和进程管理
- 并发编程
- 定时器和定时共嗯
- 信号、信号处理和进程间通信
- 文件系统
- TCP/IP和网络编程
- 关于Unix
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
- 关于Linux
- Debian Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
- 虚拟机上的Linux
-
一些命令
-
VirtualBox
-
VMware(我使用的)
-
Parallels Desktop
-
- Ubuntu Linux系统管理
- 用户账户
在终端上输入 vi /etc/passwd
- 添加新用户
在终端上输入 sudo adduser username。
- 用户账户
第二章
-
Linux中的文本编辑器
- vim
- 命令模式:输入命令
- 插入模式:输入和编辑文本
- 末行模式:保存文件并退出
- i:插入模式,插入文本
- a:插入模式,追加文本
- :w:写入(保存)文件
- :q:退出vim
- :wq:保存并退出
- :q!:不保存更改,强制退出
- gedit
- emacs
- 实践过程:
-
使用文本编辑器
-
程序开发
-
程序开发步骤
- 创建源文件
- gcc把源文件转成二进制可执行文件
- gcc三个步骤
- 将源文件转换为汇编代码
- 将汇编代码转换成目标代码
- 将目标代码转换成二进制可执行文件
- 苏格拉底挑战:
-
静态和动态链接
- 动态链接
- 可以减小每个a.out文件大小
- 许多执行程序可以在内存中共享相同库函数
- 修改库函数不需要重新编译源文件
- 动态链接
-
可执行文件
- 二进制可执行平面文件:仅包含可执行代码和初始化数据
- a.out可执行文件
- 传统的a.out文件包含文件头(tsize、dsize、bsize、total_size)、代码段、数据段、bss段、符号表。
- ELF可执行文件
-
程序执行过程
在类Unix操作系统中,在sh命令行a.out one two three
执行a.out文件,以标记字符串作为命令行参数。为执行命令,sh创建一个子进程并等待改子进程终止。子进程运行时,sh使用a.out文件执行新的执行映像- 读取a.out文件头
Total_Size = _brk + stackSize
- sh从总大小中分配一个内存区给执行映像。
- 然后,sh放弃旧映像,开始执行新映像sh放弃旧映像,开始执行新映像。
- 执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main(),可以写成
int main(int argc, char *argv[]){ … }
- 读取a.out文件头
-
程序终止
- 正常终止
- 程序执行成功,main()最终会返回到crt0.out,调用库函数exit(0)(系统调用)来终止进程
- 异常终止
- 遇到错误,如无效地址,非法指令,越权等,按下ctrl+C可以产生硬件中断,用命令
kill -s signal_number pid #signal_number=1 to 31
向通过pid识别的目标进程发送信号。
- 遇到错误,如无效地址,非法指令,越权等,按下ctrl+C可以产生硬件中断,用命令
- 正常终止
- C语言中的函数调用
- long jump:通过long jump直接返回到调用序列中较早的某个函数。
- C语言程序与汇编代码的链接
- gcc生成的汇编代码
- 入口代码:又叫prolog,它建立栈帧,在堆栈上分配局部变量和工作空间。
- 函数体代码:在AX寄存器中执行带有返回值的函数任务。
- 退出代码:又叫做epilog,它释放堆栈空间并返回到调用者。
- gcc生成的汇编代码
- 链接库
- 动态链接库
-
ar rcs libmylib.a mysum.o gcc -static t.c -L. -lmylib a.out```
-
- 静态链接库
- -L.指定链接库路径 -l指定链接库
-
gcc -shared -o libmylib.so mysum.o gcc t.c -L. -lmylib a.out```
- 动态链接库
- makefile
- make工具是一个程序,它按照顺序读取makefile,以自动有选择的执行编译链接。
一个make文件由一系列目标项、依赖项和规则组成 - 当make程序读取makefile时,通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项
- make工具是一个程序,它按照顺序读取makefile,以自动有选择的执行编译链接。
- GDB调试工具
- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。
- GDB的启动方式
gdb
gdb test.out
gdb test.out core
遇到的问题
- 一开始不理解为什么要将源文件转换成二进制可执行文件
- 解决方式:询问chatgpt,上网搜索后得知
这个过程将确保程序能够在计算机上运行,并且可以直接执行。二进制可执行文件中包含了程序的指令和数据,它可以被操作系统加载和运行。