rcore ch2 学习笔记
应用管理器 AppManager
在 ch2 的批处理操作系统中,batch
模块中定义了一个应用管理器 AppManager:
1 | |
lazy_static!宏
lazy_static! 宏将静态的 AppManager 实例
APP_MANAGER 包裹起来,效果是仅在使用
APP_MANAGER 时,才运行其初始化代码。
run_next_app()中的drop()- 该函数最终调用
__restore(),不会返回,因此,app_manager的drop方法不会被调用。 APP_MANAGER的类型是UPSafeCell<AppManager>,该类型基于RefCell<T>实现:
1
2
3
4pub struct UPSafeCell<T> {
/// inner data
inner: RefCell<T>,
}- 获取
app_manager时调用了APP_MANAGER.exclusive_access(),内部实现为RefCell<T>中的borrow_mut():
1
2
3
4
5
6
7impl<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所占有的可变引用计数释放。
- 该函数最终调用
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()函数时调用_x的drop()方法。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!