美文网首页
Pintos源码学习进度(7)

Pintos源码学习进度(7)

作者: speakspeak | 来源:发表于2019-05-17 08:58 被阅读0次

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以上的地址转化为用户区的地址,

相关文章

网友评论

      本文标题:Pintos源码学习进度(7)

      本文链接:https://www.haomeiwen.com/subject/afvpaqtx.html