1内核空间和用户空间1.1内核模式和用户模式MS-DOS等操作系统在单一的CPU模式下运行,但是一些类Unix的操作系统则使用了双模式,可以有效的实现时间共享。在Linux机器上,CPU要么处于受信任的内核模式,要么处于受限制的用户模式。除了内核本身处于内核模式外,所有的用户进程都运行在用户模式中。
内核模式的代码可以无限制的访问所有处理器指令集以及全部内存和I/O空间,如果用户模式的进程要享有此特权,则必须通过系统调用想设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。
1.2内核空间和用户空间内核空间和用户空间,相对来说有点抽象,主要涉及到内存和访问权限。我们可以认为:内核有特权,而用户应用程序则是受限制的。
l内核空间
内核驻留和运行的地址空间。内核内存是由内核拥有的内存范围,受访问标志保护,防止任何用户应用程序有意或无意的与内核搞混。另一方面,内核可以访问整个系统内存,因为它在系统上以更高的优先级运行。
在内核模式下,CPU可以访问整个内存,包括内核空间和用户空间。
l用户空间
正常程序被限制运行的地址空间。在用户模式下,CPU只能访问标有用户空间访问权限的内存。用户程序运行到内核空间的唯一方法是通过系统调用,如read、write等。用户空间的代码以较低的优先级运行。当进程执行系统调用时,软件中断被发送到内核,这将打开特权模式,以便该进程可以在内核空间中运行。系统调用返回时,内核关闭特权模式,进程再次受限。
1.3内核模块插件,对于用户软件,大家肯定都不陌生。模块,在Linux内核中就相当于用户软件的插件。它扩展了内核的功能。大多数情况下,内核模块是即插即用的。为了支持模块,构建内核时需要启用相应的选项:
CONFIG_MODULES=y
1.3.1模块依赖Linux内核中的模块可以提供函数或变量,用EXPORT_SYMBOL宏导出它们即可供其他模块使用,这些被称为符号。
在内核构建过程中运行depmod工具可以生成模块依赖文件。(模块B对模块A的依赖是指模块B使用从模块A导出的符号)它读取/lib/modules/<kernel_release/中的每个模块来确定它应该导出哪些符号以及它需要什么符号。该处理的结果写入文件mudoles.dep及其二进制版本modules.dep.bin。它是一种模块索引。
1.3.2模块的加载和卸载1.模块加载
需要模块模块运行时,需要将模块先加载到内核,可以使用以下方式来将其加载到内核
linsmod,例如:insmod/xxx/xxx/test_module.ko
该方法需要指定模块路径作为参数,在开发期间可以选择该方式,更方便于调试,这种方法也是其他模块加载方法的基础。
lmodprobe,例如:modprobetest_module
该方法更加智能。在生产系统中则常使用这个方法。它在加载指定模块之前,解析module.dep文件,以便先获取依赖关系,并自动处理模块依赖关系。
如果在启动的时候需要加载一些模块,我们需要创建文件/etc/modules-load.d/xxx.conf,并添加应该加载的模块名称。
2.模块卸载
lrmmod,例:rmmodtest_module
该目录是我们最常使用的模块卸载命令,与之相对应的加载命令是insmod,使用方法和insmod相同。模块卸载是内核的一项功能,我们可以使用CONFIG_MODULE_UNLOAD配置项来决定启用或禁用模块卸载功能。
lmodprobe-r,例:modprobe-rtest_module
该命令是另一个模块卸载命令,它会自动卸载未使用的相关依赖模块。
3.查看已加载模块
llsmod
我们可以使用该命令来查看已经加载的模块。
本文来自“玖玖言”用户投稿,该文观点仅代表作者本人,不代表华夏信息网立场,本站不对文章中的任何观点负责,内容版权归原作者所有、内容只用于提供信息阅读,无任何商业用途。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站(文章、内容、图片、音频、视频)有涉嫌抄袭侵权/违法违规的内容,请发送邮件至1470280261#qq.com举报,一经查实,本站将立刻删除、维护您的正当权益。如若转载,请注明出处:http://www.xxxwhg.com/zh/101415.html