首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux驱动PCI子系统剖析

PCI总线常见于x86体系,本文默认面向的体系为x86,注意x86架构下IO与内存是独立编址的。 附: 本文默认读者熟悉Linux设备驱动模型,不熟悉的可以先阅读这两篇blog。...Linux驱动之I2C子系统剖析 Linux驱动之SPI子系统剖析 PCI寻址 PCI系统总体布局组织为树状,从CPU连接的Host Bridge引出PCI主桥,主桥连接的是PCI总线0,可以直接连接PCI...Linux内核启动时会从PCI设备的配置寄存器里读取内存/IO起始地址以及irq,并把这些信息赋值给struct pci_dev的相应成员来生成软件描述的PCI设备。...val) int pci_write_config_dword(struct pci_dev *dev, int where, u32 val) PCI驱动的注册及匹配 BIOS在启动时,会为每个PCI...当linux系统启动时,会探测系统中的所有PCI设备,并为探测到的每个PCI设备做如下操作: 1.分配一个struct pci_dev结构体,用来表示相应的PCI设备 2.为这个结构体填充设备vendor

3.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

32.Linux-2440下的DMA驱动(详解)

学了这么多驱动,不难推出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops   -> 2.1)file_operations里设置DMA硬件相关操作,...来启动DMA 由于我们是用字符设备的测试方法测试的,而本例子只是用两个地址之间的拷贝来演示DMA的作用,所以采用字符设备方式编写 1.驱动编写之前,先来讲如何分配释放缓冲区、DMA相关寄存器介绍、使用...的字符设备驱动 步骤如下: 1) 注册DMA中断,分配两个DMA缓冲区(源、目的) 2) 注册字符设备,并提供文件操作集合fops -> 2.1) 通过ioctl的cmd来判断是使用DMA启动两个地址之间的拷贝...,还是直接两个地址之间的拷贝 -> 2.2)若是DMA启动,则设置DMA的相关硬件,并启动DMA传输 2.1 所以,驱动代码如下所示: #include #include... #include #include #include #include <linux

3.7K90

PCI设备驱动程序「建议收藏」

其实,只要你认真下去,虽然有些东西看不明白,但是对于你写PCI驱动来说,似乎“不那么重要”。因为,Linux内核对PCI总线已经有了完美的支持,你所需要做的内容是非常小的一部份。...众所周知,Linux 2.6内核引入了总线驱动模型这一概念,如此,很多基于总线的设备驱动就分成了总线驱动和设备驱动两部分。...下面是我写的一个PCI总线的驱动程序,注意是PCI设备识别时的驱动程序,这里并没有实现具体的功能驱动。...基于PCI总线的设备有很多种,但就PCI总线驱动这一块来说,都大同小异,实现了PCI总线驱动之后,再去继续做具体的设备驱动。...> #include #include #include #include #include

2K21

深入理解SR-IOV和IO虚拟化

长期从事Linux内核驱动开发、Linux内核开发和Linux系统虚拟化(QEMU/KVM),喜欢分析Linux内核子系统基本原理并撰写技术博客,长期关注kernel、QEMU的开源项目,经常参加相关开源社区活动...2.2 软件支持 Linux系统下,基于SR-IOV有三种应用场景:HostOS使用PF、HOstOS使用VF、将VF直通到VM(虚拟机),见图2.2.1: 图2.2.1 Linux系统中PCI驱动框架...3.1.1.1 DMA物理地址重映射 (DMA Remapping ) 1)地址空间隔离 在没有iommu的时候,用户态驱动可以通过设备dma可以访问到机器的全部的地址空间,如何保护机器物理内存区对于用户态驱动框架设计带来挑战...PCI设备直通时,GuestOS中的设备驱动操作虚拟PCI设备的DMA时,QEMU会将上述操作通过VFIO接口下发给物理PCI设备的DMA,物理设备DMA收到GuestOS中的物理地址GPA,通过IOMMU...当GuestOS中直通设备的驱动分配内存并配置DMA时,QEMU通过VFIO接口将GPA下发到PCI Device的DMADMA读取数据时经由IOMMU映射,找到相应的HPA。 图3.2.1.1

6.5K40

LINUX网络子系统中DMA机制的实现

