一次驱动移植

上一篇 / 下一篇  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

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 5246
  • 日志数: 13
  • 图片数: 2
  • 建立时间: 2006-10-25
  • 更新时间: 2006-12-05

RSS订阅

Open Toolbar