首页 > 系统相关 >转载: PCIE linux驱动

转载: PCIE linux驱动

时间:2024-05-23 11:19:09浏览次数:15  
标签:PCI bus 总线 PCIE pci linux 驱动 转载 设备

https://www.cnblogs.com/LoyenWang/p/14209318.html

PCIE物理结构

PCI Device;
PCI总线中有三类设备:PCI从设备,PCI主设备,桥设备。
PCI从设备:被动接收来自Host Bridge或者其他PCI设备的读写请求;
PCI主设备:可以通过总线仲裁获得PCI总线的使用权,主动向其他PCI设备或主存储器发起读写请求;
桥设备:管理下游的PCI总线,并转发上下游总线之间的总线事务,包括PCI桥、PCI-to-ISA桥、PCI-to-Cardbus桥等。

层级划分

linux数据结构

host bridge

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

pci_bus

struct pci_bus用于描述PCI总线

pci_dev

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

pci_slot

struct pci_slot用于描述总线上的物理插槽

/i/l/?n=20&i=blog/1771657/202012/1771657-20201229232452417-1541535796.pngW

  • 总体来看,数据结构对硬件模块进行了抽象,数据结构之间也能很便捷的构建一个类似PCI子系统物理拓扑的关系图;
  • 顶层的结构为pci_host_bridge,这个结构一般由Host驱动负责来初始化创建;
  • pci_host_bridge指向root bus,也就是编号为0的总线,在该总线下,可以挂接各种外设或物理slot,也可以通过PCI桥去扩展总线;

流程分析

/i/l/?n=20&i=blog/1771657/202012/1771657-20201229232507268-1330517277.png
简单来说,Linux内核建立了一个统一的设备模型,分别采用总线、设备、驱动三者进行抽象,其中设备与驱动都挂在总线上,当有新的设备注册或者新的驱动注册时,总线会去进行匹配操作(match函数),当发现驱动与设备能进行匹配时,就会执行probe函数的操作;
从数据结构中可以看出,bus_type会维护两个链表,分别用于挂接向其注册的设备和驱动,而match函数就负责匹配检测;
各类驱动框架也都是基于图中的机制来实现,在这之上进行封装,比如I2C总线框架等;
设备驱动模型中,包含了很多kset/kobject等内容,建议去看看之前的文章《linux设备模型之kset/kobj/ktype分析》

bus match

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

bus probe

枚举

/i/l/?n=20&i=blog/1771657/202012/1771657-20201229232552417-1229310319.png

标签:PCI,bus,总线,PCIE,pci,linux,驱动,转载,设备
From: https://www.cnblogs.com/ycjstudy/p/18207700

相关文章

  • 写一个Linux的 shell脚本删除目录 stud001~stud140 目录下的所有文件
    用户:在linux的shell脚本中写个循环,可以遍历目录stud001直到stud140,并将目录stud001到stud140目录中的内容全部删除。讯飞星火:在shell脚本中,我们可以使用for循环和rm命令来实现这个需求。以下是一个简单的示例:1#!/bin/bash2foriin$(seq-f"%03g"1140)3do4......
  • Linux下安装Python3
    前言Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖,比如centos下的yum就是python2写的,所以默认版本不要轻易删除,否则会有一些问题,如果需要使用最新的Python3那么我们可以编译安装源码包到独立目录,这和系统默认环......
  • Linux command-not in runoob
    command:nl1.命令格式nl[option][file]2.命令参数-b:指定行号指定的方式,主要有两种:-ba:表示不论是否为空行,也同样列出行号(类似cat-n);-bt:-n:列出行号表示的方法,主要有三种:-nln:行号在萤幕的最左方显示,-nrn:行号在自己栏位的最右方显示,且不加0;-nrz:行......
  • Linux使用ecmp
    Ubuntu23.10ECMP等价多路径,全称是EqualCostMultiPath,支持目的IP相同而下一跳不同的路由。#172.17.0.2dockerrun--nametest1-itdnginx:1.9#172.17.0.3dockerrun--nametest2-itdnginx:1.9#配置ecmp路由iprouteadd1.2.3.4/32nexthopvia172.17.0.2weig......
  • python在Linux环境下访问Windows共享目录
    1.smbprotocol 不推荐,偶然会出现 "SMBsocketwasclosed,cannotsendorreceiveanymoredata" 的异常。pipinstallsmbprotocol实现代码:#!/usr/bin/envpython#-*-encoding:utf-8-*-fromsmbclientimportopen_file,register_session,delete_session......
  • linux核心基础-用户管理
    一、linux用户管理前言1、linux用户信息配置文件/etc/passwd2、/etc/passwd字段信息解释3、其余用户,组相关配置文件/etc/passwd用户信息/etc/shadow用户密码信息/etc/group用户组信息/etc/gshadow用户组密码信息,在大公司,用户和组数量很大的情况下,需要制定复杂的......
  • 《Linux内核完全注释》学习笔记:2.4 Linux内核进程控制
    程序是一个可执行的文件,而进程(process)是一个执行中的程序实例。利用分时技术,在Linux操作系统上同时可以运行多个进程。分时技术的基本原理:把CPU的运行时间划分成一个个规定长度的时间片(timeslice),让每个进程在一个时间片内运行。当进程的时间片用完时系统就利用调度程序......
  • 在Linux中,RAID级别有哪些?
    RAID(RedundantArrayofIndependentDisks,独立磁盘冗余阵列)是一种将多个磁盘驱动器组合成一个逻辑单元的数据存储虚拟化技术,用于提高数据的可靠性、性能和/或容量。RAID有多种级别,每种级别都有其特定的性能、可靠性和成本效益。以下是一些常见的RAID级别:1.RAID0(条带化)特点:将......
  • 在Linux中,如何查看网络接口的状态?
    在Linux中,查看网络接口的状态可以使用多种命令和工具,这些工具提供了接口的配置、活动状态、统计信息等。以下是一些常用的方法:1.ifconfig命令ifconfig(网络接口配置)是一个传统的命令行工具,用于显示和配置网络接口。ifconfig或者,查看特定接口的状态:ifconfiginterface_name......
  • 在Linux中,如何查看系统资源使用情况?
    在Linux系统中,查看系统资源使用情况是一项常见的任务,可以通过多种命令完成。以下是一些主要的命令和它们的功能:1.查看内存使用情况(free命令)基本用法:free-h这个命令显示内存(包括物理内存和交换空间)的总用量、已用量、空闲量等信息。-h选项使得输出以人类可读的格式(如K......