文章目錄
  1. 1. 引言
  2. 2. 总结
  3. 3. 引用

引言

本来自己查了很多资料,想自己写出来,结果下笔的时候发现别人已经把我想写的部分全部写出来了,而且比我想的还要具体,所以我就不写了,把链接放出了,顺便我补充一些

http://leenjewel.github.io/blog/2015/11/11/%5B%28xue-xi-xv6%29%5D-nei-he-gai-lan/

总结

由于内存分页在后面的lab2中也会设计,而且给出的资料写的非常详细,所以我就不多提了。这里提一下为了更好的理解什么内存分页的段选择子与CS的关系,我写了一篇关于CS寄存器的发展史

最后我提一下kern/entrypgdir.c手写的内存分页表

第一个entry_pgdir是页目录,第二个entry_pgtable页表,而且注意entry_pgtable是代表0-4M物理内存可写可读的真实内存地址

前面知道了目录和页表的作用,在现实系统中,一个目录下有1024个页表,但是这只有一个页表,而且它代表从0-4M连续的内存空间

PS:后面12位是权限位,只看前三位,可以知道是从(000-3ff)的高20位物理地址,由于我们声明了__attribute__((__aligned__(PGSIZE)))(地址4K对齐,其实意思是它真实物理地址后12位一定全部为0),所以直接取(uintptr_t)entry_pgtable地址就是页表地址,虽然后面加上权限位PTE_P + PTE_W,但是在寻找真实地址时都会屏蔽(只取前20位如),当初想了很久感觉取不到页表的真实地址,还以为有什么神奇的编译设定,后面查了很久资料才明白,所以这里提个醒后面我们会在lab2中正式接触内存分页技术,这里只是相当于设定了一个“常数”,后面会将器扩展变成“函数”。

引用

文章目錄
  1. 1. 引言
  2. 2. 总结
  3. 3. 引用