这是 os summer of code 2020 项目每日记录的一部分:
每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
这里参考的是rCore tutorial的第三版:https://github.com/rcore-os/rCore-Tutorial
lab2 学习报告
这部分的代码从上一章 lab1 的代码开始完成:
这一章的实验指导中:
- 实现动态内存的分配
- 了解
QEMU
虚拟的物理内存机制 - 通过页的方式对物理内存进行管理
lab2 的代码主要在 memory 文件夹中;算法部分在 algorithm 文件夹中
动态内存分配
我们的内核中也需要动态内存分配,典型的应用场景有:
Box<T>
,类似malloc
有;- 引用计数
Rc<T>
,原子引用计数Arc<T>
,主要用于在引用计数清零,即某对象不再被引用时,对该对象进行自动回收; - 一些 std 中的数据结构,如 Vec 和 HashMap 等。
需要实现 Trait GlobalAlloc
:
将这个类实例化,并使用语义项 #[global_allocator] 进行标记。
为了实现 Trait GlobalAlloc,需要支持这两个函数:
unsafe fn alloc(&self, layout: Layout) -> *mut u8;
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout);
例如 memory/heap2.rs :
/// 利用 VectorAllocator 的接口实现全局分配器的 GlobalAlloc trait
unsafe impl alloc::alloc::GlobalAlloc for Heap {
unsafe fn alloc(&self, layout: core::alloc::Layout) -> *mut u8 {
let offset = (*self.0.get())
.as_mut()
.unwrap()