引言
听闻rCore是基于Rust实现的操作系统内核,我对此产生了兴趣并报名参加了训练营。经过三个阶段的系统学习,作为Rust语言的初学者,我掌握了Rust的基础语法特性,并深入复习了操作系统的相关概念。本文将记录我在完成第三阶段ArceOS的学习过程中,对几个较为感兴趣部分的实现理解与思考。
rename
ArceOS的虚拟文件系统(VFS)中rename功能的设计充分体现了职责分离和安全性的设计理念。该部分的核心思路是VFS层通过最长匹配原则 (find_fs_for_path) 确定路径所属的文件系统,并妥善处理跨文件系统重命名和挂载点重命名等边界情况。
VFS在此充当调度者的角色,负责将请求转发给正确的底层文件系统。而底层文件系统 (如ramfs) 则负责执行实际的重命名操作,通过Rust的读写锁机制确保重命名操作以及覆盖情况的原子性和并发安全性,这种分层设计不仅职责清晰,而且使VFS具有良好的灵活性和可扩展性。
mmap
sys_mmap实现了Linux风格的内存映射机制,其核心流程围绕地址空间管理和文件/匿名映射展开,首先检查映射长度是否为零,并将长度强制对齐到4KB页大小。若指定了addr参数则要求其必须是页对齐的。
当设置MAP_FIXED标志时,系统必须使用指定的固定地址,并校验该地址是否在合法的地址空间范围内。否则系统会在进程的地址空间中查找一块足够大的空闲区域 (通过find_free_area函数) 作为映射的起始虚拟地址。
对于匿名映射MAP_ANONYMOUS,系统仅在地址空间中分配并映射物理页,不涉及文件操作。对于文件映射,系统先执行map_alloc建立映射关系,然后通过sys_lseek调整文件偏移量,接着同步读取部分数据到缓冲区,最后通过aspace.write将数据写入新映射的虚拟地址,完成初始数据的填充。
整个设计的重点在于利用地址空间aspace抽象实现统一的虚拟内存管理和权限控制,这让我深刻理解了操作系统中抽象层的重要性。
Hypervisor
Hypervisor位于操作系统和物理机之间,将CPU、内存、磁盘、网卡等硬件资源切分成独立份额,再封装成多台虚拟计算机,每个虚拟机运行各自的操作系统和应用程序,彼此之间互不干扰。
在ArceOS的simple_hv练习中,需要实现了一个最小化的RISC-V虚拟机监视器,核心逻辑集中在vmexit_handler函数中,当客户机触发异常或SBI调用时,CPU自动陷入该函数,由宿主机快速处理并模拟所需功能。
VirtualSupervisorEnvCall是SBI调用的集中分发点,处理客户机OS的各种请求,包括printf输出、关机请求、时钟设置和SBI扩展探测等。其中putchar实时回显到宿主终端、SetTimer重写stimecmp寄存器,而SRST_SHUTDOWN在打印”Shutdown vm normally!”后停机。
整套代码虽然不足百行,却完整串联了异常捕获→寄存器改写→SBI模拟→时钟注入→正常关机的hypervisor核心流程,为学习更深层次的多核虚拟化、扩展页表(EPT)、IOMMU等高级虚拟化技术打下了基础。