http://www.makelinux.net/ldd3/chp-2-sect-3#chp-2-ITERM-4135这个链接描述了用户空间和内核空间的通信。有人能用一个简单的c语言用户空间应用程序来解释它吗;与内核对象通信(发送/接收值)。?
在大多数Linux机器上可用的程序insmod
(但需要sudo权限才能运行)指示内核通过系统调用init_module
加载指定的模块(内核对象)。
更一般地说,用户空间程序通过这些系统调用与内核通信,这些系统调用本质上是用户空间对内核的请求。用C编写的任何应用程序都必须以某种方式使用系统调用来与系统交互(例如,printf
在后台使用write
系统调用来在屏幕上显示字符)。
只需使用open(2)
打开一个文件。编译器将为该调用向应用程序添加代码,这将把函数参数放在堆栈上,并使其以某种方式崩溃(请参阅系统调用)。内核捕获并处理所有崩溃。
由于这是一个"好"的崩溃,内核将查找要调用的函数,从堆栈中获取参数并调用该函数。
这种复杂方法的原因是安全性:通过"崩溃",应用程序完全放弃控制。CPU也将切换到不同的模式。在这种模式下,它可以访问硬件(在"应用程序"模式下,任何对硬件的访问都会导致"非法访问"崩溃,从而终止您的应用程序)。
open(2)
函数本身不能做什么。相反,它将检查哪个文件系统可以处理请求,并调用文件系统的打开功能。文件系统被实现为内核模块。