函数ERR_PTR,PTR_ERR还有IS_ERR理解

转载 2012年03月30日 13:55:12
http://hi.baidu.com/coffeelinux/blog/item/a7e6911a9c5c34d2ac6e75cd.html
2008-11-20 16:53

      许多的内核函数需要返回一个指针,但是函数的调用可能失败,一般我们处理这样的情形都是返回一个NULL指针,就像malloc或kmalloc在没有获得指定的空间申请时的返回值一样。但是有时我们想知道导致函数失败的原因,但是返回NULL就显得信息不够。因此有些函数返回一个实际的错误编码以便对引起错误的原因做一些处理。很多内核接口通过把错误值编码到一个指针值中来返回错误信息。当处理这样的函数时,判断是否成功调用就不能是简单的和NULL进行比较。为了方便使用这样的类型接口,2.6的内核在linux/err.h中实现了三个内联函数:

#define MAX_ERRNO 4095

#ifndef __ASSEMBLY__

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)

static inline void *ERR_PTR(long error)
{
return (void *) error;
}

static inline long PTR_ERR(const void *ptr)
{
return (long) ptr;
}

static inline long IS_ERR(const void *ptr)
{
return IS_ERR_VALUE((unsigned long)ptr);
}

所幸的是,内核返回的指针一般是指向页面的边界(4K边界),即

ptr & 0xfff == 0


这样ptr的值不可能落在(0xfffff000,0xffffffff)之间,
而一般内核的出错代码也是一个小负数,在-1000到0之间,转变成unsigned long,
正好在(0xfffff000,0xffffffff)之间。因此可以用

(unsigned long)ptr > (unsigned long)-1000L


来判断内核函数的返回值是一个有效的指针,还是一个出错代码。


linux内核中的IS_ERR

linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR()在看内核源码的时候,经常会遇到IS_ERR,比如在 linux/arch/arm/kernel/sys_arm.c中asmli...
  • ce123
  • ce123
  • 2013年01月02日 13:14
  • 7205

内核层读写应用层文件,使用filp_open函数。

转载:http://soft.chinabyte.com/os/421/11398421.shtml 有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据。在kerne...
  • Diwat
  • Diwat
  • 2015年03月31日 13:00
  • 3925

springmvc非常详细的解释@Autowired

关键点: 1、@Qualifier: 有多个Bean时,指定加载哪个bean   @Qualifier("office") 中的 office 是 Bean 的名称,所以 @A...
  • bestone0213
  • bestone0213
  • 2015年06月19日 14:20
  • 3978

Linux中IS_ERR()函数的理解

在Linux源码中的fs部分,经常会碰到这样的函数(位于kernel/include/linux/fs.h): /*  * Kernel> static>      retval = PT...
  • xuweigaoqin
  • xuweigaoqin
  • 2013年12月25日 22:06
  • 456

ERR_PTR()

ERR_PTR():产生错误地址 IS_ERR():判断地址是否错误 PTR_ERR():还原错误码 linux 驱动程序中往往会在产生错误时对错误调用PTR_ERR]进行转换,如下所示 ...
  • beijihu_
  • beijihu_
  • 2013年01月15日 22:12
  • 238

IS_ERR()函数详解

内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。 1)合法指针...
  • qq_27312943
  • qq_27312943
  • 2015年11月23日 20:52
  • 412

对内核源码中IS_ERR的理解

今天在看内核源码时,看到一个判断指针是否是错误指针或无效指针的函数IS_ERR(2.6.11内核,include/linux/err.h中),其源码如下:    static inline long...
  • moonvs2010
  • moonvs2010
  • 2012年07月26日 18:41
  • 1207

对内核源码中IS_ERR的理解

转载自http://blog.csdn.net/moonvs2010/article/details/7790422  作者:moonvs2010     今天在看内核源码时,看到一个判断指针是...
  • tobyaries
  • tobyaries
  • 2012年11月29日 16:47
  • 507

linux内核中的IS_ERR

linux内核中的IS_ERR   linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR() 在看内核源码的时候,经常会遇到IS_ERR,比如在 linux/arch/arm/...
  • SongCdut
  • SongCdut
  • 2013年04月03日 19:54
  • 596

linux内核中的IS_ERR

linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR() 在看内核源码的时候,经常会遇到IS_ERR,比如在 linux/arch/arm/kernel/sys_arm.c中 ...
  • SdustLiYang
  • SdustLiYang
  • 2014年04月17日 14:35
  • 508
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数ERR_PTR,PTR_ERR还有IS_ERR理解
举报原因:
原因补充:

(最多只允许输入30个字)