了解 Linux 内核 说
内核在管理模块时需要执行两个关键任务。第一个任务是确保内核的其余部分可以到达模块的全局符号,例如其主函数的入口点。模块还必须知道内核和其他模块中符号的地址。因此,当链接模块时,引用将被一次性解析。第二个任务包括跟踪模块的使用情况,以便在另一个模块或内核的其他部分正在使用它时不会卸载任何模块。一个简单的引用计数可以跟踪每个模块的使用情况。
任何共享库都可以动态链接(使用LD_LIBRARY_PATH
)和动态加载(通过dlopen()
、dlsym()
和dlclose()
),这是否正确?
模块是 Linux 内核的共享库吗?
Linux内核如何动态使用模块?是通过动态链接(使用LD_LIBRARY_PATH
)还是动态加载(通过dlopen()
、dlsym()
和dlclose()
)?
答案1
任何共享库都可以动态链接(使用
LD_LIBRARY_PATH
)和动态加载(通过dlopen()
、dlsym()
和dlclose()
),这是否正确?
是的。不同的是,动态链接是由动态链接器驱动的,当程序启动时(从程序作者的角度来看),库已经链接完毕,所有符号都已解析;动态加载涉及手动完成所有这些工作。
模块是 Linux 内核的共享库吗?
或多或少,只是加载机制不同。动态链接器 和libdl
,仅在用户空间使用,不能在内核中使用。
Linux内核如何动态使用模块?是通过动态链接(使用
LD_LIBRARY_PATH
)还是动态加载(通过dlopen()
、dlsym()
和dlclose()
)?
内核使用以下方式加载模块load_module
,它本身完成所有工作:加载 ELF 对象、映射所需的段、执行所有重定位等。它还执行一些特定于模块的任务:检查它们的许可证、将它们挂接到sysfs
、调用它们的初始化函数...
load_module
从用户空间访问init_module
或系统finit_module
调用。