分配DMA缓冲区时LogicalAddress与PhysicalAddress的疑惑
来源:互联网 发布:数据分析常用软件 编辑:程序博客网 时间:2024/06/07 06:51
DMA操作前需要分配物理地址连续的一个Buffer,AllocateCommonBuffer函数提供了这个功能,该函数原型如下:
PVOID AllocateCommonBuffer( _In_ PDMA_ADAPTER DmaAdapter, _In_ ULONG Length, _Out_ PPHYSICAL_ADDRESS LogicalAddress, _In_ BOOLEAN CacheEnabled);
第三个参数有点不是很能理解,PPHYSICAL_ADDRESS LogicalAddress, 至少从定义的变量名上看,微软似乎在暗示我:逻辑地址和物理地址是相同的 这样一个事实。
虚拟地址到物理地址的转化方法是与体系结构相关的。有分段、分页两种方式。x86 cpu下 分段分页都是支持的。MMU负责从虚拟地址到物理地址的转化。逻辑地址是段标识+段内偏移量的形式,MMU通过查询段表,可以把逻辑地址转化为线性地址。如果cpu没有开启分页功能,那么线性地址就是物理地址;如果cpu开启了分页功能,MMU还需要查询页表来将线性地址转化为物理地址,不同的逻辑地址可以映射到同一个线性地址上;不同的线性地址也可以映射到同一个物理地址上;所以是多对一的关系。另外,同一个线性地址,在发生换页以后,也可能被重新装载到另外一个物理地址上。所以这种多对一的映射关系也会随时间发生变化。
逻辑地址,线性地址,物理地址的关系总结如下:
逻辑地址(段机制转换)----> 线性地址(页机制转换)---->物理地址
从另一方面讲,在32位系统下使用32位的PCIe卡,即使逻辑地址和物理地址是相同的,但在64位的系统下,AllocateCommonBuffer返回的物理地址可能高于4GB,但逻辑地址肯定是低于4GB的,这种情况下逻辑地址和物理地址不可能相等。由此个人认为PPHYSICAL_ADDRESS LogicalAddress 这种定义只是微软命名习惯上的差异,这里的LogicalAddress就是物理地址而并非传统意义上的逻辑地址。
- 分配DMA缓冲区时LogicalAddress与PhysicalAddress的疑惑
- linux3.10.65 DMA缓冲区分配失败
- 关于C/C++中内存分配与释放的疑惑?
- stm32F4 串口DMA+环形缓冲区的实现
- 帧缓冲设备显示缓冲区的分配与释放
- pchar手动分配内存的疑惑
- 关于多线程内存分配的疑惑
- 无阻塞日志打印 环形缓冲区与DMA
- DMA分配内存常用的几个函数
- SG DMA与普通DMA(block DMA)的区别
- BLE CC2541 DMA串口查询方式环形缓冲区的建立 与函数指针 回掉函数的使用
- C语言缓冲区&内存分配的理解
- 自动扩展分配的数据缓冲区
- netty源码分析(八)Netty的自适应缓冲区分配策略与堆外内存创建方式
- C#与API的疑惑
- bstr_t 与 SysAllocString 的疑惑
- java与.net的疑惑
- volatile 与 cache 的疑惑
- JavaScript quirk 3: 标准的等号(==)
- Hadoop JVM复用配置
- 命令行下运行java程序
- 【谷歌总裁施密特称谷歌眼镜上市尚需时日】
- Git: 修改提交记录
- 分配DMA缓冲区时LogicalAddress与PhysicalAddress的疑惑
- sockscap
- 黑马程序员--IO流(流操作规律)
- framework添加服务(实例)
- cpu-feature-flags-and-their-meanings
- TDD、ATDD、BDD敏捷测试相关书籍
- Android异步从网络下载图片并且缓存图片到本地的demo
- MySQl的ON DUPLICATE KEY
- 认识iTween插件和安装