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

物理地址读写驱动

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

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

    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

    3.8K90

    动态 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。

    75110

    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,那么实际上我们也是无法保证其底层物理地址的连续性

    2.3K21

    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拿到

    6.4K13

    深入理解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的DMADMA读取数据时经由IOMMU映射,找到相应的HPA。 图3.2.1.1

    8.5K41

    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。

    4K12

    什么是DMADMA究竟有多快!

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

    69710

    DPDK 网卡收包流程

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

    2.9K32

    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

    55810

    虚拟化技术概述(一)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

    13.8K45

    ARM SMMU的原理与IOMMU

    如上图所示,smmu 的作用和mmu 类似,mmu作用是替cpu翻译页表将进程的虚拟地址转换成cpu可以识别的物理地址。...同理,smmu的作用就是替设备将dma请求的地址,翻译成设备真正能用的物理地址,但是当smmu bypass的时候,设备也可以直接使用物理地址来进行dma; 1.2: smmu 的数据结构 smmu的重要的用来...如上图,基本可以很明显的概括出了一个外设请求 smmu 的地址翻译的基本流程,当一个外设需要dma物理地址的时候,开始请求smmu的地址翻译,这时候外设给 smmu 3个比较重要的信息,分别是:streamid...2.3 dma iova 与iommu dma 和 iommu 息息相关,iommu的产生其实很大的原因就是避免dma的时候直接使用物理地址而导致的不安全性,所以就产生了iova, 我们在调用dma alloc...的时候,首先在io 的地址空间中分配你一个iova, 然后在iommu所管理的页表中做好iova 和dma alloc时候产生的物理地址进行映射;外设在进行dma的时候,只需要使用iova即可完成dma

    5.6K23

    DMA技术原理

    05 STM32少个DMA资源? 对于大容量的STM32芯片有2个DMA控制器,DMA1有7个通道,DMA2有5个通道。每个通道都可以配置一些外设的地址。...在这里插入图片描述 有DMA传输: 有DMA的话, DMA传输时外设对DMA控制器发出请求。 DMA控制器收到请求,触发DMA工作。...07 DMA传输方式 方法1:DMA_Mode_Normal,正常模式 当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次。...当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。...17 DMA中断标志清除寄存器 (DMA_IFCR) DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 0 清除。

    2.7K30

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

    接着驱动程序将网络数据包传给内核的其它部分处理,并在环形缓冲区中放置一个新的 DMA 缓冲区。 驱动程序在初始化时分配DMA缓冲区,并使用驱动程序直到停止运行。 ?...这里就以该网卡的驱动程序为例,初步分析它是怎么建立DMA机制的。 源码目录及文件: ? 内核模块插入函数在e1000_main.c文件中,它是加载驱动程序时调用的第一个函数。...对该驱动程序稍微了解后,先跳过其他部分,直接看DMA相关代码。...dma_mask表示的是该设备通过DMA方式可寻址的物理地址范围,coherent_dma_mask表示所有设备通过DMA方式可寻址的公共的物理地址范围, 因为不是所有的硬件设备都能够支持64bit的地址宽度...其实这个函数还隐式的返回了物理地址物理地址存在第三个参数中。 指针rxdr指向的是struct e1000_rx_ring这个结构体,该结构体就是接收环形缓冲区。 ?

    5.2K62

    虚拟化与云计算硬核技术内幕 (12) —— 独立自主,自力更生 (中)

    而半虚拟化的出现,让虚拟机可以通过前端和后端驱动直接使用真实硬件,具备较高的性能。它的问题在于,需要在GuestOS中安装Hypervisor提供的驱动。...这样,在驱动程序中,对所有PCIe设备不使用in和out这样的IO指令操作,而是使用普通的内存读写指令进行操作。...IOMMU的功能,就是帮助虚拟机完成把虚拟机上的虚拟地址GVA,虚拟机上的物理地址GPA,宿主机上的物理地址HPA相互转换的工作。...当PCIE设备完成第一阶段的初始化后,驱动程序会向操作系统申请用于给外设进行DMA的内存空间。显然,GuestOS向操作系统申请到的内存地址是GVA。...同时,由于GuestOS上的内核与驱动都没有做任何修改,驱动程序会调用操作系统提供的dma_map_page()函数,将GVA翻译为GPA,并将这个地址提供给PCIE设备。

    82310

    解惑IOMMU

    )就只接受物理地址,所以CPU要把一个地址告诉设备,就只能告诉物理地址。...在设备做DMA访问内存的时候,系统返回给设备驱动的不再是物理地址,而是虚拟地址,这个地址一般叫IOVA,设备访问内存时,由IOMMU来将这个虚拟地址转换为物理地址。...但是当iommu bypass的时候,设备也可以直接使用物理地址来进行dma。 看到这里大家会看到,这怎么这么像MMU呢?...是的,两者都是可以把虚拟地址翻译为物理地址,MMU是将CPU发出的虚拟地址通过页表翻译为物理地址,IOMMU是将设备发出的虚拟地址IOVA通过页表翻译为物理地址。...每个IOMMU硬件单元负责管理挂载到它所在的PCIe Root Port下所有设备的DMA请求。

    5.5K21

    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

    2.4K31
    领券