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 协议 ,转载请注明出处!