Chinaunix首页 | 论坛 | 博客
  • 博客访问: 713641
  • 博文数量: 60
  • 博客积分: 2849
  • 博客等级: 少校
  • 技术积分: 1011
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-10 15:38
文章分类
文章存档

2013年(4)

2012年(11)

2011年(5)

2010年(3)

2009年(9)

2008年(19)

2007年(9)

分类: C/C++

2010-11-17 17:10:57

刚开始编写jinix时,bitops.h使用的linux-2.4.18代码(简单修改),
贴部分代码:
/**
 * __set_bit - Set a bit in memory
 * @nr: the bit to set
 * @addr: the address to start counting from
 *
 * Unlike set_bit(), this function is non-atomic and may be reordered.
 * If it's called on the same region of memory simultaneously, the effect
 * may be that only one operation succeeds.
 */
static __inline__ void __set_bit(int nr, volatile void * addr)
{
 __asm__(
  "btsl %1,%0"
  :"=m" (ADDR)
  :"Ir" (nr));
}
最近定位jinix其中一个bug,发现这个函数并没有起作用,和手上2.6.24内核比较一下,
它的定义如下:
static __inline__ void __set_bit(int nr, volatile void * addr)
{
 __asm__(
  "btsl %1,%0"
  :"+m" (ADDR)
  :"Ir" (nr));
}
也就是ADDR内存属性由‘=m’只写改成了‘+m’可读可写,
上面的代码在gcc-3.4.6+binutils-2.18 执行都正常,
换了gcc-4.4.4+binutils-2.20.1就挂了。
the fuck source code!!
 
阅读(1280) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-18 17:32:52

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com