Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247556
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: 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函数
注册相关联的设备(如网络设备)。

阅读(2281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~