如果系统调用与操作系统相关,为什么 x86-64 ISA 中有“syscall”指令?

Why is there "syscall" instruction in the x86-64 ISA, if syscalls are OS related?

提问人:Idan Rosenzweig 提问时间:8/16/2023 更新时间:8/17/2023 访问量:625

问:

我对在操作系统、汇编和机器代码中使用系统调用有点困惑。

据我了解,syscalls 是用户和应用程序向操作系统请求服务和资源的接口,其实现取决于机器中使用的操作系统类型。它们的实现是用机器代码完成的。

那么,如果 x86-64 ISA 中只有与操作系统相关的“syscall”指令,为什么这些指令呢?

这是真的吗,如果是这样,在机器上没有操作系统的不切实际的情况下会发生什么?“syscall”机器指令是否不可用?

我查了一下,从我发现的大多数 ISA “猜测”计算机中操作系统的使用,并且默认情况下提供了快速简便的方法,通过机器代码调用这些操作系统,将执行定向到内核代码中的某个位置,其中包括系统调用的实现。

装配 操作系统 系统调用 机器代码 指令集

评论

2赞 Scott Hunter 8/16/2023
我很想看到消息来源说涉及猜测。
2赞 Jester 8/16/2023
您可以将其视为具有提升权限的固定地址。这是一种将控制权转移到操作系统的方法。如果你没有一个子程序,而你只是进入虚空,那也是行不通的。同样,如果您没有操作系统,则无法工作。请注意,操作系统本身会设置将使用的地址。syscallcallcallsyscallsyscall
1赞 Erik Eidt 8/16/2023
许多处理器提供的指令和/或功能并非每个程序或应用程序都使用。如果没有 syscall 的处理程序,那么使用该指令就没有意义,并且在该环境中根本无法完成。不要求程序使用处理器的所有可能功能。
3赞 Jester 8/16/2023
添加说明是因为它们被认为有用。大多数系统将使用操作系统,因此调用系统调用的快速方法很有用。软件中断指令一直存在,并且是调用操作系统的经典方式。 并已添加为更快的版本。 必须由操作系统启用,如果您没有操作系统,则未启用它,尝试使用它将导致 #UD 异常。有许多指令在没有操作系统的情况下无法使用(对于 cpu 来说,这意味着在权限级别 0 下运行的受保护或长模式代码)。INTsyscallsysentersyscall
1赞 teapot418 8/16/2023
也许 stackoverflow.com/questions/56854297/ 的文章会对你有所帮助。

答:

4赞 user22405329 8/17/2023 #1

因为某些操作系统功能需要特殊的硬件支持。如果没有这种支持,此类操作系统就无法运行。因此,CPU 设计人员必须要么提供这些功能,要么知道大多数现代操作系统永远不会在他们的系统上运行。一些低功耗 CPU 确实采用了这种方式。

大多数现代操作系统都使用用户程序的“沙盒”——它们将每个程序放入自己的“沙盒”中,将其与其他程序和真实硬件隔离开来。这保护了稳定性 - 一个程序的崩溃将被控制,并且不会级联成其他程序或整个系统的崩溃。它允许在同一台计算机上运行具有不同权限的程序。它甚至允许安全地运行有些恶意的程序。

如果没有 CPU 支持,这些沙盒功能几乎是不可行的。操作系统永远无法安全地让 CPU 执行代码,因为它很清楚,只要互联网上的一些代码会告诉它,它就会很乐意向驱动器发送“全部格式化”命令。剩下的唯一选择是在软件中模拟代码。软件仿真非常慢,我们需要一个x86_64仿真器来安全地在x86_64 CPU 上运行程序的想法有些愚蠢,你不觉得吗?

因此,CPU 设计人员提供了操作系统所需的功能:

  • 虚拟内存,因此操作系统可以为程序提供虚假的内存映射,并限制它们对真实内存和内存映射 IO 设备的访问。这增加了相关的指令:“启用/禁用虚拟内存”、“修改虚拟映射”。
  • 用户(“沙箱”)和内核(“系统”)模式,因此程序无法运行一些可以将其从沙箱中解脱出来的指令(例如,禁用虚拟内存的指令)。这需要“进入沙盒”和“离开沙盒”指令。

这是一个“离开沙盒”指令。有必要运行现代“沙盒”操作系统。还有其他一些方法可以执行“离开沙盒”操作(x86_64本身有一个较旧的指令),但旨在更快地完成。syscallintsyscall