linux-kernel - 在没有系统调用的情况下写入磁盘
问题描述
我试图了解 ring 3 到 ring 0 的传输如何在操作系统中工作。
我想我了解系统调用的工作原理。
我的理解是,当用户模式程序想要进行系统调用时,它会设置调用参数并发送一个 INT,它将控制权转移到操作系统,然后操作系统将读取参数,完成这项工作,然后将控制权返回给用户程序。还有更优化的系统进入武器系统退出变体。
如果用户自愿调用系统调用,这一切对我来说都是有意义的。
然而,为了保证安全,操作系统不能假设调用者会使用系统调用来访问资源。
我的问题是——如果用户程序直接尝试访问资源(磁盘)而不涉及操作系统会发生什么。
操作系统如何拦截它?
解决方案
任何 I/O 硬件,例如磁盘控制器,将(设计者的选择)要么响应 I/O 端口地址或内存空间地址,要么可能同时响应两者。没有其他方法可以与硬件对话。硬件坐在一些公共汽车上。程序代码必须读/写一些 I/O 端口或必须读/写一些“内存”地址,这实际上是设备而不是实际的 RAM。
在 x86 上,由于内核控制对两者的访问:
I/O 端口,通过设置或不设置 I/O 端口权限,防止环 3 访问
物理内存空间地址(通过控制虚拟到物理地址的映射)
那么它绝对可以从用户模式中删除访问权限。
因此,没有用户模式可以执行的指令来寻址设备。这是任何硬件上内核/用户分离的基本方面:内核可以控制用户模式可以做什么。
要接受@sawdust 的评论 - 一旦内核设置了上述限制,然后:
尝试发出 I/O 端口指令将陷入内核,因为未授予访问权限。
访问内存空间设备地址简直无法表达;没有用户空间虚拟地址等同于所需的特定物理地址。
推荐阅读
- r - 折线图质量低
- javascript - 第一次使用 Fetch 的问题
- python - Selenium 右键单击 (0,0) 而不是元素,但仅在第一个循环之后
- css - 如何创建媒体查询以将背景图像更改为不同的背景图像?
- node.js - Express 错误中的数据库查询:Router.use() 需要中间件函数但未定义
- asp.net-mvc - 如何在 ASP.NET MVC 中使用工作和学校帐户访问用户数据
- sql - 如何在 SQL Server 中指定类似线性编程的约束(即维度属性的最大行数)?
- sql - 在sql一对多关系中设置最年轻的时间戳
- java - java -jar 命令不起作用,没有主要清单属性
- ms-access - 使用 MSAccess 中的“DISTINCT”关键字查询 DB2 表