在Linux中,至少系统调用机制在大多数体系结构下都可以通过将一些特定格式的数据(通常是某种结构)放置在某些寄存器或预定义的内存地址中来工作。
但是,问题在于实际上迫使CPU将其切换到内核空间,以便它可以运行特权内核代码来为调用提供服务。这是通过强制某种故障(故障被0除,未定义的溢出或段错误等)来完成的,这迫使内核接管执行以处理故障。
通常,内核通过杀死引起原因的进程或运行用户提供的处理程序来处理错误。但是,在进行系统调用的情况下,它将改为检查预定义的寄存器和内存位置,如果它们包含系统调用请求,它将使用内存结构中用户进程提供的数据来运行该请求。这通常必须通过一些特殊的手工组装来完成,并且为了便于用户使用syscall,系统的C库必须将其包装为函数。对于较低级别的界面,请参阅http://man7.org/linux/man-pages/man2/syscall.2.html,以获取有关syscall如何工作以及如何在不使用C包装程序的情况下进行调用的一些信息。
这样做过于简单,并非在所有体系结构中都适用(mips具有特殊的syscall指令),并且不一定在所有OS上都可以正常工作。不过,如果您有任何意见或疑问,请询问。
修订:请注意,关于您对/ dev /中的内容的评论,这实际上是内核的更高级别的接口,而不是更低级别的接口。这些设备实际上使用下面的(大约)4个系统调用。向它们写入与写入syscall相同,读取已读取的syscall,相当于打开和关闭syscall来打开/关闭它们,然后运行ioctl会导致特殊的ioctl syscall,它本身就是访问系统多个ioctl之一的接口。调用(特殊的,通常是设备特定的调用,其使用范围太窄,无法为它们编写整个syscall)。