Linux内核级安全开发基础
1.1 Linux的动态内核模块机制
1.动态内核模块机制概述
Linux内核:宏内核
缺点:系统功能扩展性差,设计之初实现了较多冗余功能,影响操作系统的运行效率和系统稳定性
解决办法:引入内核模块动态加载机制——通过内核模块的扩展和动态加载实现操作系统功能的扩充,当一些内核模块不再使用时可以卸载该模块,以保证操作系统的运行效率和系统稳定性。
Linux内核=基本内核+一系列内核模块
系统启动——加载基本内核——用户按照需要动态加载系统内核模块——不需要时再从内核卸载
好处:a.让内核保持很小的尺寸,同时又非常灵活;b.可以不通过重构内核并频繁重启的方式来尝试运行新内核代码,便于新设备驱动程序的编写和调试
2.linux内核模块的加载和卸载
内核模块的加载方式有两种:
- 使用
insmod
命令手工加载模块 - 在需要时加载模块,即请求加载
符号表:所有能够被内核模块使用的资源(基本内核中定义的资源和新加载模块中定义的资源),被操作系统以内核输出符号表的形式统一管理。
内核模块加载过程:
- 在内核输出符号表中找到本模块用到的外部符号
- 找不到定义的外部符号,或者找到外部符号但是与所定义的类型不一致,系统拒绝加载该模块
- 加载成功——>将本模块输出的符号添加到内核输出符号表中
模块A输出的符号被模块B使用,则称模块B依赖于模块A,或者模块A被模块B引用
引用计数:新模块加载到内核过程中,内核会检查该模块使用的外部符号,增加这些外部符号所在模块的引用技术。可通过lsmod
命令查看系统已加载的内核模块以及模块的引用计数。
内核模块的卸载:通过使用rmmod
命令来卸载
- 如果要卸载的内核模块正在被其他模块引用,即引用计数不为零,linux系统会拒绝卸载该模块
- 一旦内核模块被成功卸载
- linux从内核符号输出表中删除在该模块中定义的外部符号
- 检查模块曾引用的外部符号所在的模块,引用计数减1
内核模块除了可以手动卸载以外,还支持自动卸载——内核模块的自动卸载工作由后台进程kerneld
完成,keneld
在相应定时器到期时检查,卸载不用的模块