内存管理

NUDT-OS使用地址空间来显式地保证进程的隔离性,同一进程中的多个线程共享地址空间,但是具有独立的用户栈和内核栈。多个内核线程共享内核地址空间。一个地址空间包含两个部分:

  • 一个连续内存区域的队列:一个地址空间中包含多个连续的虚拟内存区域

  • 一张页表:页表中存储了进程自己的虚拟内存到物理内存的映射关系

借助于x86的页式内存管理机制,cr3寄存器中存放了四级页表的起始物理地址。进程切换时,将cr3寄存器载为进程自己的四级页表起始物理地址,即实现了地址空间的切换。

/// 将自己的页表写入cr3寄存器
pub fn activate(&self) {
    my_x86_64::set_cr3(self.pt.root_pa.0);
}

由于每个进程都有自己的映射关系,所以不同的进程可以使用相同的虚拟地址,例如每个用户进程的用户栈地址都相同:

/// 用户栈顶虚地址
pub const USTACK_TOP: usize = 0x8000_0000_0000;

下面分别介绍内存分配器、页表、和地址空间抽象。