Open utterances-bot opened 1 year ago
在使用高级语言编写用户程序的时候,手动用嵌入汇编的方法随机访问一个不在当前程序逻辑地址范围内的地址,比如向该地址读/写数据。该用户程序执行的时候可能会生什么? 可能会报出缺页异常.
缺页异常是否有些不合适呢?题设给出的是访问超出当前程序逻辑地址范围内的地址,那么这种访问会在MMU进行逻辑地址检查时候就会出现异常,这种异常叫做内存异常是否会更好一些呢?
为何使用虚拟内存之后 sys_get_time 会失效?我理解 sys_get_time 最终只是读取 0xC01 的CSR,并没有读写内存的操作,不太理解?
为何使用虚拟内存之后 sys_get_time 会失效?我理解 sys_get_time 最终只是读取 0xC01 的CSR,并没有读写内存的操作,不太理解?
我之前看漏了,原来 sys_get_time 是有一个指针参数的 😂 还有一个疑问就是编程题第二题 “任务和操作系统内核共用同一张页表的单页表机制”,按照我的理解是不是就只能放到同一个地址空间里了?让不同的任务用不同的区域,这样好像就变回了第四章之前的物理内存布局
@kayoch1n 不是的,是说每个进程一个页表,低地址空间为应用的数据,高地址空间为内核的数据。所有进程共享高地址空间的内核数据,但低地址空间的应用数据每个应用是不同的。
页式虚拟存储还可以同时解决内存外碎片。提高空间利用率。
这个说法是否不太严谨?页式虚存能够解决外碎片,但是只能在一定程度上缓解内碎片的产生,但不能根治吧,它相对于固定分区的情形肯定是在内碎片上优化了很多,但还是会有内碎片。
@chestNutLsj 确实不太严谨,已修改。
问答题第五题,页目录表(一级页表)不应该一直长驻内存吗,二级、三级也变可能会缺页,但一级页表不会发生缺页吧
我想请问一下,我该怎么触发缺页异常呢,按照我的理解我们在qemu上模拟的时候都没有单独模拟磁盘,我现在想通过使用有效位和第54位(预留位)来表示页面是否位于内存中,但是使用预留位之后我在更新TLB的sfence.vma指令处,程序就没法执行了,感谢解答
第6题实现自映射页表
完成后可以正常运行, 但并没有手段来验证(比如用虚拟地址找到自映射的页表项), 一开始以为是PTEflags的问题, 所以在构造中间pte时加上了U和R, 但这样user app会直接hang住, 如果不加直接访问页表对应的虚拟地址则触发page_fault, 使用gdb进入user app后也无法通过memory查看(cannot access address)
这样看是不是用户态就是没有手段来访问页表的? 那么自映射以后, 尤其是给页表和页表项都map了虚地址又用不上, 感觉没有意义?
重新思考了下, 参考了rcore自映射和这里的实现, 都不太正确, 在L2页表里增加recursive_index+1的entry的方式只能提供L2页表本身的访问, 并不能访问L1和L0; 且这是在牺牲了整个(recursive_index+1, .., .., ..)的空间下做到的, 不太优雅(相比于x86的自映射)
练习参考答案 - rCore-Tutorial-Book-v3 3.6.0-alpha.1 文档
http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter4/9answer.html