PCIE内核注册详解

news2024/11/23 13:32:03

代码结构

在Linux内核中,PCIe驱动程序的注册和处理涉及到许多文件,其中一些主要的文件包括:

  1. drivers/pci/pci.h:这个文件定义了PCIe驱动程序结构体和相关的函数。驱动程序需要包含这个头文件才能使用PCIe相关的函数和结构体。

  2. drivers/pci/pci-driver.c:这个文件包含了PCIe驱动程序的核心注册函数pci_register_driver()pci_unregister_driver()。这些函数用于向内核注册和注销PCIe驱动程序。

  3. drivers/pci/probe.c:这个文件包含了PCIe设备探测相关的函数。当系统检测到一个新的PCIe设备时,内核会调用这些函数来确定是否有与该设备匹配的驱动程序。

  4. drivers/pci/pci.c:这个文件包含了PCIe设备初始化相关的函数。一旦驱动程序被匹配到一个PCIe设备,内核会调用这些函数来初始化设备并分配资源。

  5. drivers/pci/pci-sysfs.c:这个文件包含了用于PCIe设备驱动程序的sysfs接口相关的函数。sysfs接口允许用户空间应用程序查询和控制PCIe设备和驱动程序的状态。

  6. arch/x86/pci/pci.c(或者对应架构的文件):这个文件包含了PCIe设备的中断处理函数。当PCIe设备产生中断时,内核会调用这个函数来处理中断。

这些文件涵盖了PCIe驱动程序在内核中注册和处理的主要方面。但是,PCIe驱动程序的具体实现可能会涉及到其他文件和头文件。

代码解读

pcie
这是Linux内核中的PCIe驱动程序初始化代码。以下是每个部分的功能:

  1. struct bus_type pcie_port_bus_type:定义了一个名为pci_express的总线类型,表示PCIe总线。它还包含一个指向pcie_port_bus_match()函数的指针,用于在PCIe总线上匹配设备。

  2. EXPORT_SYMBOL_GPL(pcie_port_bus_type):将pcie_port_bus_type结构体导出为GPL符号,以便其他内核模块可以使用它。

  3. bus_register(&pci_bus_type):注册PCI总线类型,将PCI驱动程序与PCI总线关联起来。

  4. bus_register(&pcie_port_bus_type):如果内核配置中启用了PCIe端口总线,则注册PCIe总线类型,将PCIe端口驱动程序与PCIe总线关联起来。

  5. dma_debug_add_bus(&pci_bus_type):将PCI总线类型添加到DMA调试器中,以便可以跟踪PCI总线上的DMA操作。

  6. postcore_initcall(pci_driver_init):将pci_driver_init()函数添加到内核的后核心初始化调用列表中,以便在内核启动时自动调用该函数。

这个初始化代码在内核启动时运行,用于将PCI和PCIe端口驱动程序注册到内核中,以便它们可以与PCI和PCIe总线进行通信。

struct bus_type pci_bus_type = {
	.name		= "pci",
	.match		= pci_bus_match,
	.uevent		= pci_uevent,
	.probe		= pci_device_probe,
	.remove		= pci_device_remove,
	.shutdown	= pci_device_shutdown,
	.dev_groups	= pci_dev_groups,
	.bus_groups	= pci_bus_groups,
	.drv_groups	= pci_drv_groups,
	.pm		= PCI_PM_OPS_PTR,
	.num_vf		= pci_bus_num_vf,
	.dma_configure	= pci_dma_configure,
};
EXPORT_SYMBOL(pci_bus_type);

这是Linux内核中的PCI总线类型结构体定义和初始化代码。以下是每个部分的功能:

  1. struct bus_type pci_bus_type:定义了一个名为pci的总线类型,表示PCI总线。它还包含一些指向函数的指针,用于处理PCI设备驱动程序、总线事件和电源管理等方面。

  2. .name = "pci":设置总线类型名称为pci

  3. .match = pci_bus_match:设置匹配函数指针,当新设备连接到PCI总线时会调用该函数进行匹配操作。

  4. .uevent = pci_uevent:设置uevent回调函数指针,当PCI设备状态发生变化时会调用该回调函数发送事件通知给用户空间。

  5. .probe = pci_device_probe, .remove = pci_device_remove, .shutdown = pci_device_shutdown, .dev_groups = pci_dev_groups, .bus_groups = pci_bus_groups, .drv_groups = pci_drv_groups: 这些都是处理 PCI 设备驱动程序相关操作的回调函数指针。其中 probe 函数在新设备连接到 PCI 总线上时被调用;remove 函数在从 PCI 总线上移除一个设备时被调用;shutdown 函数在系统关闭或重启时被调用以释放资源;dev_groups、bus_groups 和 drv_group 三个成员变量分别表示了与 PCI 设备、PCI 总线和 PCI 驱动程序相关联的 sysfs 属性组。

  6. .pm = PCI_PM_OPS_PTR:设置电源管理回调函数指针,用于实现 PCI 设备的省电模式。

  7. .num_vf = pci_bus_num_vf:设置虚拟化相关的回调函数指针,用于处理 SR-IOV 相关操作。

  8. .dma_configure = pci_dma_configure:设置 DMA 相关回调函数指针,用于配置 PCI 设备的 DMA 策略。

  9. EXPORT_SYMBOL(pci_bus_type):将pci_bus_type结构体导出为符号,以便其他内核模块可以使用它。

这个初始化代码定义了PCI总线类型结构体,并将其导出为符号。当新设备连接到PCI总线时,内核会自动使用这个结构体中定义的函数进行匹配和驱动程序加载等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 观察者模式(Observer Pattern)是一种行为型模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject…

ChatGPT热中的冷思考

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

taro之项目初始化模版

