do_initcall解析

本文介绍了Linux内核中针对不同网络设备驱动的初始化过程,包括GIANFAR、E1000、E1000E、IBM_EMAC等。通过编译配置选项决定加载对应的驱动模块,涉及网络接口的命名与PCI设备的映射。
摘要由CSDN通过智能技术生成
老大提了新需求:
    板子上2个PCI网卡,2个CPU自带TSEC;
    要求TSEC对应 eth0,eth1, PCI网卡对应 eth2,eth3

网络设备的注册是由 register_netdev(struct net_device *dev)来实现的
网络设备驱动加载的时候,会调这个函数,到时就会确定网络设备的接口名称为 eth1或2或3...

在设备驱动代码里强行指定设备接口名?麻烦,改的地方多

忽然想到了驱动加载顺序,看了看 do_initcall,顺便网上查了查 __define_initcall(level,fn)
然后改了下/drivers/net/Makefile

  1. obj-$(CONFIG_GIANFAR) += gianfar_driver.o #wanghui modify netdev init sequence 2011-03-10
  2. #(tesc0,tesc1 ===> eth0,eth1 pci0,pci1 ==> eth2,eth3)
  3. obj-$(CONFIG_E1000) += e1000/
  4. obj-$(CONFIG_E1000E) += e1000e/
  5. obj-$(CONFIG_IBM_EMAC) += ibm_emac/
  6. obj-$(CONFIG_IBM_NEW_EMAC) += ibm_newemac/
  7. obj-$(CONFIG_IXGBE) += ixgbe/
  8. obj-$(CONFIG_IXGB) += ixgb/
  9. obj-$(CONFIG_IP1000) += ipg.o
  10. obj-$(CONFIG_CHELSIO_T1) += chelsio/
  11. obj-$(CONFIG_CHELSIO_T3) += cxgb3/
  12. obj-$(CONFIG_EHEA) += ehea/
  13. obj-$(CONFIG_CAN) += can/
  14. obj-$(CONFIG_BONDING) += bonding/
  15. obj-$(CONFIG_ATL1) += atl1/
  16. #obj-$(CONFIG_GIANFAR) += gianfar_driver.o # wanghui del 2011-03-10
  17. obj-$(CONFIG_TEHUTI) += tehuti.o
编译,搞定。


--------------------------- 华丽的分割线 -------------------------------------


前言

   宏定义__define_initcall(level,fn)对于内核的初始化很重要,它指示
   编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序
   放在一个section中。在内核初始化阶段,do_initcalls() 将按顺序从该
   section中以函数指针的形式取出这些函数的起始地址,来依次完成相应
   的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值