《信息安全系统设计与实现》第一周学习笔记
20201303张奕博
一、任务要求
自学教材第1,2章,提交学习笔记(10分)
- 知识点归纳以及自己最有收获的内容 (3分)
- 问题与解决思路(2分)
- 实践内容与截图,代码链接(3分)
...(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(2分)
二、知识总结
第一章
(1)关于本书
- 系统编程
系统编程是计算机科学和计算机工程教育不可或缺的一部分,对学习操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能等方面有着重要的作用。 - 本书目标
- 强化学生的编程背景知识
- 动态数据结构的应用
- 进程概念和进程管理
- 并发编程
- 定时器和定时共嗯
- 信号、信号处理和进程间通信
- 文件系统
- TCP/IP和网络编程
(2)关于Unix/Linux
Unix历史发展
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
Linux历史发展
- Debian Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
(3)虚拟机上的Liunx
- 下载VMware和ubuntu
- 一些命令操作
- sudo command
- Ubuntn Linux系统管理
-
用户账户
-
添加新用户
-
第二章
文本编辑器
- vim
- 命令模式
- 插入模式
- 末行模式
- gedit
- emacs(比较好用)
使用emacs
我这里遇到了安装问题,目前还没有解决。
使用sudo yum install emacs 之后会有cannot find a valid baseurl for repo的报错
我查找了网络(https://blog.csdn.net/shunzi2016/article/details/83659466)也找到了对应文件,但是没有权限更改
程序开发步骤
(1)创建源文件
- 全局变量
- 局部变量
- 自动变量
- 寄存器变量
还有易失性变量:用作内存映射I/O的地址或者通过中断处理程序或多个执行线程来访问的全局变量,易失性关键字可以阻止C编译器优化用这些变量进行操作的代码。
(2)gcc把源文件转成二进制可执行文件
gcc三个步骤:
- 将源文件转换为汇编代码(编译)
- 将汇编代码转换成目标代码(汇编)
.o(汇编)文件包含- 一个文件头,包含代码段、数据段和BSS段的大小
- 一个代码段,包含机器指令
- 一个数据段,包含初始化全局变量和初始化静态局部变量
- 一个BSS段,包含未初始化全局变量和未初始化静态局部变量
- 代码中的指针以及数据和BSS中的偏移量的重定位信息
- 一个符号表,包含非静态全局变量、函数名称及其属性
- 将目标代码转换成二进制可执行文件(链接)
静态和动态链接
- 动态链接
- 可以减小每个a.out文件大小
- 许多执行程序可以在内存中共享相同库函数
- 修改库函数不需要重新编译源文件
可执行文件
-
二进制可执行平面文件
仅包含可执行代码和初始化数据 -
a.out可执行文件
- 传统的a.out文件包含文件头(tsize、dsize、bsize、total_size)、代码段、数据段、bss段、符号表
- 一般情况下,使用 gcc编译器编译 .c/.cpp文件时:
1、如果直接编译,不加 -o (gcc file1.c
) 则其产生的可执行文件默认为 a.out
2、若加入 -o (gcc file1.c -o file1.o
) 则产生的可执行文件为 file1.o
-
ELF可执行文件
可执行的链接格式文件,包含一个或多个程序段,每个程序段均可可加载至特定的内存地址。在Linux中,默认的二进制可执行文件为ELF文件。更适合动态链接
程序执行过程
在类Unix操作系统中,在sh命令行a.out one two three
执行a.out文件,以标记字符串作为命令行参数。
为执行命令,sh创建一个子进程并等待改子进程终止。子进程运行时,sh使用a.out文件执行新的执行映像
-
读取a.out文件头
Total_Size = _brk + stackSize
e.g main(){main();} -
sh从总大小中分配一个内存区给执行映像。
-
sh放弃旧映像,开始执行新映像。
-
执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main(),可以写成
int main(int argc, char *argv[]){ … }
(5)程序终止
- 正常终止
如果程序执行成功,main()最终会返回到crt0.out,调用库函数exit(0)(系统调用)来终止进程 - 异常终止
- 遇到错误,如无效地址,非法指令,越权等
- 按下ctrl+C可以产生硬件中断
- 用
kill -s signal_number pid #signal_number=1 to 31
向通过pid识别的目标进程发送信号
C语言中的函数调用
- long jump
- C语言程序与汇编代码的链接
- gcc生成的汇编代码
- 入口代码
- 函数体代码
- 退出代码
- gcc生成的汇编代码
链接库
- 动态链接库
gcc -c mysum.c
ar rcs libmylib.a mysum.o
gcc -static t.c -L. -lmylib
a.out
- 静态链接库
-L.指定链接库路径 -l指定链接库
gcc -c -fPIC mysum.c
gcc -shared -o libmylib.so mysum.o
gcc t.c -L. -lmylib
a.out
makefile
- make工具是一个程序,它按照顺序读取makefile,以自动有选择的执行编译链接。
一个make文件由一系列目标项、依赖项和规则组成 - 当make程序读取makefile时,通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项
GDB调试工具
- GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。
- GDB的常规应用
- 自定义程序的启动方式(指定影响程序运行的参数)
- 设置条件断点(在条件满足时暂停程序的执行)
- 回溯检查导致程序异常结束的原因(Core Dump)
- 动态改变程序执行流(定位问题的辅助方式)
- GDB的启动方式
- 1.
gdb
- 2.
gdb test.out
- 3.
gdb test.out core
- 1.
C语言结构体(参考上学年所学的数据结构)
结构体和指针
类型转换
链表
-
单项链表
-
链表遍历
-
搜索链表
-
插入
-
优先级队列(FIFO)
-
删除操作
-
循环链表
-
双向链表
树和二叉树
- 二叉搜索树
(参考:https://www.cnblogs.com/zhangbaochong/p/5492877.html) - 二叉树遍历算法
- 先序遍历
- 中序遍历
- 后序遍历
- 深度优先遍历
- 广度优先遍历