我们先从计算机组成原理的层面介绍DMA,再简单介绍Linux网络子系统的DMA机制是如何的实现的。 一、计算机组成原理中的DMA 以往的I/O设备和主存交换信息都要经过CPU的操作。...总之,在同样的时间内,DMA方式下CPU执行现行程序的时间最长,即CPU的效率最高。 二、Linux网络子系统中DMA机制的实现 1....接着驱动程序将网络数据包传给内核的其它部分处理,并在环形缓冲区中放置一个新的 DMA 缓冲区。 驱动程序在初始化时分配DMA缓冲区,并使用驱动程序直到停止运行。 ?...具体做法是,在第230行,通过pci_register_driver()函数将e1000_driver这个驱动程序注册到PCI子系统。...下面是struct pci_driver一些主要的域。 ? 对该驱动程序稍微了解后,先跳过其他部分,直接看DMA相关代码。

4.9K62

深入理解VFIO驱动框架

作者介绍: Jack,目前就职于通信行业某上市公司,主要从事Linux相关系统软件开发工作,负责基带芯片Soc芯片建模仿真以及虚拟化系统软件开发,基带芯片soc芯片BringUp及驱动开发,喜欢阅读内核源代码...VFIO是一个可以安全的把设备I/O、中断、DMA等暴露到用户空间,用户态进程可以直接使用VFIO驱动访问硬件,从而可以在用户空间完成设备驱动的框架。...在内核源码中代码路径为:drivers\vfio \pci\ vfio_pci.c 。pci_bus driver 是物理PCI 设备的驱动。...驱动PCI驱动,IOMMU 驱动以及内核态和用户态通过三个层面的接口示意图: 图3 应用程序和VFIO接口 03 VFIO 驱动主要数据结构 static struct vfio { struct...= NULL,这就表明在驱动加载的时候无法通过pci 总线match 到该设备驱动,需要用户主动绑定/解绑vfio-pci 设备才能调用pci 设备probe/remove 函数。

4.7K30

Dynamic DMA mapping Guide

对于驱动程序,它往往是通过ioremap()把物理地址B映射成虚拟地址C,这时候,驱动程序就可以通过ioread32(C)来访问PCI总线上的地址A了。...因此,驱动可以通过访问地址X来操作DMA buffer,但是PCI 设备并不能通过X地址来访问DMA buffer,因为MMU对设备不可见,而且系统内存所在的系统总线和PCI总线属于不同的地址空间。...根据上面的描述我们可以得出这样的结论:Linux可以使用动态DMA 映射(dynamic DMA mapping)的方法,当然,这需要一些来自驱动的协助。...驱动想要使用DMA mapping framework的API,需要首先包含相关头文件: #include 这个头文件中定义了dma_addr_t这种数据类型...十一、平台移植需要注意的问题 如果你仅仅是驱动工程师,并不负责将linux迁移到某个cpu arch上去,那么后面的内容其实你可以忽略掉了。

2.2K21

动态 DMA 映射指南-地址类型差异-DMA寻址能力-内核驱动-一致内存DMA-流式DMA-错误处理-平台兼容等

为了使 Linux 能够使用动态 DMA 映射,它需要驱动程序的一些帮助,即它必须考虑到 DMA 地址应该仅在实际使用时进行映射,并在 DMA 传输后取消映射。...首先,确保引入dma-mapping.h头文件 #include 在您的驱动程序中,以上头文件提供了 dma_addr_t 的定义。...关于 PCI 的特别说明:PCI-X 规范要求 PCI-X 设备支持所有事务的 64 位寻址 (DAC)。...此外,在某些平台上,您的驱动程序可能需要以与刷新 PCI 桥中的写入缓冲区大致相同的方式刷新 CPU 写入缓冲区(例如,在写入寄存器的值后读取该值)。...我们单独对待 ADDR 和 LEN,因为实现可能只需要地址即可执行取消映射操作 平台问题 如果您只是为 Linux 编写驱动程序并且不维护内核的体系结构端口,您可以安全地跳到“结束” 1)构造聚散列表(

27310

VFIO(Virtual Function IO)研究

VFIO原理 VFIO把设备通过IOMMU映射的DMA物理内存地址映射到用户态中,让用户态程序可以自行操纵数据的传输,还可以自行注册中断处理函数,从而在用户态下实现设备的驱动程序....IOMMU ---- 基础功能 地址翻译 IOMMU可以将能直接访问memory的IO总线(DMA–capable)连接到RAM中....如果没有IOMMU,DMA也能直接访问RAM中的内容,但是让DMA没有限制地访问RAM是一件很危险的事情,而IOMMU能够对这个过程加以限制,当DMA访问的地址合法时,IOMMU才返回正确的数据....要使用VFIO,必须在Linux启动时添加启动项intel_iommu=on,因为VFIO的底层依赖IOMMU....将设备与对应的驱动解绑 为了将设备透传到虚拟机中,需要将设备与其对应的驱动解绑,这样该设备就可以使用VFIO的驱动了.注意,不仅要将要透传的设备解绑,还要将与设备同iommu_group的设备都解绑,才能透传成功

4.6K30

CentOS下查看电脑硬件设备属性命令

Linux查看硬件信息及驱动设备   用硬件检测程序kudzu探测新硬件:service kudzu start ( or restart)   查看CPU信息:cat /proc/cpuinfo   ...环境开发驱动程序,首先要探测到新硬件,接下来就是开发驱动程序。   ...包括bios、cpu、内存等信息   dmesg | more 查看硬件信息   对于“/proc”中文件可使用文件查看命令浏览其内容,文件中包含系统特定信息:   Cpuinfo 主机CPU信息   Dma...主机DMA通道信息   Filesystems 文件系统信息   Interrupts 主机中断信息   Ioprots 主机I/O端口号信息   Meninfo 主机内存信息   Version Linux...很可能由于要安装驱动或其它的需要查看PCI设备的详细信息。lspci命令方便地实现了这一点。 lspci最简单的使用方法是: lspci它显示出通常对我们最有用的信息。

3K20

pcie总线授时卡的使用

为了得到更高的传输效率,在使用 PCIe总线进行数据传输时往往需要使用 DMA 的传输方式。 PCIe总线技术是取代PCI的第三代 I/O 技术,也称为 3GIO。...北斗/GPS 双模授时方法,结合先进的接口芯片来驱动 PCI Express 总线,利用具有低功耗、实时性强等性能的数字可编程器件(FPGA)来进行电路设计,使得时间同步装置与PC机之间信息交换变得简单易用...内置高精度授时型GPS/BD双模接收机; (3)外参考失锁后依靠内置高精度时钟守时; (4)支持即插即用(Plug and Play); (5)输出秒脉冲(PPS)时标同步脉冲信号; (6)Windows/Linux...PCIe接口的DMA传输的设计方案,此方案可以稳定快速地实现 PCIe 总线的DMA传输。...经测试,DMA传输方案在传输带宽方面满足设计要求。

1.2K00

IOMMU(二)-从配置说起

惠伟:DMA和IOMMU(一)-简单介绍​zhuanlan.zhihu.com 做过DPDK/SPDK开发或者用kvm做过pci passthrough的一定知道以下的配置: BIOS中enable vt-d...enable vt-d 意思很明确,BIOS收集IOMMU硬件相关的信息以及它和PCI设备连接关系的信息,通过ACPI的表上报给操作系统 intel_iommu=on 用intel_iommu驱动驱动...早期kvm pci passthrough的实现,qemu用到的参数是-device pci-assign,host=01:00.0,kvm最终调用了iommu的代码domain_pfn_mapping...总结 iommu=pt并不会影响kvm/dpdk/spdk的性能,这三者本质上都是用户态驱动,iommu=pt只会影响内核驱动,能让内核驱动设备性能更高。...,推荐都用vfio-pci,后面kvm中的pci-assign,DPDK/SPDK用到的igb_uio都得淘汰。

6.1K03

虚拟化硬件加速-vdpa

vdpa vdpa是virtio控制面软件模拟,数据面硬件实现,控制面复杂用硬件实现难,数据面简单用硬件实现容易,厂商自己实现自己的驱动,数据是用dma mapping直接从虚拟机内存手动物理硬件上,硬件再...vxlan处理或者对接ceph,听起来有点vfio-mdev的感觉,vfio只能处理pci通用结构和流程,vfio-mdev处理那些硬件实现不了sr-iov功能的设备,也就是硬件不能模拟出pci标准结构的哪些硬件...VDPA support for Mellanox ConnectX devices linux/drivers/vdpa/mlx5 at master · torvalds/linux http://...lkml.iu.edu/hypermail/linux/kernel/2008.1/02434.html Linux kernel source tree 两种方式都需要qemu支持vdpa,一种是vhost-user...热迁移 如果硬件支持停止DMA并且有地方记录DMA写内存的dirty log,那么就可以热迁移,如果硬件不支持需要软件辅助。

1.6K20
领券