rcore ch2 学习笔记

应用管理器 AppManager

在 ch2 的批处理操作系统中,batch 模块中定义了一个应用管理器 AppManager

1
2
3
4
5
struct AppManager {
num_app: usize,
current_app: usize,
app_start: [usize; MAX_APP_NUM + 1],
}
  1. lazy_static!

lazy_static! 宏将静态的 AppManager 实例 APP_MANAGER 包裹起来,效果是仅在使用 APP_MANAGER 时,才运行其初始化代码。

  1. run_next_app() 中的 drop()

    • 该函数最终调用 __restore(),不会返回,因此,app_managerdrop 方法不会被调用。
    • APP_MANAGER 的类型是 UPSafeCell<AppManager>,该类型基于 RefCell<T> 实现:

    1
    2
    3
    4
    pub struct UPSafeCell<T> {
    /// inner data
    inner: RefCell<T>,
    }

    • 获取 app_manager 时调用了 APP_MANAGER.exclusive_access(),内部实现为 RefCell<T> 中的 borrow_mut()

    1
    2
    3
    4
    5
    6
    7
    impl<T> UPSafeCell<T> {
    ...
    /// Panic if the data has been borrowed.
    pub fn exclusive_access(&self) -> RefMut<'_, T> {
    self.inner.borrow_mut()
    }
    }

    • app_manager 的在它离开作用域(run_next_app() 函数体)时不被调用,则下次调用 APP_MANAGER.exclusive_access() 时,其内部 RefCell<T> 的可变引用数将大于 1,从而触发 panic!()

    • 因此需要手动调用 drop(),将 app_manager 所占有的可变引用计数释放。

  2. core::mem::drop() 的实现原理

    core::mem::drop() 实现为:

    1
    2
    3
    4
    #[inline]
    #[stable(feature = "rust1", since = "1.0.0")]
    #[cfg_attr(not(test), rustc_diagnostic_item = "mem_drop")]
    pub fn drop<T>(_x: T) {}

    即一个空函数,将参数变量所有权移入,而后在退出 drop() 函数时调用 _xdrop() 方法。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!