比如Nvidia显卡的Linux内核驱动,还有以前接触过的SCSI的Raid控制器RocketRAID 174x controller驱动,都是以二进制的方式发布给客户。但是内核有严格的version magic检查,如果version magic不匹配的话,驱动是没有办法插入内核的。
客户的内核版本可是不好预知的,那这些厂商是如果解决这个内核版本的问题的?
看到过的解决方法有如下几种:
1. 在代码中加入内核版本检查,比如2.6.0~2.6.10调用内核的A函数,2.6.11以上的调用B函数。这个方法是在编译时做的,二进制的驱动用不了这个方法。
2. 将内核中做的事情,尽量尽量移动到用户态做,这样驱动只是简单的提供能够访问硬件的途径而已,而大部分的逻辑还是在用户层完成的,即使公开驱动的源代码也无所谓了。Android中的好些驱动就是这样干的。
3. 一部分以还没有连接的object方式发布,一部分以源代码发布。这样核心逻辑不公开,而和内核版本函数紧密相关的部分以源代码的形式提供。用户然后再自己编译生成驱动模块。RocketRaid 174x采用正是这种方式,Nvidia的不知道,我估计也是这个方式。
阅读(2247) | 评论(0) | 转发(0) |