##Thinking 3.1 我们注意到我们把宏函数的函数体写成了 do { // ... } while(0) 的形式,而不是仅仅写成形如 {// ... } 的语句块,这样的写法好处是什么? ###回答 'do{//}while(0)'是一个完整的语句,也是一个完整的结构,在之后的代码中,'do {//}while(0)'都可以作为一个可以单独使用的函数,也可以避免 函数的重复和语法错误。 ##Thinking 3.2 了解了二级页表页目录自映射的原理之后,我们知道,Win2k 内核的 虚存管理也是采用了二级页表的形式,其页表所占的 4M 空间对应的虚存起始地址 为 0xC0000000,那么,它的页目录的起始地址是多少呢? ###回答 设初始的物理地址为x,所以(x>>12)*4+x=0xC0000000,不难算出x>>10+x=0xC0000000,x=0xBfd00bfd ##Thinking 3.3 思考一下 tlb_out 汇编函数,结合代码阐述一下跳转到 NOFOUND 的流程? ###回答 先把CP0-EnthrHi的值存入k1寄存器,然后把a0存入CP0-EntryHi,然后利用tlbp函数判断EntryHi寄存器中是否存着能和tlb匹配的表,如果可以, 就把相应的索引值存入Index中,继续进行下面的操作。如果不可以匹配,就把Index的最高位置1,此时的Index为负数。之后将Index的值赋给k0, 则k0=0,所以就会跳转到NOFOUND函数中。 实验思路
首先是对于页表项的理解,先对于内存空间进行分配 (第一个实验)在内存分配过程中,可以发现内存的物理大小和物理位置,同时在后续的两个实验中,对物理内存 进行了分配和地址管理,难度不大,主要是理解物理内存的操作和物理内存的管理,目的还是为了后续介绍物理页表做出准备。后续两个实验我个人认为比较难,以为 页表的分配虽然不是很难理解,但是关于映射关系上我总是不能很好地处理,在后续实验中用的时间比较多。在对于物理页表的分配的实验中,先要把页表的大小和 长度进行计算,然后利用alloc来对内存和页表之间进行映射。而对于虚存和内存之间的映射,则通过页表,将虚存和页表映射,而页表和内存是映射的,所以实现了 物理内存和虚存的映射
这次的实验跟上一次的实验操作起来感觉明显不同。上次是指导书承担了大部分的实验内容,而这一次则是更多的把重心放在了我们对于代码的理解。在代码中对于重要的函数理解至关重要,而指导书中的内容则更加贴近课程的内容。