系统调用存在的意义
作为一个初学者,我们可能一直迷惑为何自己的代码不能直接访问kernel中的变量和资源,还要这么麻烦的使用系统调用?
就比如最近我在写一个tty模块,这个模块负责接受键盘操作并在Console上做相应的显示。当然也可以在其他进程中直接操作tty的输入缓冲,或者直接在这个tty的控制台上进行显示。
现在问题来了:
我该怎么调用tty模块中的代码让其在控制台上显示呢?
- 直接在其他进程中的代码调用tty中的代码
- 使用系统调用,让kernel去调用tty中的代码去操作已经运行起来的进程中的数据。
一般在操作系统上层,大家的理解就是利用系统调用进入kernel,让kernel来操作这一块。但并没有想过为什么?
如果想要使用1来完成这个任务,必须有一个很严格的限制,就是此调用进程必须和kernel一起编译成最终的kernel模块,并且和kernel一起启动。这样才能正确的访问到想要的数据,因为你访问的是真正的正在运行着的kernel中的数据(无论是kernel中的task进程数据还是神马)。
如果不和kernel一起编译,而和tty模块的.o文件单独编译,而且很意外的成功了的话,运行起来也未必成功(成功几率小之又小),因为你在访问的代码和kernel完全就不是一个东西。
系统调用有一个很神奇的功能,就是甚至不是和kernel一起编译的user代码,能利用中断(不论这个中断在哪调用)准确定位到kernel空间的中断处理程序,进而完成想要的功能,并返回。这里的中断跳转是cpu的功劳。