【问题标题】:The relationship between kernel mode and kernel space, user mode and user space?内核态与内核空间、用户态与用户空间的关系?
【发布时间】:2019-05-23 16:20:04
【问题描述】:

Linux中的虚拟内存可以分为两部分:用户地址空间和内核地址空间。

根据权限级别,任务在内核模式或用户模式下工作。

但是考虑到i386arch,内核态和内核地址空间、用户态和用户地址空间有什么关系呢?

【问题讨论】:

  • 这太宽泛了:很多 Linux 版本在很多架构上运行,而且它们可能并不都使用相同的设计。细节可能会有所不同,例如处理器是否对页表条目进行特权级访问检查,或者用户模式和内核模式是否具有不同的页表(对于用户模式线程的活动页表中缺少内核内存区域的条目)跨度>
  • @Ben Voigt,谢谢,我刚刚更新了 i386 拱门的问题。根据您的评论,这是否意味着内核模式和内核地址空间之间没有强制关系?
  • 您会发现一些带有“内存保护单元”而不是“内存管理单元”的嵌入式系统不支持虚拟内存,只会使非特权代码无法访问系统的某些区域。但是对于现代操作系统和随附的内存虚拟化硬件,这种关系 100% 由操作系统软件控制。它可以将内核内存页面映射到进程中(例如 /dev/kmem 上的 mmap)。它可以将一个进程的页面映射到另一个进程(共享内存)。甚至地址空间的划分也只是一种约定,目的是减少碎片,便于识别。
  • @Ben Voigt,谢谢。我刚刚发现用户模式和内核模式是不同的状态,根据“cs”寄存器具有与操作系统资源有关的不同权限。该模式与虚拟内存的空间分割约定无关。如果上面的结论是正确的,这意味着当进程陷入内核态时,它可以访问所有的虚拟空间,无论是用户空间还是内核空间。用户模式也是如此吗?还是用户态无法访问内核空间?这是我的困惑点。
  • @Ben Voigt,从技术上讲,当进程在用户模型中时,它只能访问用户地址空间,因为当该段在内核地址空间中时,段描述符字段 的 DPL 应该为 0,对吧?如果是,则用户态进程的 RPL 为 3,即 DPL 设置为 0 时无法访问该段。但是,为什么陷入内核态的进程不能直接访问用户空间,但是使用 highmem 作为用户空间的映射?有什么意义?

标签: linux linux-kernel kernel


【解决方案1】:

根据cmets和个人研究,一般内核态和内核地址空间、用户态和用户地址空间之间没有强制关系。对于现代操作系统(Linux),这种关系 100% 由操作系统软件控制,该软件可以映射内核模式可以访问的用户地址空间,通常使用 highmem。
基本上,虚拟内存空间的划分是一种约定,可以减少碎片并在编程时易于识别。对于 86x86 拱门,确实存在基于以下事实的“关系”。

  1. 当任务被捕获到内核模式时,cs 寄存器中的CPL 被设置为0,这意味着最高权限。从技术上讲,它可以访问所有的虚拟内存空间。一种映射,通常是 highmen,用于使内核安全地访问用户地址空间。
  2. 当任务处于用户模式时,cs 寄存器中的CPL 设置为3,这意味着最低权限。它只能访问DPL字段为3的段。但是,内核地址空间中的段都被0 DPL 填充,这意味着用户模式任务没有访问权限。 这两点不考虑RPL,应该只有DPL >= max(RPL,CPL)段可以访问的条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多