1.用户态堆栈的实现
①创建一个用于的page directory,并存放在thread结构中.
②创建一个page,并与PHY_BASE - PGSIZE地址相关的pde,pte相关联。这样堆栈就建立在了0xc0000000之前
③返回0xc0000000地址
注意:这里的内容是比较难理解的,因此有几个概念要明白。
①palloc得到的地址均在0xc0000000之后的虚拟地址,通过它以及pd,pt可以得到真实的物理地址。并且仅有在内核态时,也就是cr3指向init_page_dir时,物理地址可以通过虚拟地址-0xc0000000实现。
②虚拟地址到物理地址的计算,是通过pd[虚拟地址的前12位]再映射到pt,再映射到page实现的。当然在用户态时,pd不是init_page_dir这个值。
③palloc出来的地址都是0xc0000000之后的虚拟地址,而这个地址其实就是物理地址+0xc0000000得到的。那么如何用这一地址与用户态的地址相关联呢?也就是前面的②是如何完成的,其实现方式就是pagedir_set_page函数,首先用用户态的pd,以及用户态的addr,找到用户态的pte(在这过程中可能要创建pt),然后将palloc得到的page生成一个用户态的pte存到刚刚所找到的用户态pte上即可。
2.Page directory
pagedir_create
①为pd分配一个空间。
②将pd中的内容填充为init_page_dir的内容
Lookup_page
①根据vaddr与pd找到pde
②如果pde为0,且需要create,创建一个pt,并为pde赋值
③返回vaddr对应pte
pagedir_set_page
①调用Lookup_page找到upage对应的pte
②通过kpage生成相关的user的pte的值,这种生成方法,具体如下:
将kpage的0xc0000000以上的地址转化为用户区的地址,
网友评论