提问人:Idan Rosenzweig 提问时间:8/16/2023 更新时间:8/17/2023 访问量:625
如果系统调用与操作系统相关,为什么 x86-64 ISA 中有“syscall”指令?
Why is there "syscall" instruction in the x86-64 ISA, if syscalls are OS related?
问:
我对在操作系统、汇编和机器代码中使用系统调用有点困惑。
据我了解,syscalls 是用户和应用程序向操作系统请求服务和资源的接口,其实现取决于机器中使用的操作系统类型。它们的实现是用机器代码完成的。
那么,如果 x86-64 ISA 中只有与操作系统相关的“syscall”指令,为什么这些指令呢?
这是真的吗,如果是这样,在机器上没有操作系统的不切实际的情况下会发生什么?“syscall”机器指令是否不可用?
我查了一下,从我发现的大多数 ISA “猜测”计算机中操作系统的使用,并且默认情况下提供了快速简便的方法,通过机器代码调用这些操作系统,将执行定向到内核代码中的某个位置,其中包括系统调用的实现。
答:
因为某些操作系统功能需要特殊的硬件支持。如果没有这种支持,此类操作系统就无法运行。因此,CPU 设计人员必须要么提供这些功能,要么知道大多数现代操作系统永远不会在他们的系统上运行。一些低功耗 CPU 确实采用了这种方式。
大多数现代操作系统都使用用户程序的“沙盒”——它们将每个程序放入自己的“沙盒”中,将其与其他程序和真实硬件隔离开来。这保护了稳定性 - 一个程序的崩溃将被控制,并且不会级联成其他程序或整个系统的崩溃。它允许在同一台计算机上运行具有不同权限的程序。它甚至允许安全地运行有些恶意的程序。
如果没有 CPU 支持,这些沙盒功能几乎是不可行的。操作系统永远无法安全地让 CPU 执行代码,因为它很清楚,只要互联网上的一些代码会告诉它,它就会很乐意向驱动器发送“全部格式化”命令。剩下的唯一选择是在软件中模拟代码。软件仿真非常慢,我们需要一个x86_64仿真器来安全地在x86_64 CPU 上运行程序的想法有些愚蠢,你不觉得吗?
因此,CPU 设计人员提供了操作系统所需的功能:
- 虚拟内存,因此操作系统可以为程序提供虚假的内存映射,并限制它们对真实内存和内存映射 IO 设备的访问。这增加了相关的指令:“启用/禁用虚拟内存”、“修改虚拟映射”。
- 用户(“沙箱”)和内核(“系统”)模式,因此程序无法运行一些可以将其从沙箱中解脱出来的指令(例如,禁用虚拟内存的指令)。这需要“进入沙盒”和“离开沙盒”指令。
这是一个“离开沙盒”指令。有必要运行现代“沙盒”操作系统。还有其他一些方法可以执行“离开沙盒”操作(x86_64本身有一个较旧的指令),但旨在更快地完成。syscall
int
syscall
评论
syscall
call
call
syscall
syscall
INT
syscall
sysenter
syscall