主要参考的是《深入理解linux内核》这本书,这里讨论的是intel的8086体系
1. 逻辑地址包含两个部分,段选择符和偏移量。
1. 逻辑地址包含两个部分,段选择符和偏移量。
2. 先检查段选择符的TI字段,该字段决定了段选择符表是全局选择符表(GDT)还是局部选择符表(LDT)。决定了之后,可以从对应的寄存器里面得到线性基地址(GDT---gdtr寄存器,LDT---ldtr寄存器).
3. 用段选择符的index字段的值乘以8(一个段描述符的大小),再加上寄存器中的值,得到段描述符的地址;
4. 用逻辑地址的偏移量加上段描述符的Base值,得到线性地址。
5. 线性地址含有三个部分,Directory(目录,最高10位),Table(页表,中间10位),Offset(偏移量,最低12位,这个部分决定了一页的大小是4KB);
6. 在控制寄存器cr3中保存了正在使用的页目录的物理地址,从这里面就可以决定页目录。
7. 根据Directory的值,可以确定页目录项(初开始我以为Directory决定了页目录,但是实际上,这个部分决定的目录项。也就是从这个部分的值,再加上cr3寄存器中的值,可以确定目录项,目录项指向页表。简单说就是cr3+Directory->页目录项=页表)
8. Table字段决定了页表中的表项,而该表项含有的是页所在页框的物理地址。
9. Offset字段决定页框内的相对位置。因此页框物理地址加上Offset值得到物理地址