linux 访问pci 内核,PCI / PCIe设备如何在Linux内核中初始化/注册自己?

当内核启动时,PCI子系统为每个物理PCI总线创建一个pci_bus,然后将pci_bus添加到pci_root_buses(具有PCI配置).但是PCI设备驱动程序通过pci_register_driver注册驱动程序,并将PCI驱动程序添加到pci_bus_type.

我的问题:

> pci_bus_type如何知道PCI配置.

> pci_bus_type和pci_root_buses之间是什么关系.

解决方法:

由于问题部分不完整,但是评论太小而无法给出答案,我将尝试将其混为一谈.

因此,内核尝试从驱动程序开发人员中提取PCI(e)总线的物理实现.因此,NVidia Tegra上的PCI总线与飞思卡尔ARM和x86_64 PCI总线上的PCI总线不同,但是无论实际的总线实现如何,都应该可以针对它们注册设备.

pci_root_buses结构是抽象PCI总线的列表,其中的实现可能有所不同.

您可以在总线类型结构中看到这一点,在该结构中定义了函数指针,以允许每个实际总线具有不同的实现如何处理设备.我认为最好阅读PCI chapter in LDD3并特别关注启动时间.

还要查看“配置时间”,以了解内核如何将驱动程序与硬件进行匹配. PCI的粗略概念是内核可以发现总线并将内存映射到每个物理PCI设备,从而可以访问设备的PCI配置空间.驱动程序开发人员通过调用pci_register_driver并因此告诉内核哪些驱动程序函数用于某些供应商ID来注册设备类.

再次查看LDD3,似乎您可能正在寻找的缺少的映射是probe函数:

int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);

指向PCI驱动程序中探针功能的指针.当PCI内核具有它认为该驱动程序想要控制的结构pci_dev时,便会调用此函数.指向PCI内核用来做出此决定的struct pci_device_id的指针也传递给此函数.如果PCI驱动程序声明传递给它的struct pci_dev,则应正确初始化设备并返回0.如果驱动程序不想声明该设备或发生错误,则应返回负错误值.有关此功能的更多详细信息,将在本章后面介绍.

内核数据结构

进一步阅读

标签:pci-e,linux-kernel,linux-device-driver,pci,linux

来源: https://codeday.me/bug/20191120/2040625.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值