在上一篇文章中,我们更深入地讨论了关于汇编语言函数方面的知识,同时也介绍了如何调用系统库libSystem.dylib
的函数。在这篇文章中,我们讨论的是另一种系统提供的函数——系统调用。
什么是系统调用
所谓系统调用(System call), 就是指操作系统提供的接口。我们知道,现代的操作系统分为内核态和用户态。我们平时的汇编语言的执行过程中,都是在用户态执行的。但是,有一些核心的功能,如文件的读写、进程的创建等,都是在内核态实现的。这时候,就需要我们去调用操作系统提供给我们的接口来实现。系统调用和我们之前说的系统库有什么区别呢?其实,很多系统调用在系统库中都有封装。但是,系统调用是最底层的东西。譬如说,我们在织衣服的时候,丝线不够了。我们是不需要自己去养蚕缫丝的,只需要去丝绸店买丝线就行。丝绸店就相当于操作系统,它负责养蚕缫丝,而我们只需要去调用。同时,我们也可以不必自己去丝绸店买衣服,可以去找仆人出门。仆人有什么好处呢?这仆人十分熟悉丝绸店,知道什么丝绸店有什么丝绸店没有。我们想买紫色的丝线,仆人说“丝绸店没有紫色的丝线”,那么也就不需要去丝绸店了。仆人就相当于系统库。我们在调用系统库中涉及系统调用的函数的时候,最终都是要调用到系统调用的。
有哪些系统调用
我们前往/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk 1/usr/include/sys/
这个目录,找到一个叫syscall.h
的文件。这个文件的格式如下:
#define SYS_syscall 0
#define SYS_exit 1
#define SYS_fork 2
#define SYS_read 3
#define SYS_write 4
#define SYS_open 5
#define SYS_close 6
#define SYS_wait4 7
第二列是系统调用的名字,第三列是系统调用号。
系统调用的名字很直白地表述了系统调用的作用,比如说SYS_exit
就是退出进程,SYS_fork
就是创建进程,SYS_read
就是打开文件等等。
系统调用实质上是操作系统提供给我们的一个C函数接口,那么,我们去哪里找系统调用的函数原型呢?
这个相对比较麻烦。首