|
|
|
@ -305,7 +305,7 @@ load_user_program()函数对于应用进程逻辑空间的操作可以分成以
|
|
|
|
|
|
|
|
|
|
- uint64 lookup_pa(pagetable_t pagetable, uint64 va);
|
|
|
|
|
|
|
|
|
|
查找逻辑地址va所对应的物理地址pa。如果没有与va对应的物理页面,则返回NULL;否则,返回va对应的物理地址。
|
|
|
|
|
查找逻辑地址va所在虚拟页面地址(即va将低12位置零)对应的物理页面地址。如果没有与va对应的物理页面,则返回NULL;否则,返回va对应的物理页面地址。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -774,7 +774,7 @@ System is shutting down with exit code 0.
|
|
|
|
|
|
|
|
|
|
这里,我们找到了之前运行./obj/app_sum_sequence出错的地方,我们只需要改正这一错误实现缺页处理,使得程序获得正确的输出就好。实现缺页处理的思路如下:
|
|
|
|
|
|
|
|
|
|
- 通过输入的参数stval(存放的是发生缺页异常时,程序想要访问的逻辑地址)判断缺页的逻辑地址在用户进程逻辑地址空间中的位置,看是不是比USER_STACK_TOP更大,且比我们预设的可能的用户栈最大空间小(这里,我们可以给用户栈一个上限,例如20个4KB的页面);
|
|
|
|
|
- 通过输入的参数stval(存放的是发生缺页异常时,程序想要访问的逻辑地址)判断缺页的逻辑地址在用户进程逻辑地址空间中的位置,看是不是比USER_STACK_TOP小,且比我们预设的可能的用户栈的最小栈底指针要大(这里,我们可以给用户栈空间一个上限,例如20个4KB的页面),若满足,则为合法的逻辑地址(本例中不必实现此判断,默认逻辑地址合法)。
|
|
|
|
|
- 分配一个物理页,将所分配的物理页面映射到stval所对应的虚拟地址上。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|