Lab2 PART3 Kernel Address Space

 Kernel Address Space

   阅读了官网里lab2 part3内核地址空间的部分内容,发现自己搞混了内核地址空间和内核。我的理解是从0x00100000开始载入的内核指的是内核代码相关的部分,是物理空间。内核地址空间是虚拟地址空间,内核和用户进程只能访问各自的地址空间。

   有关于内核地址空间和用户进程空间的划分可以见下图。内核地址空间和用户进程地址空间以ULIM为划分,高地址部分是内核地址空间,低地址是用户进程地址空间。用户不能访问高于ULIM部分的地址空间,而内核和用户对于[UTOP,ULIM]有相同的访问权限,只能读不能写。这一部分通常是被用于把一些只读内核数据结构暴露给用户地址空间的代码。在UTOP以下的部分,用户进程可进行修改。

Exercise 5

继续完善mem_init()函数,你的程序现在必须能够通过check_kern_pgdir()和check_page_installed_pgdir()函数的检测。

根据mem_init()中的注释,剩余的代码需要完成的功能就是把操作系统中一些重要的地址范围映射到kern_pgdir上。


        boot_map_region(kern_pgdir,UPAGES,PTSIZE,PADDR(pages),PTE_U|PTE_P);
     
        boot_map_region(kern_pgdir,KSTACKTOP-KSTKSIZE,KSTKSIZE,PADDR(bootstack),PTE_W|PTE_P);

        boot_map_region(kern_pgdir,KERNBASE,0xffffffff-KERNBASE,0,PTE_W|PTE_P);

我觉得主要难点在于boot_map_region函数中参数size的选择,但是结合上面的虚拟空间图应该就很好理解了。除此之外,遇到了一个bug: 怎么想都觉得传参没错,于是又返回去看boot_map_region的代码,发现可能是漏了一种情况,即size并非PGSIZE的整数倍,导致有一部分物理空间没有映射成功,于是修改boot_map_region的代码(在上一篇博客中更改好了),成功了。

最后实验结果:

Exercise 5完成啦。

QUESTION

2.第二问没看懂...卡一下

3.我们已经把内核和用户环境放在一个相同的地址空间中。为什么用户程序不能读取或写入内核的内存空间?有什么机制保护内核地址空间。

因为在页表项中有读写保护位,并且PTE_U区分内核和用户。一般的操作系统是通过分段和分页两个机制来保护的,但是JOS中没有实现分段功能,所以就是通过分页来进行保护的。

4.这个操作系统可以支持的最大的物理内存是多少?

2GB。因为这个操作系统中利用了大小为 4MB的UPAGE空间来存储PageInfo,而每一个PageInfo的大小是8B,因此可以存放512K个PageInfo。每一个PageInfo对应一个物理页,大小为4KB,所以总共物理内存为4KB X 512K = 2GB。

5.假设现在的物理内存页达到了最大个数,那么管理这些内存所需要的额外空间开销是多少?

所有的PageInfo = 4MB  +  kern_pgdir = 4KB  + 当前页表2MB。

6.回顾entry.S文件中,当分页机制开启时,寄存器EIP的值仍旧是一个小的值。在哪个位置代码才开始运行在高于KERNBASE的虚拟地址空间中的?当程序位于开启分页之后到运行在KERNBASE之上这之间的时候,EIP的值是小的值,怎么保证可以把这个值转换为真实物理地址的?

啊这个lab1里好像有做到,也还是先卡一下把...毕竟lab1好像没掌握好...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值