0%

Linux:Linux内核级安全开发基础(1)Linux的动态内核模块机制

Linux内核级安全开发基础

1.1 Linux的动态内核模块机制

1.动态内核模块机制概述

Linux内核:宏内核

缺点:系统功能扩展性差,设计之初实现了较多冗余功能,影响操作系统的运行效率和系统稳定性

解决办法:引入内核模块动态加载机制——通过内核模块的扩展和动态加载实现操作系统功能的扩充,当一些内核模块不再使用时可以卸载该模块,以保证操作系统的运行效率和系统稳定性。

Linux内核=基本内核+一系列内核模块

​ 系统启动——加载基本内核——用户按照需要动态加载系统内核模块——不需要时再从内核卸载

好处:a.让内核保持很小的尺寸,同时又非常灵活;b.可以不通过重构内核并频繁重启的方式来尝试运行新内核代码,便于新设备驱动程序的编写和调试

2.linux内核模块的加载和卸载

内核模块的加载方式有两种:

  • 使用insmod命令手工加载模块
  • 在需要时加载模块,即请求加载

符号表:所有能够被内核模块使用的资源(基本内核中定义的资源和新加载模块中定义的资源),被操作系统以内核输出符号表的形式统一管理。

内核模块加载过程:

  1. 在内核输出符号表中找到本模块用到的外部符号
    1. 找不到定义的外部符号,或者找到外部符号但是与所定义的类型不一致,系统拒绝加载该模块
  2. 加载成功——>将本模块输出的符号添加到内核输出符号表中

模块A输出的符号被模块B使用,则称模块B依赖于模块A,或者模块A被模块B引用

引用计数:新模块加载到内核过程中,内核会检查该模块使用的外部符号,增加这些外部符号所在模块的引用技术。可通过lsmod命令查看系统已加载的内核模块以及模块的引用计数。

image-20240430002656528

内核模块的卸载:通过使用rmmod命令来卸载

  • 如果要卸载的内核模块正在被其他模块引用,即引用计数不为零,linux系统会拒绝卸载该模块
  • 一旦内核模块被成功卸载
    • linux从内核符号输出表中删除在该模块中定义的外部符号
    • 检查模块曾引用的外部符号所在的模块,引用计数减1

内核模块除了可以手动卸载以外,还支持自动卸载——内核模块的自动卸载工作由后台进程kerneld完成,keneld在相应定时器到期时检查,卸载不用的模块