什么是分页、 动态页面分配
也正是因为我们的内核很小,所以低端1MB的空间对它来说已经绰绰有余了。如此一来,我们只需要将低端1MB内存特殊处理,使这一部分内存的线性地址和经过页部件转换之后的物理地址相同即可。这样做的好处是,内核不用做任何变动即可在分页机制下正常工作。
- 低端1MB虚拟内存空间与物理内存空间完全映射。(好处是内核代码不做修改)
- 将内核低端1MB物理内存与线性地址0x8000_0000-0x800F_FFFF,建立映射。 目的是内核空间是属于任务全局共享的,高2GB虚拟内存空间是属于内核的,所有要将内核区域映射到高2GB虚拟内存空间。 技巧:高20位全为1时,即高10位=0x3ff,中高10位=0x3ff,他们的偏移量是0xffc,即页目录表、页表倒数第一个表项的偏移量。
将内核映射到虚拟内存的高端之后,其线性地址范围是0x80000000~0x800FFFFF。这个范围内的地址,其二进制形式的高10位都是1000000000,即十六进制的0x200,乘以4之后是0x800,去访问页目录表。 所以,我们需要在页目录表内偏移为0x800的地方填写一个目录项,用来转换这些地址,应该填写0x0002_1003,页表起始物理地址
- mbr.asm 复用,无任何改动
- core.asm 内核开启分页模式,发生部分改动
- app.asm 复用,无任何改动