首页
学习
活动
专区
圈层
工具
发布

物理地址读写驱动

正文 没有用MmMapIoSpace,用了映射的方式对物理地址数据进行读写,之前测试MmMapIoSpace在win10较高版本用不了,貌似是不支持了。...用法和效果如下,加载驱动后,Read.exe用来读取物理地址的数据,限制为0x100字节大小,当然可以通过修改驱动代码来读取任意字节,我这里只是给了个demo;Write.exe则是对指定的物理地址进行写操作...,限制了写入的大小为DWORD32,这里也可以通过修改驱动代码进行调整。...注 不是驱动大佬,可能驱动代码写的并不是很好,如果有什么意见或者驱动存在了蓝屏的问题,欢迎指出和指导 /* function 读取物理地址,大小为FF argv MapAddress:物理地址映射出来的地址...NTSTATUS status; PVOID BaseAddress = NULL; // 映射的虚地址 DWORD32 offset; LARGE_INTEGER SectionOffset; //存放物理地址

3.2K40

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

学了这么多驱动,不难推出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops   -> 2.1)file_operations里设置DMA硬件相关操作,...来启动DMA 由于我们是用字符设备的测试方法测试的,而本例子只是用两个地址之间的拷贝来演示DMA的作用,所以采用字符设备方式编写 1.驱动编写之前,先来讲如何分配释放缓冲区、DMA相关寄存器介绍、使用..., //handle:物理地址 (PS: dma_free_writecombine()其实就是dma_free_conherent(),只不过是用了#define重命名而已。)...而我们之前用的内存分配kmalloc()函数,是不能用在DMA上,因为分配出来的内存可能在物理地址上是不连续的. 1.2 那么2440开发板如何来启动DMA,先来看2440的DMA寄存器 (PS:实际这些...,还是直接两个地址之间的拷贝 -> 2.2)若是DMA启动,则设置DMA的相关硬件,并启动DMA传输 2.1 所以,驱动代码如下所示: #include #include

5.3K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    内核管理设备资源,如寄存器, 将其视为物理地址, 存储在/proc/iomem 中。驱动程序不能直接使用该物理地址, 它必须使用 ioremap() 来映射它们的物理地址空间并生成虚拟地址。...当驱动程序声明一个设备时,它通常使用 ioremap() 将物理地址 B 映射到虚拟地址 (C)。 然后它可以使用 ioread32(C) 等来访问总线地址 A 处的设备寄存器。...如果设备支持 DMA,驱动程序会使用 kmalloc() 或类似接口设置缓冲区,该接口返回虚拟地址 (X)。 虚拟内存系统将 X 映射到系统 RAM 中的物理地址 (Y)。...驱动程序可以使用虚拟地址 X 来访问缓冲区,但设备本身不能,因为 DMA 不经过 CPU 虚拟内存系统。 在一些简单的系统中,设备可以直接对物理地址 Y 进行 DMA。...但在许多其他系统中,有 IOMMU 硬件将 DMA 地址Z转换为物理地址Y,例如,它将 Z 转换为 Y。

    3.5K10

    Dynamic DMA mapping Guide

    当然,驱动并不能直接使用这些物理地址,必须首先通过ioremap()接口将这些物理地址映射到内核虚拟地址空间上去。 I/O设备使用第三种地址:“总线地址”。...对于驱动程序,它往往是通过ioremap()把物理地址B映射成虚拟地址C,这时候,驱动程序就可以通过ioread32(C)来访问PCI总线上的地址A了。...如果PCI设备支持DMA,那么在驱动中我们可以通过kmalloc或者其他类似接口分配一个DMA buffer,并且返回了虚拟地址X,MMU将X地址映射成了物理地址Y,从而定位了DMA buffer在系统内存中的位置...的时候,需要知道物理地址,有线性关系的虚拟地址很容易可以获取其物理地址,但是对于vmalloc分配的虚拟地址,我们需要遍历页表才可以找到其物理地址。...这时候,驱动中的全局定义的DMA buffer不在内核的线性映射区域,其虚拟地址是在模块加载的时候,通过vmalloc分配,因此这时候如果DMA buffer如果大于一个page frame,那么实际上我们也是无法保证其底层物理地址的连续性

    3K21

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

    3.1.1.1 DMA物理地址重映射 (DMA Remapping ) 1)地址空间隔离 在没有iommu的时候,用户态驱动可以通过设备dma可以访问到机器的全部的地址空间,如何保护机器物理内存区对于用户态驱动框架设计带来挑战...引入iommu以后,iommu通过控制每个设备dma地址到实际物理地址的映射转换,可以实现地址空间上的隔离,使设备只能访问规定的内存区域,见图3.1.1.1.1。...图3.1.1.1.1 2)GPA(虚拟机物理地址) --> HPA(宿主机物理地址) 物理PCI设备通过直通的方式进入到虚拟机的客户机时,客户机设备驱动使用透传设备的DMA访问虚拟机内存物理地址时,IOMMU...PCI设备的DMA时,QEMU会将上述操作通过VFIO接口下发给物理PCI设备的DMA,物理设备DMA收到GuestOS中的物理地址GPA,通过IOMMU的映射,找到Host主机物理内存的物理地址HPA...当GuestOS中直通设备的驱动分配内存并配置DMA时,QEMU通过VFIO接口将GPA下发到PCI Device的DMA,DMA读取数据时经由IOMMU映射,找到相应的HPA。 图3.2.1.1

    13.9K54

    DMA方式

    1.DMA方式的特点 主存和DMA接口之间有一条直接数据通路。由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。...2.DMA控制器的组成 对数据传送过程中进行控制的硬件称为DMA控制器(DMA接口)。...当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后让出系统总线,由DMA控制器接管总线进行数据传送。 1)接受外设发出的DMA请求,并向CPU发出总线请求。...DMA请求触发器:每当I/O设备准备好数据后给出一个控制信号,使DMA请求触发器置位。...由此可见,DMA控制器必须具有控制系统总线的能力。 3.DMA的传送方式 主存和DMA控制器之间有一条数据通路,因此主存和I/O设备之间交换信息时。不通过CPU。

    5K12

    DMA和IOMMU(一)-简单介绍

    内核态DMA驱动和DMA API 一般外设都自带DMA功能,DMA只是外设的数据传输通道,外设的功能各不一样,但DMA传输数据通道功能都一样,所以内核就有了DMA API,其它外设驱动只要调用内核DMA...dma_ops = &nommu_dma_ops; i40e_alloc_mapped_page └─dma_map_page └─nommu_map_page 用户态DMA驱动 外设通过...正好可以获取虚拟地址对应的物理地址。...第二个问题是怎么保证虚拟地址对应的物理地址一定存在于内存中并且固定在内存中的同一个物理地址,虚拟地址一定有对应的物理地址好说,可以直接把page的ref加1,并且强行给page写个0数据,但虚拟地址固定对应到一个物理地址就难说了...其实IOMMU更大的用处在于用户态驱动,如DPDK和qemu,用于qemu passthrough能更好的理解IOMMU的作用,guest发起DMA时设置的地址是guest_phy_addr,qemu拿到

    7.8K13

    什么是DMA?DMA究竟有多快!

    直接内存访问(Direct Memory Access,DMA):在计算机体系结构中,DMA 是一种数据传输方式,允许外部设备直接访问计算机的内存,而无需通过中央处理单元(CPU)的干预。...那么,DMA究竟有多快呢? 实践出真知 恰好,最近有个多通道数据采集的项目,受限于通道数多、分辨率高,而系统带宽有限,为了尽可能充分利用有限带宽,就得想办法优化时序,把时间都留给数据采集和传输。...优化方向就是DMA。 硬件链路是ADC通过SPI接口将数据发送给STM32单片机,单片机再将数据发送到上位机。 咱们的目标就是优化SPI这边,先看普通采集模式。...再看下,开启DMA之后的效果。SPI可以连续工作,时钟速率稳定在20MHz,高效工作。 这就是DMA的强大之处! 问题来了,为什么上图中的波形,有这么大的震荡呢?

    1.8K10

    06-HAL库硬件SPI DMA驱动LCD并移植LVGL 8.3

    1、本节内容介绍 1.1、HAL库硬件SPI DMA在cubemx中的配置及注意事项; 1.2、HAL库SPI DMA详解与结构介绍; 1.3、使用SPI DMA驱动LCD显示屏并移植LVGL V8.3...2.2、SPI DMA代码详解 先来看上面配置生成的代码,主要就是DMA的模式配置参数 /* SPI1 DMA Init */ /* SPI1_TX Init */ hdma_spi1...hspi); HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); 主要就是发送、接收,以及接收暂停、接受恢复、接收停止功能函数,本次驱动...(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); 2.3 LCD驱动函数改造 上一章节中我们使用的是SPI驱动的LCD,并没有加入DMA...,本章节咱们对驱动函数进行改造,加入DMA驱动,只需要把我们的SPI发送函数改为DMA发送函数即可,以下几个函数同理改动 // ST7789写函数 static HAL_StatusTypeDef lcd_st7789

    4.4K11

    内存管理五大技术概念:MMU、IOMMU、MMIO、mmap、ioremap

    在驱动开发方面,开发人员不需要掌握专用指令,使用和内存操作一样的统一的编程方式就可以控制外设,这也降低了驱动开发的学习成本和实现成本。...CPU 先通过ioremap把 MMIO 物理地址转为内核虚拟地址,再通过 MMIO 配置网卡的 DMA 参数,将DMA的目标地址填成Step2的物理地址。...Step4,CPU 通过 MMIO 触发网卡 DMA(MMIO 操作) CPU 写 MMIO 的 DMA 启动寄存器,触发网卡发起 DMA 请求。...网卡收到 MMIO 的 “启动指令” 后,立即发起 DMA 请求 Step 5,IOMMU 管控网卡 DMA 请求(地址转换 + 权限校验) IOMMU将物理地址转成宿主机真实物理地址,并校验权限看是否越权...(2)驱动在初始化时调用ioremap(phys_addr, size)。 (3)内核在其虚拟地址空间找一段空闲的虚拟地址,并建立该虚拟地址到设备物理地址的页表映射。 (4)函数返回一个内核虚拟地址。

    3.7K13

    DPDK 网卡收包流程

    描述符中的缓冲区地址是 DMA 使用的物理地址; 3. 驱动通知网卡有一个新的描述符; 4. 网卡从 rx ring buffer 中取出描述符,从而获知缓冲区的地址和大小; 5....l分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。...l驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。...lrx_ring主要存储报文数据的物理地址,物理地址供网卡DMA使用,也称为DMA地址(硬件使用物理地址,将报文copy到报文物理位置上)。...,网卡DMA将报文数据通过该物理地址写入对应的内存空间。

    5K33

    傻傻分不清楚的MDMA, DMA1,DMA2, DMA2D,BDMA?

    如SDRAM, QSPI,SPI等,H743里面DMA比较多,也较复杂,有DMA2D,MDMA, BDMA,DMA1,DMA2等等,使用时候注意区分。 MDMA 先来看看MDMA的框图概览 ?...DMA H743有两个DMA,分别为DMA1和DMA2, ? ? ?...像ADC,UART,SPI,SD卡等外设都支持DMA传输和操作,都有相应例程,比如我在SPI和另一个芯片通信就使用DMA2来传输。 ? ?...DMA的知识和篇章在参考手册中有很多介绍需要详细阅读和参考,结合例程。 DMA2D DMA2D是专门用于图像处理加速的DMA,我们在做屏的驱动时候可以充分考虑使用。 ?...手册中有几十页都是来讲DMA2D的,这个功能还是很好的,如果你使用H743做屏幕类相关产品,这个要用起来。例如我在移植emWIN作为图形界面时候驱动就使用了DMA2D. ? ?

    3.8K20

    5、DMA 技术

    DMA 技术: DMA 技术,也就是直接内存访问(Direct Memory Access) 技术。...DMA 技术:在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器, 而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务。...执行其他任务; 3、DMA 进一步将 I/O 请求发送给磁盘; 4、磁盘收到 DMA 的 I/O 请求,把数据从磁盘读取到磁盘控制器的缓冲区中,当磁盘控制器的缓冲区被读满后, 向 DMA 发起中断信号...,告知自己缓冲区已满; 5、DMA 收到磁盘的信号,将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中,此时不占用 CPU,CPU 可以执行其他任务; 6、当 DMA 读取了足够多的数据,就会发送中断信号给...CPU; 7、CPU 收到 DMA 的信号,知道数据已经准备好,于是将数据从内核拷贝到用户空间,系统调用返回;

    80310

    【翻译】什么是 文件 IO

    物理地址对驱动程序并不直接有用;它必须使用 ioremap() 来映射空间并生成虚拟地址。...当驱动程序声明一个设备时,它通常使用 ioremap() 将物理地址 B 映射到虚拟地址 (C)。然后,它可以使用例如 ioread32(C) 来访问总线地址 A 处的设备寄存器。...如果设备支持 DMA,驱动程序会使用 kmalloc() 或类似的接口设置一个缓冲区,该接口返回一个虚拟地址 (X)。 虚拟内存系统会将 X 映射到系统 RAM 中的物理地址 (Y)。...在一些简单的系统中,设备可以直接对物理地址 Y 执行 DMA。 但在许多其他系统中,有 IOMMU 硬件将 DMA 地址转换为物理地址,例如,将 Z 转换为 Y。...这是 DMA API 的部分原因:驱动程序可以将虚拟地址 X 提供给像 dma_map_single() 这样的接口,该接口设置任何所需的 IOMMU 映射并返回 DMA 地址 Z。

    53710

    IOMMU(四)-dma remapping

    惠伟:IOMMU(三)-初始化​zhuanlan.zhihu.com DMA remapping就是在DMA的过程中IOMMU进行了一次转换,MMU把CPU的虚拟地址(va)转换成物理地址(pa),IOMMU...的作用就是把DMA的虚拟地址(iova)转换成物理地址(pa),MMU转换时用到了pagetable,IOMMU转换也要用到io pagetable,两者都是软件负责创建pagetable,硬件负责转换...IOMMU的作用就是限制DMA可操作的物理内存范围,当一个PCI设备passthrough给虚拟机后,PCI设备DMA的目的地址是虚拟机指定的,必须要有IOMMU限制这个PCI设备只能操作虚拟机用到的物理内存...DMA类型 Requests without address-space-identifier DMA中只带了source-id,也就是PCI设备的bus/dev/funtion。...first level的PML4E,这个指针指向的并不是真正的物理地址,只有经过second level转换一下才能变成真正的物理地址,才能获取first level的PML4E表,从PML4E中得到PDPE

    3.1K31

    ZYNQ中DMA与AXI4总线-DMA简介

    综上,在ZYNQ中DMA和AXI是不可分割的两者,所以介绍DMA也是必须的。...使用DMA时,CPU向DMA控制器发送一个存储器传输请求,这样当DMA控制器在传输的时候,CPU执行其他的操作,传输完成时DMA以中断的方式通知CPU。 DMA传输过程的示意图为: ?...图4‑35 DMA传输过程的示意图 DMA的传输过程为: 1、为了配置用DMA传输数据到存储器,处理器(Cortex-A9)发出一条指令。...而DMA就不同了,一般系统中的DMA都有突发(Burst)传输的能力,在这种模式下,DMA能一次传输几个甚至几十个字节的数据,所以使用DMA能使设备的吞吐能力大为增强。...DMAC为DMA控制器 DMA传送虽然脱离CPU的控制,但并不是说DMA传送不需要进行控制和管理。通常是采用DMA控制器来取代CPU,负责DMA传送的全过程控制。

    4.3K22

    虚拟化技术概述(一)1. 虚拟化概述2. 虚拟化分类3. 虚拟化的实现

    /硬件资源 物理地址 用于索引物理地址空间; 分页和分段机制都启动:逻辑地址 -> 线性地址 -> 物理地址 分段启动,分页不启动:逻辑地址 -> 线性地址 = 物理地址 Address Space...虚拟机维护 客户机物理地址 / GPA 到 宿主机物理地址 / HPA 的映射; 2....,会占用 CPU 时间降低系统性能); 根据 DMA 的特性,如果一个 I/O 设备是支持 DMA 的,那么我们可以绕过处理器来直接访问目标内存(如果设备的驱动未加修改,那么设备模拟器接收到的 DMA...设备模型 是虚拟机设备驱动(Device Driver)和实际设备驱动之间的一个模块; 当客户机请求 I/O,作为内核模块的 VMM 会将 I/O 请求进行拦截,然后通过宿主机的内核态-用户态接口,传递给用户态的...DMA-Remapping (DMA 重映射)硬件,如下图中的右图(DMA-Remapping HW); 这样的话,虚拟机中对于 I/O 设备的访问,都会被 DMA 重映射硬件 截获,然后查找对应 I

    18.9K56
    领券