diff --git a/source/_posts/2024A-stage4-arceos-unikernel1-Martin1847.md b/source/_posts/2024A-stage4-arceos-unikernel1-Martin1847.md index e571146245..f5401b7be3 100644 --- a/source/_posts/2024A-stage4-arceos-unikernel1-Martin1847.md +++ b/source/_posts/2024A-stage4-arceos-unikernel1-Martin1847.md @@ -42,12 +42,29 @@ tags: 这一块也是非常复杂的点。 -TODO +印象比较深刻的是三级页表的内存占用,以及`mmap`的实现。通过`mmap`可以从内核申请共享内存、或者映射文件,减少系统调用次数。这里也是默认`lazy init`,用到的时候通过缺页中断去真正完成映射。 + +通过分页`PTE`也很好了保护了内存安全,是否可执行。 + +![riscv-sv39-pte](https://rcore-os.cn/rCore-Tutorial-Book-v3/_images/sv39-pte.png) + +另外一点就是内存分配算法,内存本质就是一个大的`byte[]`,找到一个可用的(按页不按页都可以)地址,也即`index`返回即可。 + +开启分页后`MMU`会进行更多安全检查。比如“数据执行保护”(Data Execution Prevention, DEP)或“不可执行位”(No-eXecute, NX),CPU碰到不可执行的代码区,会触发异常。起到防注入、溢出等的保护。 + + ## 文件系统虚拟化 了解了ELF文件格式,静态link,动态link,以及文件inode的底层细节。 -TODO - 设计一个高效的文件系统是个复杂的工程,本质根内存分配一样,要减少内部碎片、外部碎片,而磁盘访问速度远远不及内存,真是一件复杂的事情。 + +# 总结 + +计算机没有魔法。通过这阵子的学习,对于CPU、内存如何协同工作加深了理解。 +哪些是硬件的支持,哪些是OS的抽象、编译器的辅助,有了更深刻的认识。 +比如栈的处理,编译器处理函数上下文、OS初始化栈、CPU提供栈指针寄存器,共同协作完成。 +这是一次很好的练习,对于从最底层看本质非常有帮助。 + +感谢清华大学的主办,感谢各阶段的老师们的指导!