分类: LINUX
2014-02-20 14:48:00
=============================================================
硬件扫描和驱动加载大致流程
=============================================================
系统启动-->
扫描PCI总线(PCI总线枚举)-->
从硬件配置空间中中读取硬件信息-->
PCI总线描述符会包含一个已检测到的PCI设备列表(在具体的设备驱动加载之前就已经建立好)-->
内核发udev事件-->
用户态udev执行相应的udev规则加载相应的设备驱动,比如:/etc/udev/50-udev.rules:
ACTION=="add", SUBSYSTEM=="?*", ENV{MODALIAS}=="?*", RUN+="modprobe $env{UDEV_MODPROBE_DBG} $env{MODALIAS}" -->
加载设备驱动时,读/lib/modules/`uname -r `modules.alias文件(不是modprobe.conf文件),根据alias加载相应的驱动
modules.alias文件由内核根据每个内核模块信息(modinfo中包含alias信息,即包括该驱动支持的硬件)中的alias信息统一生成。-->
当设备驱动加载时,在模块初始化时调用pci_register_driver注册pci_driver,其中包含pci_device_id, 列举驱动程序能处理的设备ID-->
PCI层使用该pci_device_id表查看已检测到的PCI设备列表中与哪些设备匹配,于是建立该驱动程序的设备列表,对每个匹配的设备调用pci_driver的probe函数
注册相关联的设备(如网络设备)。