more information about new GDT

This commit is contained in:
Wende Tan 2019-02-26 18:26:16 +08:00
parent 1347828917
commit 94db30c3ff
1 changed files with 3 additions and 3 deletions

View File

@ -1,5 +1,5 @@
### 系统执行中地址映射的三个阶段
原理课上讲到了页映射,段映射,以及段页式映射关系但对如何建立段页式映射关系没有详说。其实在lab1和lab2中都会涉及如何建立映射关系的操作。在lab1中我们已经碰到到了简单的段映射即对等映射关系保证了物理地址和虚拟地址相等也就是通过建立全局段描述符表让每个段的基址为0从而确定了对等映射关系。在lab2中由于在段地址映射的基础上进一步引入了页地址映射形成了组合式的段页式地址映射。这种方式虽然更加灵活了但实现稍微复杂了一些。在lab2中为了建立正确的地址映射关系ld在链接阶段生成了ucore OS执行代码的虚拟地址而bootloader与ucore OS协同工作通过在运行时对地址映射的一系列“腾挪转移”从计算机加电启动段式管理机制启动段页式管理机制在段页式管理机制下运行这整个过程中虚拟地址到物理地址的映射产生了多次变化实现了最终的段页式映射关系
原理课上讲到了页映射、段映射以及段页式映射关系但对如何建立段页式映射关系没有详说。其实在lab1和lab2中都会涉及如何建立映射关系的操作。在lab1中我们已经碰到到了简单的段映射即对等映射关系保证了物理地址和虚拟地址相等也就是通过建立全局段描述符表让每个段的基址为0从而确定了对等映射关系。在lab2中由于在段地址映射的基础上进一步引入了页地址映射形成了组合式的段页式地址映射。这种方式虽然更加灵活了但实现稍微复杂了一些。在lab2中为了建立正确的地址映射关系ld在链接阶段生成了ucore OS执行代码的虚拟地址而bootloader与ucore OS协同工作通过在运行时对地址映射的一系列“腾挪转移”从计算机加电启动段式管理机制启动段页式管理机制在段页式管理机制下运行这整个过程中虚拟地址到物理地址的映射产生了多次变化实现了最终的段页式映射关系
```
virt addr = linear addr = phy addr + 0xC0000000
```
@ -82,9 +82,9 @@ next:
总结来看这一阶段的目的就是更新映射关系的同时将运行中的内核EIP从低虚拟地址“迁移”到高虚拟地址而不造成伤害。
不过这还不是我们期望的映射关系因为它仅仅映射了0~4MB。对于段表而言也缺少了很多运行ucore所需的表项。
不过这还不是我们期望的映射关系因为它仅仅映射了0~4MB。对于段表而言也缺少了运行ucore所需的用户态段描述符和TSS描述符相应表项。
**第三个阶段**完善段表和页表从pmm_init函数被调用开始。pmm_init函数将页目录表项补充完成从0~4M扩充到0~KMEMSIZE,然后更新了段映射
**第三个阶段**完善段表和页表从pmm_init函数被调用开始。pmm_init函数将页目录表项补充完成从0~4M扩充到0~KMEMSIZE。然后更新了段映射机制使用了一个新的段表。这个新段表除了包括内核态的代码段和数据段描述符还包括用户态的代码段和数据段描述符以及TSS的描述符。理论上可以在第一个阶段即bootloader阶段就将段表设置完全然后在此阶段继续使用但这会导致内核的代码和bootloader的代码产生过多的耦合于是就有了目前的设计
这时形成了我们期望的虚拟地址、线性地址以及物理地址之间的映射关系: