Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5760543
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2009-04-11 16:04:23

之前修改过的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) |
给主人留下些什么吧!~~

kidrane2009-04-23 11:36:23

教训很惨痛啊!

kidrane2009-04-23 11:36:23

教训很惨痛啊!