在没有系统调用的情况下写入磁盘
Writing to a disk without syscall
我想了解 ring 3 到 ring 0 的传输在操作系统中是如何工作的。
我想我了解系统调用的工作原理。
我的理解是,当用户模式程序想要进行系统调用时,它将设置调用参数并发送一个 INT 将控制权转移到 OS,然后后者将读取 args,完成这项工作然后 return 将控制权交还给用户程序。还有更多优化的 sys enter arms sys exit 变体。
如果用户自愿调用系统调用,这一切对我来说都是有意义的。
但是,为了保证安全OS不能假设调用者会使用系统调用来访问资源。
我的问题是 — 如果用户程序直接尝试直接访问资源(磁盘)而不涉及 OS。
会发生什么
OS如何拦截它?
任何 I/O 硬件,例如磁盘控制器,将(设计者的选择)响应 I/O 端口地址或内存-space 地址,或者可能两个都。没有其他方式可以与硬件对话。硬件在一些总线上。程序代码必须 read/write 一些 I/O 端口或必须 read/write 一些“内存”地址,它实际上是设备而不是实际的 RAM。
在 x86 上,由于内核控制对两者的访问:
I/O端口,通过设置或不设置I/O端口权限,防止ring 3访问
物理内存-space地址(通过控制虚拟到物理地址映射)
那么它就可以完全删除用户模式的访问权限了。
所以没有用户模式可以执行的寻址设备的指令。这是任何硬件上 kernel/user 分裂的基本方面:内核可以控制用户模式可以做什么。
接受@sawdust 的评论 - 一旦内核设置了上述限制,那么:
尝试发出 I/O 端口指令将陷入内核,因为尚未授予访问权限。
访问内存-space设备地址简直无法形容;没有用户-space 虚拟地址等同于所需的特定物理地址。
我想了解 ring 3 到 ring 0 的传输在操作系统中是如何工作的。
我想我了解系统调用的工作原理。
我的理解是,当用户模式程序想要进行系统调用时,它将设置调用参数并发送一个 INT 将控制权转移到 OS,然后后者将读取 args,完成这项工作然后 return 将控制权交还给用户程序。还有更多优化的 sys enter arms sys exit 变体。
如果用户自愿调用系统调用,这一切对我来说都是有意义的。
但是,为了保证安全OS不能假设调用者会使用系统调用来访问资源。
我的问题是 — 如果用户程序直接尝试直接访问资源(磁盘)而不涉及 OS。
会发生什么OS如何拦截它?
任何 I/O 硬件,例如磁盘控制器,将(设计者的选择)响应 I/O 端口地址或内存-space 地址,或者可能两个都。没有其他方式可以与硬件对话。硬件在一些总线上。程序代码必须 read/write 一些 I/O 端口或必须 read/write 一些“内存”地址,它实际上是设备而不是实际的 RAM。
在 x86 上,由于内核控制对两者的访问:
I/O端口,通过设置或不设置I/O端口权限,防止ring 3访问
物理内存-space地址(通过控制虚拟到物理地址映射)
那么它就可以完全删除用户模式的访问权限了。
所以没有用户模式可以执行的寻址设备的指令。这是任何硬件上 kernel/user 分裂的基本方面:内核可以控制用户模式可以做什么。
接受@sawdust 的评论 - 一旦内核设置了上述限制,那么:
尝试发出 I/O 端口指令将陷入内核,因为尚未授予访问权限。
访问内存-space设备地址简直无法形容;没有用户-space 虚拟地址等同于所需的特定物理地址。