Section与Segment间的区别是什么?
汇编语法关键字
在汇编源码中,通常用语法关键字section或segment来表示一段区域,它们是编译器提供的伪指令,作用是相同的,都是在程序中"逻辑地"规划一段区域,此区域便是节。
注意,此时所说的section或segment都是汇编语法中的关键字,它们在语法中都表示"节",不是段,只是不同编译器的关键字不同而已,关键字segment在语法中也被认为与section意义相同。
也就是说,汇编语法关键字中的section或segment实际上都是指目标文件(*.o)中的“节”(Section)。
程序的加载
操作系统加载程序时并不关心节的数量和大小,操作系统只关心节的属性,因为程序必然是要加载到内存中才能运行的,而内存的访问会涉及到全局描述符表中段描述符的访问权限等属性,保护模式下对任何内存的访问都要经过段描述符才行。
具体细节需要理解操作系统保护模式下全局描述表,没有再深究。总之,操作系统在加载程序时,不需要对逐个节进行加载,只要给出相同权限的节的集合就行了,例如把所有只读可执行的节(如代码节.text和初始化代码节.init)归并到一块,所有可读写的节(如数据节.data和未初始化节.bss)归并到一块,这样操作系统就能为它们分配不同的段选择子,从而指向不同段描述符,实现不同的访问权限了。
链接过程
为了程序能在操作系统上运行,操作系统和编译器需要相互配合,此时汇编器只生成了目标文件,尚未链接,因此这个将"节"合并的工作是由链接器来完成的,链接器将目标文件中属性相同的节合并成一个大的Section集合,此集合便称为Segment,也就是段,此段便是我们平时所说的可执行程序内存空间中的代码段和数据段。
segment是什么意思?
segment即数据文件空间,中文名是段,是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。