分段是80X86体系的处理器支持的一种特性,也就是说硬件已经支持了这内存分段的功能, 用或不用的选择权在操作系统手中,linux系统就没有使用分段的功能,而使用了分页的功能。
linux虽然没有用分段,但了解分段对于整个linux系统的了解,还有linux初始化的时的流程,还是很有用的。
参考资料 《深入理解Linux内核》第二章,大概讲了12页,我也看了几遍才看懂,以下内容就算个读书笔记。
一,内存地址的分类
1,逻辑地址: 由段和偏移量组成
2,线性地址: 可以想像成指针地址,就是我们在C语言中的用的指针
3,物理地址: 实实在在的物理内存地址
二,处理器有哪硬件特性支持分段
如下图所示,CPU提供了6个段寄存器(cs,ss...)和6个段描述符寄存器(图中矩形)
段寄存器:16比特,其中存的是段描述符的索引,即段选择符
段描述符:8个字节,存的是段的描述信息,此寄存器不可编程,它随着段寄存器值的改变而改变,由硬件完成。
gdtr寄存器:当操作系统初始化时,会在内存中创建GDT(段全局描述符表),然后将这个表的地址放入gdtr寄存器中。
三,逻辑地址怎么样转换为线性地址
假如我们现在有了一个逻辑地址,1:100,1代表段选择符,100代表偏移量,那么我们根据段选择符1就可以从寄存器中拿到段描述符。从段描述符中可以取到段的起始地址,然后再加上偏移量,就得到了线性地址,整个过程由硬件完成。
四,Linux怎么使用分段
如下图所示,linux中所有分段的起始地址都定义成了0,这就得出了一个重要的结论:在Linux下,逻辑地址和线性地址是一样的。
也就是说,linux绕开了硬件的分段功能!!!
按书上的说法,原因有二
1,简单,因为linux用了分页,再用分段,会比较复杂。
2,移植性,因为很多处理器对分段支持不好