关注微信公众号:Linux内核拾遗
1 Linux架构
Linux架构可以划分为用户空间 和内核空间 ,它们之间通过系统调用接口进行交互。
所谓系统调用接口(System Call Interface),它是Linux内核为用户空间应用程序预定义的成熟接口,用户的应用程序可以通过这些接口调用操作系统内核提供的服务。
2 Linux内核模块
Linux内核模块是可以按需加载到内核或者从内核卸载的自定义代码片段,允许在不重启操作系统的前提下扩展内核的能力。
自定义代码片段有两种方式添加到Linux内核中:
- 最基本的方式是将代码添加到内核源代码树中并重新编译内核;
- 一种更加高效的方式是在内核正在运行的时候添加,通常这种代码称为可加载的内核模块(Loadable kernel modules, LKM)。
2.1 内核模块用途
LKM有多种用途,最常见的有:
- 设备驱动:通常专为特定的硬件设备设计,内核可以通过设备驱动与硬件设备通信,而无需了解硬件的具体工作细节;
- 文件系统驱动:内核通过文件系统驱动解析不同文件系统存储在磁盘中的文件或者目录的内容;
- 系统调用:可以通过LKM的方式扩展内核中现有的系统调用类型,也可以覆盖已有的系统调用接口,提供自定义的接口实现。
2.2 内核模块优点
LKM的优点:
- 内核中添加对新设备的支持或者升级旧设备的时候,无需重新构建内核代码,节省时间且避免将缺陷引入内核代码。
- LKM使用灵活,可以通过简单的一条命令实现加载或者卸载,并且按需加载以节省内存空间。
2.3 LKM vs 用户程序
- LKM有独立的地址空间:前者运行在内核空间,后者运行在用户空间。
- LKM有更高的执行权限;
- LKM代码通常不是按顺序执行的,通常是将自身注册到内核中以服务将来的需求;
- 两者使用的头文件不相同。
2.4 LKM vs 内核驱动
- LKM是一种可以在内核运行期间动态插入内核的代码(insmod 或者 modprobe);
- 内核驱动是运行在内核中用以于硬件设备交互的代码,所谓"驱动"硬件设备工作,通常每类硬件设备都需要相对应的内核驱动。
2.5 LKM vs 内核热补丁
内核热补丁技术是指在不重新启动系统的情况下,动态地将修补程序应用到运行中的内核中。这些补丁通常用于修复安全漏洞、性能问题或者其他内核 Bug,而不需要中断正在运行的系统。
LKM与内核热补丁的主要区别如下:
- 实现方式:内核热补丁是通过动态地应用补丁来修改运行中的内核,而内核模块是通过加载和卸载可加载的代码来扩展内核功能。
- 适用场景:内核热补丁通常用于修复内核漏洞或者性能问题,而内核模块则用于动态地扩展内核功能。
- 操作复杂度:内核热补丁的实现相对复杂,需要考虑到更多因素,而内核模块的使用相对简单。
- 对系统影响:内核热补丁可以避免系统停机时间,提高系统的可用性,而内核模块的加载和卸载可能会导致一些系统资源的消耗。
3 Linux设备驱动
设备驱动是一类特殊的系统软件,它用于使能与硬件设备的交互,如若缺少特定的设备驱动,相应的硬件设备也无法工作。
设备驱动通常是与特定操作系统绑定,并且具有硬件依赖性,它在硬件设备以及使用该硬件设备的程序或者操作系统之间扮演"翻译者"的角色。
3.1 设备驱动类型
- 字符设备:按照一个字节一个字节地进行数据读写,例如键盘、鼠标以及打印串口等等,这类设备一般以同步的方式访问,即每一时刻只允许有一个用户在使用,通常用作通信/交互的用途。
- 块设备:按照一个数据块一个数据块地进行数据读写,例如机械硬盘、USB、CD-ROM等等,这类设备一般以异步的方式进行数据写入,通常用于将数据存储到真实的硬件上,并且能够进行挂载以便能够访问到先前写入的数据。
- 网络设备:Linux网络子系统主要关心的是网络设备,可以用于收发网络数据包,它通常是一个物理设备,例如以太网卡,例外情况是环回设备(loopback device),它是纯软件实现的设备,用于给自身发送数据。
关注微信公众号:Linux内核拾遗