在用户模式下如何进行地址转换?如果用户有单独的页表,那么它们存储在哪里?此外,在具有硬件页表遍历机制的系统中,用户将如何访问存储在内核地址空间中的页表?
答案1
内核为每个进程设置页表。从虚拟地址到物理地址的映射是由硬件中的内存管理单元(MMU)完成的。这对于用户模式代码来说是透明地完成的。用户模式不会更改页表,并且它们仅对内核可见。
进程的虚拟地址空间被划分为具有不同属性的区域:一些区域是只读的,一些区域是读写的,并且通常大多数虚拟地址根本没有映射。访问冲突由内核处理。例如,当进程访问没有映射到物理内存帧的内存位置时,就会引发异常。该异常(陷阱)由内核代码处理,内核代码可以终止进程,向其发送信号,或者内核可以透明地为页面创建映射。
透明地(对于用户模式代码)映射页面可能会发生,因为页面已被换出。在这种情况下,所谓的页面错误处理程序将页面映射到空闲的物理 RAM 帧,并安排从交换空间读入页面。当页面恢复后,进程被安排再次运行,并且进程可以继续执行,就好像什么也没发生一样。