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

Linux PCI和PCIe总线

3 Linux x86 PCIe调试 3.1 PCIe设备分类 – RC,BDF为00:00.0 – bridge就像hub,一般是个多功能的设备,传递数据需要仲裁,比较慢 – switch就像交换机...pcibios_init x86 BIOS专门提供了针对PCI总线的操作,这些操作里就包括了总线枚举的整个过程,Linux kernel中的宏CONFIG_PCI_BIOS。...在系统加电以后自检时,就会完成对PCI总线的枚举,之后LinuxPCI配置空间的访问都是通过BIOS调用的形式进行,提供有这些功能和服务的BIOS就称之为PCI BIOS 。...需要注意的是Linux x86_64是不采用PCI BIOS访问PCI配置空间的,而是内核实现了直接访问PCI配置空间的函数(CONFIG_PCI_DIRECT)。...所以Linux x86驱动程序中pci_read_config_byte()最终调用的是pci_bios_read_config_byte()。

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

深入理解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驱动框架...PCI设备直通时,GuestOS中的设备驱动操作虚拟PCI设备的DMA时,QEMU会将上述操作通过VFIO接口下发给物理PCI设备的DMA,物理设备DMA收到GuestOS中的物理地址GPA,通过IOMMU...的映射,找到Host主机物理内存的物理地址HPA,达到物理PCI设备直接访问GuestOS中的GPA,从而达到数据数据面加速。...当GuestOS中直通设备的驱动分配内存并配置DMA时,QEMU通过VFIO接口将GPA下发到PCI Device的DMADMA读取数据时经由IOMMU映射,找到相应的HPA。 图3.2.1.1

6.4K40

Linux驱动之PCI子系统剖析

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

3.2K20

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

