linux-kernel - 什么是 CPU 内核/特权模式,操作系统如何保护它?

标签 linux-kernel cpu elf virtual-memory

In Kernel mode, the executing code has complete and unrestricted access to the underlying hardware. It can execute any CPU instruction and reference any memory address

有什么例子吗?比如什么指令,什么内存地址?(最好是x86)。至于内存,是指为内核保留的高1GB地址(32位)吗?此外,谁来决定这个?是CPU还是操作系统?如果是操作系统,CPU 如何知道内存的哪一部分被认为是保留的(可能是页表中的某个位)?以及如何在内核模式下访问内存,仍然是通过虚拟地址?

至于进入内核模式,是通过int这样的指令完成的吧?我理解所有系统调用都受到严密保护的部分,但是如果我用包含 int 指令的汇编代码编写程序怎么办?那是怎么守的?我的意思是当那个程序被编译时,最终我得到了一个可执行文件,int 指令必须在 '.text' 部分,因为编译器不会对此做任何事情,对吗?那么操作系统在运行时如何处理它呢?或者“.text”部分确实有什么?是 CPU 识别的指令,还是它仍然是某种中间格式,将由操作系统“翻译”,因此操作系统将有机会“拒绝”某些指令,如“int”或其他任何“CPU 运行之前受限的指令?

更新: 对于任何感兴趣的人,这里有一个来自 quora 的很好的解释(至少对我而言):https://www.quora.com/What-is-CPU-kernel-mode-and-how-is-it-guarded-by-the-OS/answer/Mostafa-Abd-El-Aziz?snids=937993065&nsrc=1&filter=all

最佳答案

我们拥有内核模式的原因是保护进程不受彼此和自身的影响。 (冒着过度简化的风险)每个进程都将其地址空间划分为用户区域和内核区域。用户区域仅(有一些异常(exception))属于该进程。所有进程共享相同的系统区域。

将对系统区域的访问限制为内核模式可以保护它免受在用户模式下运行的恶意进程的侵害。

所有进程都需要与内核进行通信。这样做的过程要么是中断,要么是异常。两者的处理方式相同,不同之处在于它们的触发方式。

内核通过调度表(使用各种名称)定义进入自身的路径。异常和中断的编号是表中的索引,表中包含处理特定事件或服务的函数地址。

例子:

如果你想做 I/O,你的 fprintf 语句最终会转化为一个用户模式包装函数(系统服务),它以定义的方式设置堆栈和注册。该系统服务触发异常。调度表将其发送到正确的内核模式处理程序,以处理对磁盘的写入(通常是一般写入)。

内核模式处理程序需要仔细验证发送给它的所有参数。寄存器值是否正确?所有对内存的引用都有效并且在用户区域中吗?此处的任何验证漏洞都可能导致系统损坏。

内核态函数使你要写入的数据在正确的位置发送到磁盘。

您的问题:

As for entering kernel mode, it is done by certain instructions like int right?

是的。还有异常,例如被零除、页面错误。恕我直言,英特尔 INT 指令是一个异常生成器,而不是通常描述的软件中断。让您进入内核模式的三件事是:

  1. 中断(异步事件)
  2. 陷阱(INT 导致陷阱)
  3. 错误(可以纠正并允许重新选择导致它们的指令的异常)

I understand the part the all the system calls are heavily guarded, but what if I write a program in assembly code, which includes the int instructions?

您的应用程序通过调度表进行路由。在那里调用的函数应该捕获无效调用。

How is that guarded? I mean when that program is compiled, and eventually I got an executable file, the int instruction has to be in the '.text' section, coz the compiler won't do anything about it right? So what does OS do about it when it runs? Or what's in the '.text' section indeed? Is it THE instructions that are recognised by CPU, or maybe it's still some intermediate format, that would be 'translated' by the OS, so the OS would have a chance to 'reject' certain instructions like 'int', or whatever other 'restricted' instructions before it runs by CPU?

它受到 1) 强制您转到调度表中的处理程序和 2) 处理程序进行适当验证的保护。

关于linux-kernel - 什么是 CPU 内核/特权模式,操作系统如何保护它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28312819/

相关文章:

gcc - OpenCL,这是正常的执行时间吗?

检查CPU型号以执行特定的C代码

c - 列出当前运行进程的符号

linux-kernel - Bootargs 格式以启用 Linux 内核模块的动态调试

c - 如何测试我的驱动程序是否已加载,然后从 Linux 内核访问我的驱动程序功能?

linux - copy_to_user 和 copy_from_user 结构

c - mmap 加载共享对象并获取函数指针

linux - 负责配置进程数和线程数的Linux配置参数有哪些?

java - Runtime#availableProcessors() 在 Linux 服务器上没有返回正确的结果

assembly - 为什么编译这个简单的汇编代码并链接到 ELF 会导致比平面二进制文件更大的大小?