重修操作系统---内存部分(day 1)
本文章参考《深入理解linux内核》一书
如有不对,不吝赐教
内存寻址
内存地址分类
内存地址分为逻辑地址,线性地址,物理地址三种,他们之间的关系如下所示:

这就是常说的段页式寻址。
段选择子和段描述符
以32位系统为例
逻辑地址由两部分构成,一个16位长的段选择子和32位长的偏移。
通过段选择子找到对应的段描述符,就可以去的对应地址的基址,有了基址和偏移就能得出线性地址了,工作流程如下:

段选择子和段描述符中还有其他重要字段,例如DPL特权级决定是否有访问权限,limit表示段的大小等。
为了加速逻辑地址到线性地址的计算,段寄存器存放段选择子,而类似缓存的寄存器存放了对应的段描述符。只有段寄存器更换段选择子的时候缓存寄存器才会更新,其他时间访问地址可以直接走缓存寄存器得到段描述符。
注意段选择子的大小式两个字节,段描述符的大小式八个字节。
段的权限有读,写,执行三类。
Linux GDT/LDT
每个CPU都有自己的GDT,每个GDT有18个已使用的项和14个保留的项,注意他们之间是交错排布的,目的是硬件高速缓存(还没看到,看到再回来补充)。
Linux GDT一般是被内核或者BIOS使用,而LDT则是给用户态进程使用。
大多数用户态进程不使用LDT,因此GDT中预留了一项缺省LDT给它们共享。除此之外,GDT中还有一项LDT是给拥有自己的LDT的进程使用的。
对于调用了modify_ldt()创建了属于自己的LDT的进程而言,在被CPU运行时,GDT中的LDT表项也会被相应修改。

浙公网安备 33010602011771号