《信息安全系统设计与实现》第一周学习笔记
第一章 引言
-
关于本书
- 本书是一部研究Unix/Linux系统编程的专注
-
系统编程的作用
- 系统编程是计算机科学和计算机工程教育不可或缺的一部分
-
本书目标
-
强化学生变成背景知识
-
动态数据结构的应用
-
进程概念和进程管理
-
并发编程
-
定时器和定时功能
-
信号、信号处理和进程间通信
-
文件系统
-
TCP/IP和网络编程
-
-
Unix
-
Unix是一种通用操作系统
-
AT&T Unix
-
Berkeley Unix
-
HP Unix
-
IBN Unix
-
Sun Unix
-
-
Linux
-
Linux是一个类Unix系统
-
Debian Linux
-
Ubuntu Linux
-
Linux Mint
-
基于RPM的Linux
-
Slackware Linux
-
-
虚拟机上的Linux
-
VirtualBox
-
VMware
-
双启动Slackware和Ubuntu Linux
-
-
Unix/Linux命令
-
Ubuntu Linux系统管理
-
添加新用户
-
用户账户
-
sudo命令
-
第二章 编程背景
-
Linux中的文本编辑器
-
vim
命令模式:用于输入命令
插入模式:用于输入和编辑文本
末行模式:用于保存文件并退出
相关命令: -
gedit
-
emacs
- 一款强大的文本编辑器,可在多个不同的平台上运行
-
-
使用emacs
- 创建main.c文件
- 创建main.c文件
-
程序开发步骤
-
创建源文件
-
gcc把源文件转成二进制可执行文件
- 运行main文件,输出hello
- 运行main文件,输出hello
-
gcc三个步骤
- 将源文件转换为汇编代码
- 将汇编代码转换成目标代码
- 将目标代码转换成二进制可执行文件
-
苏格拉底挑战:
以下是关于程序开发步骤的苏格拉底挑战
以下是关于gcc三个步骤的苏格拉底挑战
-
-
静态和动态链接
- 动态链接
-
可以减小每个a.out文件大小
-
许多执行程序可以在内存中共享相同库函数
-
修改库函数不需要重新编译源文件
-
- 动态链接
-
可执行文件格式
-
二进制可执行平面文件
- 仅包含可执行代码和初始化数据
-
a.out可执行文件
- 传统的a.out文件包含文件头、代码段、数据段、bss段、符号表
-
ELF可执行文件
- 可执行的链接格式文件,包含一个或多个程序段,每个程序段均可可加载至特定的内存地址。在Linux中,默认的二进制可执行文件为ELF文件
-
-
程序执行过程
-
读取a.out文件头(如
TotalSize = _brk + stackSize
) -
sh从大小中分配一个内存区给执行对象
-
放弃旧映像,开始执行新映像
-
执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main(),可以写成int main(
int argc,char *argv[]
){....
}
-
-
程序终止
-
正常终止
- 如果程序执行成功,main()最终会返回到crt0.out,调用库函数exit(0)来终止进程
-
异常终止
-
遇到错误,如无效地址,非法指令,越权等
-
按下ctrl+C可以产生硬件中断
-
使用命令
kill -s signal_number pid
或者#signal_number=1 to 31
向通过pid识别的目标进程发送信号
-
-
-
C语言中的函数调用
-
32位GCC中的运行时堆栈使用情况
-
long jump
-
64位GCC中的运行时堆栈使用情况
- 在64位模式下,CPU寄存器扩展到rax,rbx,rcx,rdx,rbq,rsp,rsi,rdi,r8到r15,位宽都是64位
-
-
链接库
-
静态链接库
gcc -c -fPIC mysum.c
gcc -shared -o libmylib.so mysum.o
gcc t.c -L. -lmylib
a.out
-
动态链接库
gcc -c mysum.c
ar rcs libmylib.a mysum.o
gcc -static t.c -L. -lmylib
a.out
-
上述两种情况如果链接库不在当前目录中,只需要更改-L.选项,设置LD_LABRARY_PATH,以包含链接库的目录
-
-
markfile
- make是一个程序,按顺序读取makefile或Makefile。
-
CDB调试工具
-
GDB是由GNU开源组织发布的一款强大的UNIX程序调试工具。
-
GDB的启动方式
gdb
gdb test.out
gdb test.out core
-
遇到的问题
- 查看用户界面没有显示用户名。
- 解决办法:上网找另一个代码尝试,换了代码后,显示用户名。