- 优秀的博客:https://kiprey.github.io/2020/08/uCore-2/
- 实验书:https://learningos.github.io/ucore_os_webdocs/lab1/lab1_2_1_exercise.html
物理内存管理
启动分页
lab2做的就是物理内存管理:为了完成物理内存管理,首先需要探测可用的物理内存资源;了解到物理内存位于什么地方,有多大之后,就以固定页面大小来划分整个物理内存空间,并准备以此为最小内存分配单位来管理整个物理内存,接着 ucore kernel 就要建立页表, 启动分页机制,让 CPU 的 MMU 把预先建立好的页表中的页表项读入到 TLB 中,根据页表项描述的虚拟页(Page)与物理页帧(Page Frame)的对应关系完成 CPU 对内存的读、写和执行操作。
物理内存探测:
操作系统需要知道了解整个计算机系统中的物理内存如何分布的,哪些可用,哪些不可用。其基本方法是通过BIOS 中断调用来帮助完成的。其中 BIOS 中断调用必须在实模式下进行,所以在 bootloader 进入保护模式前完成这部分工作。总体来讲物理内存探测就是利用int0x15中断提供的服务,将其返回的内存信息保存在某一块缓存中。
页表自映射:https://zhuanlan.zhihu.com/p/452598045
建立段页式管理中需要考虑的关键问题:
为了实现分页机制,需要建立好虚拟内存和物理内存的页映射关系,即正确建立二级页表。此过程涉及硬件细节,不同的地址映射关系组合,相对比较复杂。总体而言,我们需要思考如下问题:
- 如何在建立页表的过程中维护全局段描述符表(GDT)和页表的关系,确保 ucore 能够在各个时间段上都能正常寻址?
- 对于哪些物理内存空间需要建立页映射关系?
- 具体的页映射关系是什么?
- 页目录表的起始地址设置在哪里?
- 页表的起始地址设置在哪里,需要多大空间?
- 如何设置页目录表项的内容?
- 如何设置页表项的内容?
分页:
在 ucore 建立内核页表时,设定了物理地址和虚地址的虚实映射关系是:phy addr + 0xC0000000 = virtual addr
开启分页的步骤比较容易,需要琢磨的细节见博客。
- 启动分段机制,未启动分页机制:逻辑地址--> (分段地址转换) -->线性地址==物理地址
- 启动分段和分页机制:逻辑地址--> (分段地址转换) -->线性地址-->分页地址转换) -->物理地址
当完成物理内存页管理初始化工作后,计算机系统的内存布局如下图所示:
标签:分页,--,Ucore,内存,lab2,地址,页表,相关,物理 From: https://www.cnblogs.com/wuyun--wy/p/17019465.html