关于walk函数
首先返回的是第三层页表的页表项目,一页页表的大小是和一页物理内存的大小一致的,所以当他发现该页表项不存在的时候,是可以用kalloc去分配一页新的物理页给这一个页表项的,也就是页表层级关系是可以在这里建立的。
建立流程就是首先拿到的是根页表么(用p3、p2、p1表示),那么就是拿到p3,首先在根找到项,然后如果没有分配,kalloc一个页表,并且设置pet,这时候拿到p2,往下同理。所以最后我们能够设置好页表层级。
关于mappages函数
主要就是如果是walk建立的,都是全新的页表(所谓以页来分配)。这里有点怪,就是walk返回最后的页表项,把这个项目设置为相应物理地址之后,因为off是12位的缘故,那么也刚好就是4K的大小的物理内存,所以也是a与pa+=4096的原因。然后这边物理内存分配的方式就有点搞不清楚。回头可能还需要看看kalloc的逻辑。