diff --git a/notes/Linux.md b/notes/Linux.md index 92a941f7..f845852a 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1348,7 +1348,7 @@ epoll_event有两种触发模式,LT模式和ET模式 - select 会修改 fd_set 参数,而 poll 不会; - select 默认只能监听 1024 个描述符,如果要监听更多的话,需要修改 FD_SETSIZE 之后重新编译; -- poll 提供了更多多的事件类型。 +- poll 提供了更多的事件类型。 ### 2. 速度 diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index bac42e6a..f3c0d1b8 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -23,6 +23,10 @@ * [五、设备管理](#五设备管理) * [磁盘调度算法](#磁盘调度算法) * [六、链接](#六链接) + * [编译系统](#编译系统) + * [目标文件](#目标文件) + * [静态链接](#静态链接) + * [动态链接](#动态链接) * [参考资料](#参考资料) @@ -815,6 +819,64 @@ CSCAN 对 SCAN 进行了改动,要求磁头始终沿着一个方向移动。 # 六、链接 +## 编译系统 + +以下是一个 hello.c 程序: + +```c +#include + +int main() +{ + printf("hello, world\n"); + return 0; +} +``` + +在 Unix 系统上,由编译器把源文件转换为目标文件。 + +```bash +gcc -o hello hello.c +``` + +这个过程大致如下: + +

+ +1. 预处理阶段:处理以 # 开头的预处理命令; +2. 编译阶段:翻译成汇编程序; +3. 汇编阶段:将汇编程序翻译可重定向目标程序,它是二进制的; +4. 链接阶段:将可重定向目标程序和 printf.o 等单独预编译好的目标文件进行合并,得到最终的可执行目标程序。 + +## 目标文件 + +1. 可执行目标文件:可以直接在内存中执行; +2. 可重定向目标文件:可与其他可重定向目标文件在链接阶段合并,创建一个可执行目标文件; +3. 共享目标文件:可以在运行时被动态加载进内存并链接; + +## 静态链接 + +静态连接器一一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务: + +1. 符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用于一个符号定义关联起来。 +2. 重定位:编译器和汇编器生成从地址 0 开始的代码和数据节,链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。 + +

+ +## 动态链接 + +静态库有以下两个问题: + +- 当静态库更新时那么整个程序都要重新进行链接; +- 对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。 + +共享库是为了解决静态库的这两个问题而设计的,在 Linux 系统中通常用 .so 后缀来表示,Windows 系统上它们被称为 DLL。它具有以下特点: + +1. 在给定的文件系统中一个库只有一个 .so 文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中; +2. 在内存中,一个共享库的 .text 节的一个副本可以被不同的正在运行的进程共享。 + +

+ # 参考资料 - Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014. diff --git a/pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg b/pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg new file mode 100644 index 00000000..f6ddd2c2 Binary files /dev/null and b/pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg differ diff --git a/pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg b/pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg new file mode 100644 index 00000000..642aba6b Binary files /dev/null and b/pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg differ diff --git a/pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg b/pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg new file mode 100644 index 00000000..a3e1a656 Binary files /dev/null and b/pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg differ