我们先从计算机组成原理的层面介绍DMA,再简单介绍Linux网络子系统的DMA机制是如何的实现的。 一、计算机组成原理中的DMA 以往的I/O设备和主存交换信息都要经过CPU的操作。...总之,在同样的时间内,DMA方式下CPU执行现行程序的时间最长,即CPU的效率最高。 二、Linux网络子系统中DMA机制的实现 1....DMA机制在TCP/IP协议模型中的位置 网卡明显是一个数据流量特别大的地方,所以特别需要DMA方式和主存交换数据。...下一节在数据链路层上分析具体分析网卡是如何处理数据包的。 ? 2. 数据链路层上网卡对数据包的处理 DMA 环形缓冲区建立在与处理器共享的内存中。.../include/linux/dma-mapping.h /* * Set both the DMA mask and the coherent DMA mask to the same thing

4.9K62

linux | 数据包到网卡在通过DMA到内存过程

DMA 是一种硬件机制,它允许外围组件将其 I/O 数据直接传输到主内存或从主内存传输数据,而无需系统处理器参与传输。使用这种机制可以极大地增加进出设备的吞吐量,因为大量的计算开销被消除了。...对于第一种情况,所涉及的步骤可以概括如下: 当进程调用read时,驱动程序方法会分配一个 DMA 缓冲区并指示硬件传输其数据。进程进入休眠状态。 硬件将数据写入 DMA 缓冲区并在完成时引发中断。...中断处理程序获取输入数据、确认中断并唤醒进程,该进程现在能够读取数据。 第二种情况发生在异步使用 DMA 时。例如,即使没有人在读取数据数据采集设备也会继续推送数据,就会发生这种情况。...然后驱动程序将网络数据包传递给内核的其余部分,并在环中放置一个新的 DMA 缓冲区。 所有这些情况下的处理步骤都强调有效的 DMA 处理依赖于中断报告。.../content/queueing-linux-network-stack

2.6K20

virtio代码分析(一)-qemu部分

virtio内容众多,代码分布于qemu,linux,dpdk等中,而且分为frontend和backend,可以运行于userspace也可以运行于kernelspace,极其难以理解,不看代码只看原理性文档往往流于表面...以qemu和linux中的virtio-net举例分析代码,这儿只分析qemu部分virtio代码,在qemu中创建一个virtio-net设备,tap作为backend,有2个queue,那么qemu...=1450,mq=on,vectors=5,netdev=hostnet0,id=net0,mac=fa:16:3e:d8:fe:81,bus=pci.0,addr=0x3 我们先看数据结构NetClientState...//初始化virtio-pci设备 | └─vdev->dma_as = &address_space_memory;//分配dma_as └─memory_listener_register...和原来一样没有什么变化 qemu做virtio写元数据时如何和guest保证cache coherence? 一个host cpu写,另一个guest host已经读到cache中,怎么搞?

2.4K20

linux 内核全然剖析》 chapter 2 微型计算机组成结构

2.1 微型计算机的组成原理     当中CPU通过地址线,数据线,和控制信号线组成的内部总线与系统其它部分进行数据通信。地址线用于提供内存或者I/O设备的地址,即指明须要读写的数据的详细位置。...我的Ubuntu里面查看/proc/ioports 能够看到各个控制器设备或设置能够使用的地址范围: 0000-0cf7 : PCI Bus 0000:00 0000-001f : dma1 0020...linux 大多数都是採用这样的方式进行接口訪问。 直接存储器訪问,(Direct memory access),该方式用于IO设备与系统直接进行批量的传输数据,整个操作过程不须要CPU的插手。...2.4 控制器和控制卡 2.4.1 中断控制器 2.4.2 DMA控制器 DMA控制器主要是通过外部设备直接与内存数据传输来增强系统的性能。...DMA数据传输能够不受CPU控制,所以CPU能够做其它事情。

64220

Dynamic DMA mapping Guide

例如:即便是一个系统支持64位地址内存和64 位地址的PCI bar,但是DMA可以不使用全部的64 bit地址,通过IOMMU的映射,PCI设备上的DMA可以只使用32位DMA地址。...PCI设备会有BAR(base address register),表示自己在PCI总线上的地址,CPU并不能通过总线地址A(位于BAR范围内)直接访问总线上的PCI设备,PCI host bridge...根据上面的描述我们可以得出这样的结论:Linux可以使用动态DMA 映射(dynamic DMA mapping)的方法,当然,这需要一些来自驱动的协助。...驱动想要使用DMA mapping framework的API,需要首先包含相关头文件: #include 这个头文件中定义了dma_addr_t这种数据类型...十一、平台移植需要注意的问题 如果你仅仅是驱动工程师,并不负责将linux迁移到某个cpu arch上去,那么后面的内容其实你可以忽略掉了。

2.2K21

高性能网络 — SmartNIC、DPU演进与运行原理

Controller(以太网控制器) Ethernet Controller(以太网控制器)是网卡的核心部件,相当于计算机的主机(CPU + Memory),提供了主要的控制面功能,并通过 Driver(驱动程序)与 Linux...PCI-E 的最终目的是为了替代并统一 PCI、磁盘、网卡、显卡等外设的接口,解决计算机内部数据传输的瓶颈问题。...比起 PCI 以及更早期的计算机总线的共享并行架构而言,每个 PCI-E 设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽。...添加 DMA Engine 功能 添加 DMA Controller 和 DMA Interface,将 NIC Memory 直接映射到 Main Memory ZONE_DMA。...DPU 的抽象架构 控制平面 由通用处理器(x86 / ARM / MIPS)和片上内存实现,可运行 NIC OS(Linux),主要负责以下工作: DPU 设备运行管理 安全管理:信任根、安全启动、

65220

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

为了使 Linux 能够使用动态 DMA 映射,它需要驱动程序的一些帮助,即它必须考虑到 DMA 地址应该仅在实际使用时进行映射,并在 DMA 传输后取消映射。...首先,确保引入dma-mapping.h头文件 #include 在您的驱动程序中,以上头文件提供了 dma_addr_t 的定义。...关于 PCI 的特别说明:PCI-X 规范要求 PCI-X 设备支持所有事务的 64 位寻址 (DAC)。...例如,&pdev->dev 是指向 PCI 设备的设备结构的指针(pdev 是指向您设备的 PCI 设备结构的指针)。...,因为这种 PCI 设备在 PCI 前端的情况下可能有 ISA 芯片,因此保留了 ISA 的 16MB DMA 寻址限制。

25310

宋宝华:那些年你误会的Linux DMA(关于Linux DMA ZONE和API最透彻的一篇)

创作目的 互联网、Linux内核书籍上充满了各种关于Linux DMA ZONE和dma_alloc_coherent、dma_map_single等的各种讲解,由于很多童鞋缺乏自身独立的思考,人云亦云...DMA可以直接在内存和外设之间进行数据搬移,对于内存的存取来讲,它和CPU一样,是一个访问master,可以直接访问内存。...当然,如果是CPU写数据到内存,它也只是先写进cache(不一定进了内存),这个时候如果做一个内存到外设的DMA操作,外设可能就得到错误的内存里面的老数据。...), for example PCI PRI (Page Request Interface) or Arm SMMU stall....如果外设是个加速器,利用SVA,它可以访问到进程虚拟地址空间的数据进行运算,减少了很多不必要的互动,可以极大地提升系统性能。

6.6K46
领券