Linux:如何突破内核模块验证的限制?

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值进行比较,即接口版本比较。

参考:《Linux内核模块符号CRC检查机制》

3、修改ko文件中的CRC值能突破运行限制吗?

可以。

我在Ubuntu和CentOS上实验,通过修改ko文件中的接口CRC值,能够使之运行在不同的内核

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值