Linux kernel 如何将内核模块从用户空间终端调用到应用程序中

Linux kernel 如何将内核模块从用户空间终端调用到应用程序中,linux-kernel,kernel,kernel-module,Linux Kernel,Kernel,Kernel Module,此链接描述用户空间和内核空间通信。 任何人都可以用一个简单的c语言用户空间应用程序来解释它,该程序链接并通信(发送/接收值)到内核对象。该程序insmod,可在大多数Linux机器上使用(但需要sudo权限才能运行),它指示内核加载指定的模块(内核对象)通过系统调用初始化模块 更一般地说,用户空间程序通过这些系统调用与内核通信,这些系统调用本质上是从用户空间向内核发出的请求。用C编写的任何应用程序都必须以某种方式使用系统调用来与系统交互(例如,printf在引擎盖下使用write系统调用将字符放

此链接描述用户空间和内核空间通信。
任何人都可以用一个简单的c语言用户空间应用程序来解释它,该程序链接并通信(发送/接收值)到内核对象。

该程序
insmod
,可在大多数Linux机器上使用(但需要sudo权限才能运行),它指示内核加载指定的模块(内核对象)通过系统调用初始化模块


更一般地说,用户空间程序通过这些系统调用与内核通信,这些系统调用本质上是从用户空间向内核发出的请求。用C编写的任何应用程序都必须以某种方式使用系统调用来与系统交互(例如,
printf
在引擎盖下使用
write
系统调用将字符放在屏幕上)。

只需使用
open(2)
打开一个文件即可。编译器将为此调用向应用程序添加代码,这将把函数参数放在堆栈上,并使其以某种方式崩溃(请参阅)。内核捕获并处理所有崩溃

由于这是一个“良好”崩溃,内核将查找要调用的函数,从堆栈中获取参数并调用该函数

这种复杂方法的原因是安全性:通过“崩溃”,应用程序完全放弃控制。CPU也将切换到不同的模式。在此模式下,它可以访问硬件(在“应用程序”模式下,对硬件的任何访问都会导致“非法访问”崩溃,从而终止应用程序)

open(2)
函数本身做不了什么。相反,它将检查哪个文件系统可以处理请求并调用文件系统的open函数。文件系统作为内核模块实现