背 景

Read the fucking source code! --By 鲁迅

A picture is worth a thousand words. --By 高尔基

说明:linux

Kernel版本:4.14

ARM64处理器

使用工具:Source Insight 3.5, Visio

1. 概述

本文将分析Linux PCI子系统的框架,主要围绕Linux PCI子系统的初始化以及枚举过程分析;

若是对具体的硬件缺少了解,建议先阅读上篇文章《Linux PCI驱动框架分析(一)》;

话很少说,直接开始。算法

2. 数据结构

PCI体系结构的拓扑关系如图所示,而图中的不一样数据结构就是用于来描述对应的模块;

Host Bridge链接CPU和PCI系统,由struct pci_host_bridge描述;

struct pci_dev描述PCI设备,以及PCI-to-PCI桥设备;

struct pci_bus用于描述PCI总线,struct pci_slot用于描述总线上的物理插槽;

来一张更详细的结构体组织图:数据结构

整体来看,数据结构对硬件模块进行了抽象,数据结构之间也能很便捷的构建一个相似PCI子系统物理拓扑的关系图;

顶层的结构为pci_host_bridge,这个结构通常由Host驱动负责来初始化建立;

pci_host_bridge指向root bus,也就是编号为0的总线,在该总线下,能够挂接各类外设或物理slot,也能够经过PCI桥去扩展总线;

3. 流程分析

3.1 设备驱动模型

Linux PCI驱动框架,基于Linux设备驱动模型,所以有必要先简要介绍一下,实际上Linux设备驱动模型也是一个大的topic,先挖个坑,有空再来填。来张图吧:框架

简单来讲,Linux内核创建了一个统一的设备模型,分别采用总线、设备、驱动三者进行抽象,其中设备与驱动都挂在总线上,当有新的设备注册或者新的驱动注册时,总线会去进行匹配操做(match函数),当发现驱动与设备能进行匹配时,就会执行probe函数的操做;

从数据结构中能够看出,bus_type会维护两个链表,分别用于挂接向其注册的设备和驱动,而match函数就负责匹配检测;

各种驱动框架也都是基于图中的机制来实现,在这之上进行封装,好比I2C总线框架等;

设备驱动模型中,包含了不少kset/kobject等内容,建议去看看以前的文章《linux设备模型之kset/kobj/ktype分析》

好了,点到为止,感受要跑题了,强行拉回来。

3.2 初始化

既然说到了设备驱动模型,那么首先咱们要作的事情,就是先在内核里边建立一个PCI总线,用于挂接PCI设备和PCI驱动,咱们的实现来到了pci_driver_init()函数:函数

内核在PCI框架初始化时会调用pci_driver_init()来建立一个PCI总线结构(全局变量pci_bus_type),这里描述的PCI总线结构,是指驱动匹配模型中的概念,PCI的设备和驱动都会挂在该PCI总线上;

从pci_bus_type的函数操做接口也能看出来,pci_bus_match用来检查设备与驱动是否匹配,一旦匹配了就会调用pci_device_probe函数,下边针对这两个函数稍加介绍;

3.2.1 pci_bus_match

设备或者驱动注册后,触发pci_bus_match函数的调用,实际会去比对vendor和device等信息,这个都是厂家固化的,在驱动中设置成PCI_ANY_ID就能支持全部设备;

一旦匹配成功后,就会去触发pci_device_probe的执行;

3.2.2 pci_device_probe

实际的过程也是比较简单,无非就是进行匹配,一旦匹配上了,直接调用驱动程序的probe函数,写过驱动的同窗应该就比较清楚后边的流程了;

3.3 枚举

咱们仍是顺着设备驱动匹配的思路继续开展;

3.2节描述的是总线的建立,那么本节中的枚举,显然就是设备的建立了;

所谓设备的建立,就是在Linux内核中维护一些数据结构来对硬件设备进行描述,而硬件的描述又跟上文中的数据结构能对应上;

枚举的入口函数:pci_host_probe工具

设备的扫描从pci_scan_root_bus_bridge开始,首先须要先向系统注册一个host bridge,在注册的过程当中须要建立一个root bus,也就是bus 0,在pci_register_host_bridge函数中,主要是一系列的初始化和注册工做,此外还为总线分配资源,包括地址空间等;

pci_scan_child_bus开始,从bus 0向下扫描并添加设备,这个过程由pci_scan_child_bus_extend来完成;

从pci_scan_child_bus_extend的流程能够看出,主要有两大块:

PCI设备扫描,从循环也能看出来,每条总线支持32个设备,每一个设备支持8个功能,扫描完设备后将设备注册进系统,pci_scan_device的过程当中会去读取PCI设备的配置空间,获取到BAR的相关信息,细节不表了;

PCI桥设备扫描,PCI桥是用于链接上一级PCI总线和下一级PCI总线的,当发现有下一级总线时,建立子结构,并再次调用pci_scan_child_bus_extend的函数来扫描下一级的总线,从这个过程看,就是一个递归过程。

从设备的扫描过程看,这是一个典型的DFS(Depth First Search)过程,熟悉数据结构与算法的同窗应该清楚,这就相似典型的走迷宫的过程;

若是你对上述的流程还不清楚,再来一张图:3d

图中的数字表明的就是扫描的过程,当遍历到PCI桥设备的时候,会一直穷究到底,而后再返回来;

当枚举过程结束后,系统中就已经维护了PCI设备的各种信息了,在设备驱动匹配模型中,总线和设备都已经具有了,剩下的就是写个驱动了;

暂且写这么多,细节方面再也不赘述了,把握大致的框架便可,没法扼住PCI的咽喉,那就扼住它的骨架吧。code

欢迎关注我的公众号,不按期分享Linux内核相关技术文章:

blog

linux 统一设备模型 pci,【原创】Linux PCI驱动框架分析(二)相关推荐

  1. linux 统一设备模型 pci,Linux设备驱动模型摘抄

    Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄 Linux设备驱动模型摘抄(1) Linux统一设备模型 简介 Li ...

  2. linux 统一设备模型 pci,linux设备模型____宏观印象

    linux设备模型____宏观印象 最近一个机会需要研究一个marvell芯片的设备的驱动,涉及驱动和一些用户态相关部分,正好学习一下驱动和sysfs,本文先是原理,后面的文章是详细描述.本文依托的是 ...

  3. 获取另一个驱动的设备结构体_《rt-thread驱动框架分析》-i2c驱动

    驱动分析 I2C设备驱动框架图: 我们先RT-Thread的I2C框架图(这是我自己理解的框架图,如果不对的地方,请指出): 上图是我分析的RTT的I2C框架图.主要分为三层,驱动层-核心层-设备层. ...

  4. linux 内核模型,The Linux Kernel Device Model - Overview -- Linux 内核设备模型概述

    --------------------------------------------------------------------------------------------------- ...

  5. Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)

    <DPDK 20.05 | rte_pci_bus思维导图 | 第一版> <linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作> <Linux指令:ls ...

  6. 深入分析Linux PCI驱动框架分析(二)

    说明: Kernel版本:4.14 ARM64处理器 使用工具:Source Insight 3.5, Visio 1. 概述 本文将分析Linux PCI子系统的框架,主要围绕Linux PCI子系 ...

  7. linux的设备模型

    linux的设备模型 1 总线bus 1.1 代码 xbus.c #include <linux/init.h> #include <linux/module.h> #incl ...

  8. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一

    [快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...

  9. Linux PCIe驱动框架分析(第二章)

    目录 项目背景 1. 概述 2. 数据结构 3. 流程分析 3.1 设备驱动模型 3.2 初始化 3.2.1 pci_bus_match 3.2.2 pci_device_probe 3.3 枚举 项 ...

  10. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

最新文章

  1. 文献记录(part33)-Hierarchical deep neural network for mental stress state detection using IoT ...
  2. 回归素材(part10)--深入浅出python机器学习
  3. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)
  4. 计算机网络(十一)-数据链路层-流量控制
  5. jvm oracle sun,JVM - 常见的JVM种类
  6. Spring Shell笔记-help方法及exit及其他方法
  7. 【Java】在eclipse中使用maven进行项目构建 入门篇
  8. OpenCV-实现直方图均衡化(对比cv::equalizeHist)
  9. 修改系统启动项 grub2配置的方法 ubuntu[转]
  10. Springboot属性文件application.properties配置大全,版本:1.5.4
  11. 测试家里网速用什么软件,怎么测试网速,测试网速用什么软件
  12. 2014腾讯实习生招聘数组墙算法
  13. 华为鸿蒙参与者,一起来搞机 篇二十四:不止有鸿蒙,参加华为开发者大会是一种怎样的体验...
  14. BMS(Battery Management System)是什么?
  15. 数据结构课程设计预习——项目1:中国计算机设计大赛赛事统计
  16. 迷你播放器--第一阶段(4)--内存卡检索不到音乐的错误处理--程序内部空间管理
  17. 一台计算机连接两个投影,事实:如何将两个外接显示器连接到笔记本电脑以同时实现三个屏幕?...
  18. noip 2009 靶形数独
  19. win7java浏览器崩溃_win7系统IE浏览器出现各种崩溃问题的解决方法
  20. 计算机科学概论读后感

热门文章

  1. 猜名人读心术作业C语言答案,读心术游戏,读心术游戏猜人物
  2. 云计算储存基础(3)
  3. explain mysql_mysql explain详解
  4. Ubuntu下鼠标无法点击解决方案
  5. gym100818F-F - Irrational Roots
  6. 关于silvaco安装不成功问题解决
  7. 最详细的 Deepin安装idea2018及破解教程,有效期到2100年
  8. 个人第一次作业:阅读与准备作业
  9. ES系列:解决Cluster state has not been recovered yet, cannot write to the [null] index问题
  10. 问题解决:下载的网页打开后自动跳转到首页