【发布时间】:2020-08-14 13:57:20
【问题描述】:
假设 CPU 处于保护模式:
当一个 ring-0 内核建立一个 ring-3 用户空间进程时,它必须修改哪个 CPU 级数据结构以指示 这个特定 进程可以访问哪个虚拟地址空间?
是否只是将全局描述符表中所有其他内存段的特权位设置为(环)0?
【问题讨论】:
标签: process kernel cpu osdev gdt
假设 CPU 处于保护模式:
当一个 ring-0 内核建立一个 ring-3 用户空间进程时,它必须修改哪个 CPU 级数据结构以指示 这个特定 进程可以访问哪个虚拟地址空间?
是否只是将全局描述符表中所有其他内存段的特权位设置为(环)0?
【问题讨论】:
标签: process kernel cpu osdev gdt
每个进程都有一组它使用的页表。在 x86 上,这意味着带有一些页表的页目录。页目录的地址将在 CR3 寄存器中。每组页表都将映射内核(具有内核权限),因此当您进行系统调用时,内核可以访问它自己的页面。用户进程无法访问这些页面。当您进行上下文切换时,您将 CR3 寄存器中的地址更改为将要执行的进程的页表。因为每个进程都有一组不同的页表,所以它们每个都有不同的内存视图。为了确保没有两个进程可以访问相同的物理内存,您应该有某种物理内存管理器,可以查询尚未映射到任何其他页表中的全新内存区域。
因此,只要每个 Process 结构跟踪它自己的页表结构,您唯一需要修改的 cpu 级数据结构就是 CR3 寄存器。
【讨论】:
似乎全局描述符表 (GDT) 提供了一种可以与分页结合使用的分段机制,但现在被认为是遗留的。
通过将页面目录地址加载到CR3控制寄存器中,Ring 3进程被限制在分页机制定义的线性内存中。 CR3 只能从 Ring 0 更改:
在保护模式下,CS 寄存器中的 2 个 CPL 位指示 CPU 处于哪个环/特权级别。
更多:
【讨论】: