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

errno-base.h:

 1 #ifndef _ASM_GENERIC_ERRNO_BASE_H
 2 #define _ASM_GENERIC_ERRNO_BASE_H
 3
 4 #define    EPERM         1    /* Operation not permitted */
 5 #define    ENOENT         2    /* No such file or directory */
 6 #define    ESRCH         3    /* No such process */
 7 ......
 8 ......
 9 ......
10 #define    EDOM        33    /* Math argument out of domain of func */
11 #define    ERANGE        34    /* Math result not representable */
12
13 #endif

errno.h:

 1 #define _ASM_GENERIC_ERRNO_H
 2
 3 #include <asm-generic/errno-base.h>
 4
 5 #define EDEADLK         35      /* Resource deadlock would occur */
 6 #define ENAMETOOLONG    36      /* File name too long */
 7 #define ENOLCK          37      /* No record locks available */
 8 ......
 9 ......
10 ......
11 #define ERFKILL         132     /* Operation not possible due to RF-kill */
12
13 #define EHWPOISON       133     /* Memory page has hardware error */
14
15 #endif

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

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

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

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

 1 #define MAX_ERRNO    4095
 2
 3 #ifndef __ASSEMBLY__
 4 EPERM
 5 #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
 6 ERROR
 7 static inline void * __must_check ERR_PTR(long error)        //把错误转化指针
 8 {
 9     return (void *) error;
10 }
11
12 static inline long __must_check PTR_ERR(const void *ptr)            //把指针转化错误
13 {
14     return (long) ptr;
15 }
16
17 static inline long __must_check IS_ERR(const void *ptr)        //判断是否错误指针
18 {
19     return IS_ERR_VALUE((unsigned long)ptr);
20 }
21
22 static inline long __must_check IS_ERR_OR_NULL(const void *ptr)        //判断空指针或者错误指针
23 {
24     return !ptr || IS_ERR_VALUE((unsigned long)ptr);
25 }

重点关注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在这个区域,故可判断系统的错误指针,从而判断返回的错误指针。

转载于:https://www.cnblogs.com/kevinhwang/p/5649954.html

ERR_PTR PTR_ERR IS_ERR ERROR相关推荐

  1. Linux内核错误码和错误指针

    1.IS_ERR_VALUE Linux内核中,最大错误码的值为MAX_ERRNO,错误码为负数,负数以补码的形式存储.Arm32位系统错误码的补码范围为0xFFFFF000 - 0xFFFFFFFF ...

  2. 文件系统--open系统调用详解

    arm64平台关于32位系统调用的定义: #define __NR_open 5 __SYSCALL(__NR_open, compat_sys_open)#undef __SYSCALL #defi ...

  3. ION基本概念介绍和原理分析[转]

    转载前的话: ION将内核态形形色色的内存分配纳入统一的管理接口之中,更重要的设计意图是为内存在不同用户态进程之间传递和访问提供了支持. 每个ion_buffer与一个struct file关联,其h ...

  4. ION基本概念介绍和原理分析

    转载前的话: ION将内核态形形色色的内存分配纳入统一的管理接口之中,更重要的设计意图是为内存在不同用户态进程之间传递和访问提供了支持. 每个ion_buffer与一个struct file关联,其h ...

  5. UBIFS文件系统分析6 - LPT分析1 .

    LPT area - LEB Properties Tree LPT area包含LEB properties tree, ltab: a table of LPT area eraseblocks, ...

  6. UBIFS文件系统分析6 - LPT分析1

    LPT area - LEB Properties Tree LPT area包含LEB properties tree, ltab: a table of LPT area eraseblocks, ...

  7. Qualcomm MSM ION

    chipset: MSM8X25Q codebase: Android 4.1 ION基本概念 ION概念: ION是Google的下一代内存管理器,用来支持不同的内存分配机制,如CARVOUT(PM ...

  8. 2022-06-06 FUSE用户态文件系统

    目录 摘要: linux内核支持: 架构分析: 内核中的FUSE: fuse_i.h inode.c file.c dir.c dev.c 核心流程: hello_open hello_read 核心 ...

  9. 深入分析ELF文件结构及其载入过程

    文章目录 前言 ELF目标文件类型 以下面例子深入分析ELF 详解file命令结果的各个部分 ELF的文件结构 ELF知识扩展 Linux系统装载ELF的过程 用户层面 系统层面 前言 一般程序符号和 ...

最新文章

  1. 滚蛋吧,流量!红利已见顶,是时候步入「留量时代」了
  2. 23天的单车旅行,从广州到四川,篇首语
  3. 重载(Overload)和重写(Overide)
  4. ApacheCN 深度学习译文集 20201218 更新
  5. SQL Server 2017 SELECT…INTO 创建的新表指定到文件组
  6. Android Lint简介
  7. 认识position=fixed
  8. 中国工业企业数据库 | 特殊样本统计
  9. 阿里云国际站代理商:SCDN的抗CC攻击和抗DDoS攻击防护是什么?
  10. nx零件库插件_3DSource企业自定义零件库插件
  11. .net MVC全局定时器执行作业
  12. 留学论文辅导计算机专业Essay写作范文
  13. EVE-NG中思科交换机配置实例之聚合和ssh远程登录
  14. 网络驱动之net_device结构体
  15. 超级详细的安装虚拟机教程--配图--步骤拆分
  16. linux统计单拷贝基因家族,为什么要进行基因家族分析?
  17. 位图文件(BMP)格式分析
  18. debug和汇编编译器masm对指令不同的处理
  19. 如何度过8天长假?小灰推荐几部经典电影给大家!
  20. Java单元测试和类加载

热门文章

  1. 在Dockerfile中设置G1垃圾回收器参数
  2. 力扣解题——求根到叶子节点数字之和
  3. 2022-2028年中国铁路机车行业投资分析及前景预测报告
  4. 数据算法算力知识反绎学习
  5. 同步与异步,阻塞与非阻塞的区别
  6. LeetCode简单题之仅执行一次字符串交换能否使两个字符串相等
  7. LeetCode简单题之石头与宝石
  8. 台积电2nm与3nm制程
  9. 至强® 平台配备先进遥测技术让您的数据中心更智能
  10. MongoDB之conf配置文件详解