1、要解决的问题
Linux的内核模块(即ko文件)在编译时指定了可以运行在哪个内核版本。
例如,使用Ubuntu 16.04内核4.8.0-42-generic头文件编译的ko文件,只能运行这个内核版本中。
这就有个麻烦,Ubuntu内核版本更新速度非常快,如何内核更新为4.8.0-58-generic,那么这个ko文件就不能运行了,需要重新编译ko文件。
能否有简单的方法,让已有的ko文件运行不同的内核版本中呢?
有,本文介绍一种方法。
2、Linux内核是如何限制ko文件的执行?
ko文件运行在Linux内核中,运行时会调用Linux内核提供的接口。
由于Linux内核版本演进非常快,内核提供的接口可能经常发生变动。
为了保持Linux内核运行稳定,Linux采用的策略是:
- 编译ko文件时,确定了它调用的所有Linux内核接口的版本。
- 装载ko文件时,检查它调用的Linux内核接口版本,如果与当前Linux内核提供的接口版本完全致,则可以装载,否则拒绝装载。
2、内核接口版本是什么?
Linux内核为每个接口计算一个CRC整数值
例如:vfs_create 0xba70d5ae
编译ko时,针对是某个内核版本,把每个接口的CRC值都记录在ko文件中,即接口的版本信息。
装载ko时,与当前内核的接口CRC值进行比较,即接口版本比较。
参考: