【发布时间】:2021-02-15 01:00:14
【问题描述】:
我正在尝试了解 ring 3 到 ring 0 传输在操作系统中的工作原理。
我想我了解系统调用的工作原理。
我的理解是,当用户模式程序想要进行系统调用时,它会设置调用参数并发送一个 INT,它将控制权转移到操作系统,然后操作系统将读取参数,完成这项工作,然后将控制权返回给用户程序。还有更优化的 sys enter arm sys exit 变体。
如果用户自愿调用系统调用,这一切对我来说都是有意义的。
但是,为了保证安全,操作系统不能假设调用者会使用系统调用来访问资源。
我的问题是——如果用户程序直接尝试直接访问资源(磁盘)而不涉及操作系统会发生什么。
操作系统如何拦截它?
【问题讨论】:
-
你会如何假设用户程序“直接尝试访问磁盘”?怎么表达?
-
我假设设备驱动程序只是在执行一些 CPU 指令来写入磁盘或向磁盘发出信号,如果用户程序直接执行该指令会怎样?操作系统如何保证安全?
-
在 x86 上,I/O 端口可以限制在 ring 0,并且 I/O 地址空间不需要包含在 ring 3 地址空间中。因此,没有用户模式可以执行的指令来寻址设备。这是任何硬件上内核/用户分离的基本方面:内核可以控制用户模式可以做什么。
-
谢谢!我只是碰巧阅读了Linux设备驱动程序书中关于IO端口的章节,所以我理解你的说法。但是,我有一个问题——什么要求用户程序使用 IO 端口来写入设备?为什么用户程序不能只通过 OS 和 IO 端口,在用户空间程序本身实现 IO 端口功能的逻辑?另外,难道不能同时使用 DMA 并绕过 OS 和 CPU 吗?
-
任何 I/O 硬件,例如磁盘控制器,都将(设计者选择)响应 I/O 端口地址或内存空间地址。没有其他方法可以与硬件对话。由于内核控制对 I/O 端口和物理内存空间地址的访问,它绝对可以从用户模式中删除访问。
标签: linux-kernel operating-system