一次驱动移植
上一篇 /
下一篇 2006-10-25 18:11:51
/ 个人分类:Linux
对
Linux内核一直抱着浓厚的兴趣,查阅过很多资料,但却不知从何下手。
最近正好有一个数据广播卡的驱动需要从2.4内核移植到2.6内核,那就从这里下手吧。
拿到2.4驱动的源代码,大大小小30多个文件……着实吓了一跳。看看Makefile,发现其实源代码只用了7 8个。
在设备层上,这是一个虚拟的以太网卡驱动(Ethernet)。上层的应用程序可以通过打开该网络设备进行数据接收。因此,可以肯定的是net_device。
拿到手肯定先是尝试编译,一堆warning和wrong。
于
是源代码中grep
一下net_device,出了一大堆,只好换module_init试。看了看module_init前后,发现驱动的bottom-half竟
然用的最古老的task_queue(古老的BH机制以及建立在其之上的tq机制已经被废弃了)。查了查资料,决定用tasklet替代他。随后去掉了模
块引用计数(2.6已经不需要了)
修改后尝试编译了一下,报错说有几个函数没有定义。关键的一个函数是init_etherdev()。
貌似2.6内核已经取消了这个接口。又是查资料,init_etherdev()需要用两步替代,先是alloc_etherdev(),然后
register_netdev()。
编译成功,但是rmmod的时候kernel panic,又回到代码,仔细检查,发现register_netdev()之前没有对alloc_etherdev()分配出来的net_device结构体初始化,寒~
把register_netdev()挪了一下位置,rebuild。
随后运行了几个测试程序,提交给硬件商,一切ok。
移植还是没有想象中的难,不过学到了不少
导入论坛
收藏
分享给好友
管理
举报
TAG:
Linux