File tree Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Expand file tree Collapse file tree 1 file changed +3
-3
lines changed Original file line number Diff line number Diff line change 6060
6161 可以看到,我们最先进行了全局动态内存分配器的初始化,因为接下来马上就要用到 Rust 的堆数据结构。接下来我们初始化物理页帧管理器(内含堆数据结构 ``Vec<T> `` )使能可用物理页帧的分配和回收能力。最后我们创建内核地址空间并让 CPU 开启分页模式, MMU 在地址转换的时候使用内核的多级页表,这一切均在一行之内做到:
6262
63- - 首先,我们引用 ``KERNEL_SPACE `` ,这是它第一次被使用,就在此时它会被初始化,调用 ``MemorySet::new_kernel `` 创建一个内核地址空间并使用 ``Arc<Mutex <T>> `` 包裹起来;
63+ - 首先,我们引用 ``KERNEL_SPACE `` ,这是它第一次被使用,就在此时它会被初始化,调用 ``MemorySet::new_kernel `` 创建一个内核地址空间并使用 ``Arc<UPSafeCell <T>> `` 包裹起来;
6464- 接着使用 ``.exclusive_access() `` 获取一个可变引用 ``&mut MemorySet `` 。需要注意的是这里发生了两次隐式类型转换:
6565
6666 1. 我们知道 ``exclusive_access `` 是 ``UPSafeCell<T> `` 的方法而不是 ``Arc<T> `` 的方法,由于 ``Arc<T> `` 实现了 ``Deref `` Trait ,当 ``exclusive_access `` 需要一个 ``&UPSafeCell<T> `` 类型的参数的时候,编译器会自动将传入的 ``Arc<UPSafeCell<T>> `` 转换为 ``&UPSafeCell<T> `` 这样就实现了类型匹配;
8383 let satp = self.page_table.token();
8484 unsafe {
8585 satp::write(satp);
86- asm!("sfence.vma" :::: "volatile" );
86+ asm!("sfence.vma");
8787 }
8888 }
8989 }
119119 // os/src/mm/memory_set.rs
120120
121121 pub fn remap_test() {
122- let mut kernel_space = KERNEL_SPACE.lock ();
122+ let mut kernel_space = KERNEL_SPACE.exclusive_access ();
123123 let mid_text: VirtAddr = ((stext as usize + etext as usize) / 2).into();
124124 let mid_rodata: VirtAddr = ((srodata as usize + erodata as usize) / 2).into();
125125 let mid_data: VirtAddr = ((sdata as usize + edata as usize) / 2).into();
You can’t perform that action at this time.
0 commit comments