【问题标题】:role of code segment registers in system calls代码段寄存器在系统调用中的作用
【发布时间】:2012-07-08 03:43:04
【问题描述】:

进行系统调用时,是否使用代码段寄存器或控制寄存器检查特权级别?

intel cpus 中的代码段寄存器用于分段目的。我不清楚 linux 中如何处理分页和 intel x86 机制。

如果有人解释了在针对级别更改进行系统调用时cpu中发生的情况,那将是非常有帮助的。

【问题讨论】:

    标签: linux


    【解决方案1】:

    Linux 从未使用 286 样式的分段来分隔进程,或者以其他方式使虚拟内存有趣地分段,而是从一开始就使用 386 样式的分页。转移到内核模式(syscall)曾经是一个简单的int指令,它根据中断表转移执行并导致CPU进入内核模式(保护级别0)。然而,CPU 仍然必须重新加载段描述符以“了解”新的保护级别以及新段的位置(尽管它始终是 CPU 只是“不知道”的同一个虚拟内核模式段。)。

    AMD 和 Intel 提出 optimized instructions 来加快这个过程,这也是这个平台上所有操作系统在现实中使用的。

    内核代码必须做更多的工作来将寄存器保存在堆栈上并将它们初始化为新值,而这并没有改变。但这通常不被理解为系统调用过程的一部分。

    进行系统调用时,是否使用代码检查特权级别 使用段寄存器还是控制寄存器?

    特权级别是获得,未检查,从通过中断表引用的代码段 - 或者,在优化的情况下,预加载到一个 MSR(非内核代码无法访问的 CPU 寄存器)。

    另一种说法是,切换到级别 0 会在 CPU 级别自动发生,但段描述符和/或 MSR 需要由内核预先安排,从而真正导致内核执行陷阱处理程序和不仅仅是一般的保护故障。

    【讨论】:

    • 我还有一个 double.is 内核模式在 linux 中使用系统调用进入内核模式的同一进程地址空间中,还是内核代码是完全不同的进程?
    • @vindhya - 进程和地址空间是不同的东西。地址空间主要由 CPU 提供。进程由操作系统提供;每个进程由地址空间、内核模式堆栈空间、打开文件表等组成。两个进程的地址空间完全重叠(如果它们只是您所谓的“同一进程”的线程),或者部分重叠,所有内核内存始终映射到相同的地址,但不能从用户模式访问。系统调用不改变进程,也不改变地址空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2013-08-25
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多