【问题标题】:When and how CPL field changes?CPL 字段何时以及如何更改?
【发布时间】:2017-01-09 18:33:59
【问题描述】:

处理器在 CPL 字段中保持当前特权级别。我想知道当 CPL 字段从 3 变为 0 时所有可能的情况,反之亦然。例如,当用户进程调用系统调用时,CPL 字段可能会从 3 变为 0。

此外,请尝试详细说明在更改 CPL 字段之前内核/CPU 内部发生的情况。

注意:我阅读了几篇文章,解释了 CPU 如何使用 CPL、RPL 和 DPL 实施保护。我无法理解 CPL 何时以及如何更改。

【问题讨论】:

  • 您希望我们仅引用有关 CPL 领域的参考手册吗?还是什么?

标签: linux-kernel x86 cpu


【解决方案1】:

这是一个非常深入的问题。答案取决于您正在查看的内核。通常,CPL 只会在上下文切换(可能是从内核到用户空间的初始切换)和系统调用期间发生变化。

内核需要在全局描述符表中设置用户模式 ​​(CPL 3) 段。然后将段选择器(CS、DS、ES、FS、GS)设置为 CPL=3 段值。

这是一个很好的参考:http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection/

还可以查看英特尔手册。 https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html(特别是第 3A 卷,第 5-7 页是您要查找的内容)

【讨论】:

  • 这是标记为 linux-kernel。您是指不同的 Linux 内核版本还是自定义补丁?还是您的意思是 amd64 与 i386 内核? (32位内核支持vm86模式...)
  • 啊,没注意到 linux-kernel 标签。我是从 x86 标签来到这里的(今天才加入 SO,请见谅)。我想在 linux 中,是的,唯一的区别是 64 位和 32 位之间。我不确定 CPL 更改会受到多少影响,因为我相信段描述符表仍在 x86_64 中使用,但我必须回去查看英特尔手册。就其他内核而言,微内核与单体内核会对 CPL 更改发生的时间产生一些影响,具体取决于用户空间与内核空间中的系统进程。
  • 是的,x86_64 仍然需要 GDT。 32 位用户空间与 64 位用户空间有不同的条目,因为 long 与 compat 模式,地址大小等由 CS 索引的段描述符确定。欢迎来到 SO,顺便说一句:)
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2021-06-09
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多