Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions source/_posts/学习心得.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: 学习心得
date: 2025-11-16 13:50:39
tags:
---

## 引言

听闻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等高级虚拟化技术打下了基础。