rust写操作系统 rCore tutorial 学习笔记:实验指导二 内存分配与管理

这是 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值