项目初始化模板 一直以来,在使用 Taro CLI 的 taro init 命令创建项目时,CLI 会提供若干内置模板给开发者选择。但是很多团队都有自己独特的业务场景,需要使用和维护的模板也不尽一致,因此 Taro 支持把项目模板打包成一个能力赋予…

思科模拟器 | 生成树协议STP、RSTP、HSRP配置

一、生成树协议STP 概念介绍: 生成树协议是一种网络协议,用于在交换机之间建立逻辑上的树形拓扑结构避免产生环路。为了完成这个功能,生成树协议需要进行些配置,包括根桥的选举、端口的状态切换等。 步骤明细: 使用思…

itop-3568 开发板系统编程学习笔记(21)PWM 应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 在设备树打开 PWMsysfs 方式控制 PWMPWM 应用编程 在设备树打开 PWM RK3568 有 16 个 PWM 控制器,本文件将以 PWM0 为例进行实验,为什么…

如何在PowerShell中查找、添加、修改和删除环境变量:解决手动设置环境变量后报命令失效的问题

简介 PowerShell是Windows平台上的一种命令行工具,它可以方便地查找、添加、修改和删除环境变量。在本文中,LZ将介绍如何在PowerShell中进行这些操作。 查找环境变量 在PowerShell中查找环境变量非常简单。只需要使用Get-ChildItem命令,以…

LED驱动 中断

1、用字符设备驱动框架和平台设备驱动框架实现LED驱动 1.1 用字符设备驱动框架-----》led2 控制led2闪烁 1.应用层: 1 open(“/dev/haha0”) 2 while(1) ioctl(fd,LED_ON)&#xff…

java的社区养老服务系统 ssm空巢老人

创新点: 1、根据时间、类型统计用户下单记录,形成可视化图形(饼状图) 2、根据用户爱好推荐项目 包含模块:关于我们、联系我们、外链信息、资讯类型、服务资讯、服务类型、服务项目、案例类型、服务案例、讨论类型、讨论…

引入Tuning function design的自适应反步控制方法 上篇

引入Tuning function design的自适应反步控制方法 上篇 目录 引入Tuning function design的自适应反步控制方法 上篇尝试用推迟参数设计解决高阶不匹配系统的控制器设计问题问题描述控制器设计小结上一篇文章写了如何通过推迟参数设计的方法来解决不匹配条件下的系统反步控制设…

【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创…

IT项目管理之软件测试

1. 定义 软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前,要经过一系列的严格测试,才能保证交付质量。 2. QC & QA &a…

会声会影导入视频是黑色的 会声会影导入视频只有声音

会声会影是一款功能很成熟的视频编辑软件,其友好的界面设计能照顾到初学者的需求,同时配置的强大功能可满足进阶者的需要。不过由于或硬件或软件的原因,可能会出现会声会影导入视频是黑色的,会声会影导入视频只有声音的问题。本文…

Docker的实际应用

一、 数据持久化 我们什么情况下要做数据持久化呢? 一定是在做容器之前先预判好哪些文件是要永久存储的, 而不会跟着它容器的一个生命周期而消失。 比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种 volumes&…

浏览器缓存策略:强缓存和协商缓存

浏览器缓存:其实就是在本地使用的计算机中开辟一个内存区,同时也开辟一个硬盘区,作为数据传输的缓冲区,然后利用这个缓冲区来暂时保护用户以前访问的信息通常浏览器的缓存策略分为两种:强缓存和协商缓存,强…

Vmware 搭建 Bitnami GitLab CE

Vmware 搭建 Bitnami GitLab CE 下载 Bitnami GitLab CE导入到 Vmwaressh 登录到虚拟机获取 root 用户密码访问 GitLab CE关机命令扩展磁盘配置 tls 证书安装 GitLab Runner注册 GitLab Runner其他,配置 docker 信任自签名证书 下载 Bitnami GitLab CE 下载地址&am…

Photoshop如何使用基础功能?

文章目录 0.引言1.菜单栏2.工具箱 0.引言 笔者从开始科研时就接触过Photoshop(PS),这么多年一直用着感觉有些陌生,在每次使用PS时总感觉有些抵触,这状态说明还未入门。为了入门PS,笔者从头熟悉PS的菜单和工…

一文弄懂Jupyter的配置与使用(呕心沥血版)

Jupyter 是一个基于 Web 的交互式计算平台,使用户能够创建和共享文档,这些文档包含实时代码、方程式、可视化图表和解释文字。Jupyter 在数据分析领域被广泛应用,它提供了一个直观、交互式的操作界面,使得用户能够更容易地探索数据…

MybatisPlus入门和分页和条件查询里面的条件和null值的处理方式和查询投影和查询条件设置

MybatisPlus 简化了mybatis之前的在springboot整合MyBatis时需要自己写sql语句在接口中&#xff0c;现在只需要让接口继承BaseMapper<实体类>&#xff0c;然后在测试类中接口.增删改查方法&#xff08;&#xff09;即可 不用像springboot整合mybatis一样勾选spring web…

【Python】【进阶篇】9、Django路由系统精讲

目录 Django路由系统精讲1. Django 路由系统应用1&#xff09;配置第一个URL实现页面访问2&#xff09;正则与正则分组使用3&#xff09;正则捕获组使用 2. path()与re_path() Django路由系统精讲 在《URL是什么》一节中&#xff0c;我们对 URL 有了基本的认识&#xff0c;在本…

易基因:禾本科植物群落的病毒组丰度/组成与人为管理/植物多样性变化的相关性 | 宏病毒组

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 现代农业通过简化生态系统、引入新宿主物种和减少作物遗传多样性来影响植物病毒的出现。因此&#xff0c;更好理解农业生态中种植和未种植群落中的病毒分布&#xff0c;以及它们之间的病…