文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>x86下面dma地址的长度

x86下面dma地址的长度

时间:2009-04-11  来源:CUDev

之前修改过的e1000 driver的代码总是存在一些问题,曾经测试不同机器、不同发行版、不同内核版本,都没有确定最终的原因,也没有fix这个bug。

今天在部署e1000 driver的时候,发现smp版本下能够正常运转;考虑到8G的内存只使用3G有些亏,就装了一个bigmem的内核,发现driver工作异常了。莫非是因为开启了大内存支持,导致driver工作异常?

之前一直认为x86_32下面,dma地址就是32位的;x86_64下面,dma地址就是64位的。所以,之前dma地址,我使用unsigned long进行的表示,自认为很巧妙,无论是x886_32还是x86_64都可以完美的得到正确的dma地址长度,正确的运行。结果发现,我错了......

查了一下内核代码:
arch/x86/include/asm/types.h:
#if defined(CONFIG_X86_64) || defined(CONFIG_HIGHMEM64G)
/* DMA addresses come in 32-bit and 64-bit flavours. */
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif

在X86_64和HIGHMEM64G的时候,dma地址都是64位的。

我再也不自作聪明的使用unsigned long来表示dma的地址了,还是老老实实的使用内核的dma_addr_t来表示吧。

BTW: page_to_phys()返回的物理地址也是dma_addr_t类型的。现在来看,dma_addr_t并不仅仅是用来表示dma的地址,而是一个物理地址的表示类型。因此,在表示物理地址的时候,应该使用dma_addr_t。
相关阅读 更多 +
排行榜 更多 +
剑术大乱斗

剑术大乱斗

动作格斗 下载
南钛HSSE

南钛HSSE

商务办公 下载
柱子

柱子

动作格斗 下载