【发布时间】:2017-01-27 05:51:41
【问题描述】:
有没有一种简单的方法可以在正在运行的 Linux 内核模块中确定与模块关联的 .ko 文件的完整文件名(即:/lib/modules/$(uname -r)/kernel/drivers/mymodule.ko),无需遍历 procfs,而是仅仅依赖内核空间代码中可用的内部结构/列表?
【问题讨论】:
标签: c linux linux-kernel kernel-module
有没有一种简单的方法可以在正在运行的 Linux 内核模块中确定与模块关联的 .ko 文件的完整文件名(即:/lib/modules/$(uname -r)/kernel/drivers/mymodule.ko),无需遍历 procfs,而是仅仅依赖内核空间代码中可用的内部结构/列表?
【问题讨论】:
标签: c linux linux-kernel kernel-module
您无法获得模块文件在内核中的路径:内核不存储它。而且,内核甚至不知道那个路径。
有两个系统调用用于加载内核模块:init_module 和 finit_module(两者都在 kernel/module.c 中定义)。第一个接受指向模块映像所在的用户空间区域的指针(用户空间应该先将模块文件读入该区域)。第二个接受模块文件的描述符,但该描述符仅用于读取文件的内容,不存储。
【讨论】:
没有。
首先:您的模块可能已经编译到内核中,因此没有文件路径。
第二:从文件加载内核模块发生在用户空间。内核使用init_module 系统调用将模块作为数据缓冲区传递——理论上可能根本没有从文件中加载这些数据。 (例如,可以想象一个模块加载器,它从网络或压缩存档加载模块。)
【讨论】: