编译的时候会一个一个文件的编译,生成目标文件,同时建立符号表。
最后再整体链接起来,替换各自的符号表文件,形成一个整体的可执行文件。
Section:(编译)
汇编器会把程序编程目标文件,目标文件是由多个section组成的。
Segment:(链接输出)
把程序具有相同权限的部分放在一起(可执行文件不同的部分将加载进不同的 section,并且每个 section 会转换进某个 segment 里),使得内存权限得到高效管理,同时使分页对齐的时候减少浪费。
两者区别:
从链接的角度看,ELF文件是按Section存储的;从装载的角度看,ELF文件是按照Segment来划分的。
在将目标文件链接成可执行文件的时候,链接器会尽量把相同权限属性的段分配在同一空间。比如可读可执行的段放在一起,这就是典型的代码段。
Page:(运行加载时使用的技术)
通过分段(segment)保证程序之间不会互相影响,但是存在内存使用效率的问题。分段对内存区域的映射还是按照程序为单位,被换入换出的是整个程序,这样势必会造成大量的磁盘访问,从而影响速度,这种方法还是比较粗糙,粒度比较大。事实上,根据程序的局部性原理,当一个程序运行时,在某个时间段内,它只是频繁的用到一小部分数据,也就是说,程序的很多数据其实在一个时间段内都是不会被用到的。人们很自然的想到了更小粒度的内存分割和映射方法,使得程序的局部性原理得到充分应用,提供内存使用率。——分页。
把地址空间人为的等分成固定大小的页,每一页的大小由硬件决定或者硬件支持多种大小,由操作系统来决定用哪一个。