之前修改过的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。
阅读(3080) | 评论(2) | 转发(0) |