【问题标题】:how to call the kernel module from a user space Terminal into an application如何从用户空间终端调用内核模块到应用程序中
【发布时间】:2012-08-19 18:05:05
【问题描述】:

http://www.makelinux.net/ldd3/chp-2-sect-3#chp-2-ITERM-4135这个链接描述了用户空间和内核空间的通信。 谁能用 c 语言中的一个简单的用户空间应用程序来解释它,该程序链接和通信(发送/接收值)到内核对象。

【问题讨论】:

    标签: linux-kernel kernel kernel-module


    【解决方案1】:

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

    更一般地说,用户空间程序通过这些系统调用与内核通信,这些系统调用本质上是用户空间对内核的请求。您用 C 编写的任何应用程序都必须以某种方式使用系统调用与系统交互(例如,printf 在后台使用write 系统调用将字符显示在屏幕上)。

    【讨论】:

      【解决方案2】:

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

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

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

      open(2) 函数本身不能做太多事情。相反,它将检查哪个文件系统可以处理请求并调用文件系统的打开函数。文件系统被实现为内核模块。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多