任何人都可以用简单的语言向我解释以下内容。 Linux驱动程序如何加载到内核空间? 在加载驱动程序后导出哪些功能? 如何调用驱动程序函数?
答案 0 :(得分:2)
通常,您将使用insmod
或modprobe
用户空间应用程序来加载模块(如果是第二个,则可能使用其依赖项)。它们都在底层执行相同操作以实际加载单个模块 - 它们将文件读入内存并使用init_module
系统调用,提供加载此模块的内存地址。这个调用告诉内核应该加载模块。
现在内核模块实际上是ELF文件,与用户空间中使用的共享库没有太大区别。内核具有等效的共享库链接器,它将解析这些文件,获取由它提供的符号列表,更新内核已知的函数列表。它还将检查此模块所需的所有符号是否已在内核中并进行适当的重定位。它将做的最后一件事是在模块中调用初始化函数。
请注意,您无法编译将直接调用模块提供的任何函数的内核。同样,在加载第一个模块之前,您可以调用另一个模块中的模块提供的任何功能。内核将拒绝使用未知的符号加载任何模块。但是,大多数模块都会将其函数注册为可以间接调用的某种回调。