程序员的自我修养:链接、装载与库

编译的时候会一个一个文件的编译,生成目标文件,同时建立符号表。

最后再整体链接起来,替换各自的符号表文件,形成一个整体的可执行文件。


Section:(编译)

汇编器会把程序编程目标文件,目标文件是由多个section组成的。

Segment:(链接输出)

把程序具有相同权限的部分放在一起(可执行文件不同的部分将加载进不同的 section,并且每个 section 会转换进某个 segment 里),使得内存权限得到高效管理,同时使分页对齐的时候减少浪费。

两者区别:

从链接的角度看,ELF文件是按Section存储的;从装载的角度看,ELF文件是按照Segment来划分的。

在将目标文件链接成可执行文件的时候,链接器会尽量把相同权限属性的段分配在同一空间。比如可读可执行的段放在一起,这就是典型的代码段。


Page:(运行加载时使用的技术)

通过分段(segment)保证程序之间不会互相影响,但是存在内存使用效率的问题。分段对内存区域的映射还是按照程序为单位,被换入换出的是整个程序,这样势必会造成大量的磁盘访问,从而影响速度,这种方法还是比较粗糙,粒度比较大。事实上,根据程序的局部性原理,当一个程序运行时,在某个时间段内,它只是频繁的用到一小部分数据,也就是说,程序的很多数据其实在一个时间段内都是不会被用到的。人们很自然的想到了更小粒度的内存分割和映射方法,使得程序的局部性原理得到充分应用,提供内存使用率。——分页。

把地址空间人为的等分成固定大小的页,每一页的大小由硬件决定或者硬件支持多种大小,由操作系统来决定用哪一个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容