在linux-x.xx/include/uapi/asm-generic/errno-base.h和errno.h里分别定义了返回错误的信息。

errno-base.h:

 #ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H #define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
......
......
......
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */ #endif

errno.h:

 #define _ASM_GENERIC_ERRNO_H

 #include <asm-generic/errno-base.h>

 #define EDEADLK         35      /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
#define ENOLCK 37 /* No record locks available */
......
......
......
#define ERFKILL 132 /* Operation not possible due to RF-kill */ #define EHWPOISON 133 /* Memory page has hardware error */ #endif

以上可知错误信息在1~133之间,返回错误会添加-号,故返回-133~-1。

部分函数内部有记录错误的信息并且返回。

对于返回非指针的函数,一般返回-ERROR。对于返回指针的函数,需要把ERROR转化为指针。

ERR_PTR、PTR_ERR和IS_ERR定义在linux-x.xx/include/linux/err.h:

 #define MAX_ERRNO    4095

 #ifndef __ASSEMBLY__
EPERM
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
ERROR
static inline void * __must_check ERR_PTR(long error) //把错误转化指针
{
return (void *) error;
} static inline long __must_check PTR_ERR(const void *ptr) //把指针转化错误
{
return (long) ptr;
} static inline long __must_check IS_ERR(const void *ptr) //判断是否错误指针
{
return IS_ERR_VALUE((unsigned long)ptr);
} static inline long __must_check IS_ERR_OR_NULL(const void *ptr) //判断空指针或者错误指针
{
return !ptr || IS_ERR_VALUE((unsigned long)ptr);
}

重点关注IS_ERR的实现。首先把指针转化成long,然后和(unsigned long)-4095比较。

对于32位系统,-4095=0xFFFF F001,对于64位系统,-4095=0xFFFF FFFF FFFF F001

对于32位系统,内核从0xFFFF F001 ~ 0xFFFF FFFF是冗余空间,对于64位系统,内核从0xFFFF FFFF FFFF F001 ~ 0xFFFF FFFF FFFF FFFF是冗余空间。

分配任何指针不可能到达这个区域,而错误信息在-133~-1在这个区域,故可判断系统的错误指针,从而判断返回的错误指针。

ERR_PTR PTR_ERR IS_ERR ERROR的更多相关文章

  1. ERR_PTR,PTR_ERR还有IS_ERR函数详解

    内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来. 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针. 1)合法指针:内核返回的指针一般是指向 ...

  2. 解读PTR_ERR,ERR_PTR,IS_ERR

    解读PTR_ERR,ERR_PTR,IS_ERR 看到了几个宏PTR_ERR,ERR_PTR,IS_ERR(其实是内联函数).还是不太明白,然后就google搜索了一下,搜出来的结果真是不让人满意,看 ...

  3. ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

    加载和动态链接 从编译/链接和运行的角度看,应用程序和库程序的连接有两种方式. 一种是固定的.静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中: ...

  4. Linux 链接详解(2)

    可执行文件加载执行过程: 上一节我们说到ELF文件格式,静态库的符号解析和重定位的内容.这一节我们来分析一下可执行文件. 由上一节我们知道可执行文件也是ELF文件,当程序被加载器加载到内存时是按照EL ...

  5. linux内核exec过程

    简介 本文分析linux内核exec系统调用执行过程中可执行文件的加载过程和栈的设置,内核代码版本为2.6.32 分析 \arch\ia64\kernel\process.c中有sys_exec函数的 ...

  6. OpenvSwitch代码分析之bridge和port

    ovs-vsctl add-br br0 会在数据库里面加入新bridge的信息ovs-vsctl add-port br0 eth0 会在数据库里面加入新的port信息 void bridge_ru ...

  7. IS_ERR、PTR_ERR、ERR_PTR

    最近在使用filp_open打开文件时遇到到一个问题,当打开一个并不存在的文件时,filp_open返回值值为0xfffffffe,而并不是0(NULL),这是因为内核对返回指针的函数做了特殊处理.内 ...

  8. linux内核中的IS_ERR()、PTR_ERR()、ERR_PTR()

    IS_ERR宏定义在include/linux/err.h,如下所示: #define MAX_ERRNO 4095 //判断x是不是在(0xfffff000,0xffffffff)之间,注意这里用u ...

  9. 内核IS_ERR宏解析 【转】

    转自:http://blog.chinaunix.net/uid-20196318-id-28769.html 最近在使用filp_open打开文件时遇到到一个问题,当打开一个并不存在的文件时,fil ...

随机推荐

  1. python之使用__future__(解决版本不同,不兼容问题)

    Python的新版本会引入新的功能,但是,实际上这些功能在上一个老版本中就已经存在了.要“试用”某一新的特性,就可以通过导入__future__模块的某些功能来实现. 例如,Python 2.7的整数 ...

  2. 原生javasxript获取浏览器的滚动距离和可视窗口的高度

    原生javasxript获取浏览器的滚动距离和可视窗口的高度 //封装兼容性方法获取滚动的距离 function getScrollOffset(){ if(window.pageXOffset){ ...

  3. explicit c++

    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...

  4. javax.servlet.jsp.JspException cannot be resolved to a type 和 javax.servlet.jsp.PageContext cannot be resolved to a type 解决办法

    今天我从码云上拉一个项目下来,是个maven项目,闲来无事自己研究研究,发现刚拉下来,项目就有报错,我一看是httpServletRequest cannot be resolved to a typ ...

  5. springcloud-搭建服务注册中心

    创建服务注册中心 1.创建一个springboot 命名为eureka-server 1)添加Eureka依赖 pom.xml <?xml version="1.0" enc ...

  6. java多线程模拟停车位问题

    /** * */ package Synchronized; /** * @author libin * */ public class CarTest { public static void ma ...

  7. Linux ls命令参数详解

    -a -- 全部(all).列举目录中的全部文件,包括隐藏文件(.filename).位于这个列表的起首处的 .. 和 . 依次是指父目录和你的当前目录.      -l -- 长(long).列举目 ...

  8. cern-cloud-architecture

    规模: 总体: 有26个Cell 一个数据中心运行控制节点,另外一个仅仅运行nova cell 统一,灵活 nova-api运行在VM中,当然需要至少一个部署在物理机上来启动VM. 每个cell只有一 ...

  9. Windods7+Anaconda+Tensorflow安装步骤

    1.下载及安装Anaconda Anaconda是python科学计算的集成.下载Anaconda,下载地址:http://continuum.io/downloads. 由于tensorflow目前 ...

  10. 使用hibernate读取hibernate.cfg.xml文件时碰到这个错误org.hibernate.internal.util.config.ConfigurationException: Could not locate cfg.xml resource [/HibernateTest/src/hibernate.cfg.xml]

    我的问题在于把hibernate.cfg.xml文件放置在某个包中了,hibernate.cfg.xml文件需要放置在src目录下.