ERR_PTR PTR_ERR IS_ERR ERROR
在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相关推荐
- Linux内核错误码和错误指针
1.IS_ERR_VALUE Linux内核中,最大错误码的值为MAX_ERRNO,错误码为负数,负数以补码的形式存储.Arm32位系统错误码的补码范围为0xFFFFF000 - 0xFFFFFFFF ...
- 文件系统--open系统调用详解
arm64平台关于32位系统调用的定义: #define __NR_open 5 __SYSCALL(__NR_open, compat_sys_open)#undef __SYSCALL #defi ...
- ION基本概念介绍和原理分析[转]
转载前的话: ION将内核态形形色色的内存分配纳入统一的管理接口之中,更重要的设计意图是为内存在不同用户态进程之间传递和访问提供了支持. 每个ion_buffer与一个struct file关联,其h ...
- ION基本概念介绍和原理分析
转载前的话: ION将内核态形形色色的内存分配纳入统一的管理接口之中,更重要的设计意图是为内存在不同用户态进程之间传递和访问提供了支持. 每个ion_buffer与一个struct file关联,其h ...
- UBIFS文件系统分析6 - LPT分析1 .
LPT area - LEB Properties Tree LPT area包含LEB properties tree, ltab: a table of LPT area eraseblocks, ...
- UBIFS文件系统分析6 - LPT分析1
LPT area - LEB Properties Tree LPT area包含LEB properties tree, ltab: a table of LPT area eraseblocks, ...
- Qualcomm MSM ION
chipset: MSM8X25Q codebase: Android 4.1 ION基本概念 ION概念: ION是Google的下一代内存管理器,用来支持不同的内存分配机制,如CARVOUT(PM ...
- 2022-06-06 FUSE用户态文件系统
目录 摘要: linux内核支持: 架构分析: 内核中的FUSE: fuse_i.h inode.c file.c dir.c dev.c 核心流程: hello_open hello_read 核心 ...
- 深入分析ELF文件结构及其载入过程
文章目录 前言 ELF目标文件类型 以下面例子深入分析ELF 详解file命令结果的各个部分 ELF的文件结构 ELF知识扩展 Linux系统装载ELF的过程 用户层面 系统层面 前言 一般程序符号和 ...
最新文章
- 滚蛋吧,流量!红利已见顶,是时候步入「留量时代」了
- 23天的单车旅行,从广州到四川,篇首语
- 重载(Overload)和重写(Overide)
- ApacheCN 深度学习译文集 20201218 更新
- SQL Server 2017 SELECT…INTO 创建的新表指定到文件组
- Android Lint简介
- 认识position=fixed
- 中国工业企业数据库 | 特殊样本统计
- 阿里云国际站代理商:SCDN的抗CC攻击和抗DDoS攻击防护是什么?
- nx零件库插件_3DSource企业自定义零件库插件
- .net MVC全局定时器执行作业
- 留学论文辅导计算机专业Essay写作范文
- EVE-NG中思科交换机配置实例之聚合和ssh远程登录
- 网络驱动之net_device结构体
- 超级详细的安装虚拟机教程--配图--步骤拆分
- linux统计单拷贝基因家族,为什么要进行基因家族分析?
- 位图文件(BMP)格式分析
- debug和汇编编译器masm对指令不同的处理
- 如何度过8天长假?小灰推荐几部经典电影给大家!
- Java单元测试和类加载