内核中判断返回指针是否错误方法

内核中判断返回指针是否错误的方法:使用IS_ERR或者IS_ERR_OR_NULL

参考include/linux/err.h

#define MAX_ERRNO  4095

#ifndef __ASSEMBLY__

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

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);

}

内核空间是一个有限的空间,而在这有限的空间中,其最后一个page是专门保留的,也就是说一般人不可能用到内核空间最后一个page的指针.换句话说,你在写设备驱动程序的过程中,涉及到的任何一个指针,必然有三种情况,一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针.而所谓的错误指针就是指其已经到达了最后一个page.比如对于32bit的系统来说,内核空间最高地址0xffffffff,那么最后一个page就是指的0xfffff000~0xffffffff(假设4k一个page).这段地址是被保留的,一般人不得越雷池半步,如果你发现你的一个指针指向这个范围中的某个地址,那么你的代码肯定出错了。

这里不仅不是浪费一个page,反而是充分利用资源,把一个东西当两个东西来用.

宏MAX_ERRNO(定义为4095)是最大错误号,Linux内核中,出错有多种可能.关于Linux内核中的错误,我们看一下include/asm-generic/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    EINTR           4    /* Interrupted system call */

#define    EIO        5    /* I/O error */

#define    ENXIO          6    /* No such device or address */

#define    E2BIG           7    /* Argument list too long */

#define    ENOEXEC            8    /* Exec format error */

#define    EBADF          9    /* Bad file number */

#define    ECHILD        10    /* No child processes */

#define    EAGAIN        11    /* Try again */

#define    ENOMEM             12    /* Out of memory */

#define    EACCES        13    /* Permission denied */

#define    EFAULT        14    /* Bad address */

#define    ENOTBLK            15    /* Block device required */

#define    EBUSY          16    /* Device or resource busy */

#define    EEXIST         17    /* File exists */

#define    EXDEV         18    /* Cross-device link */

#define    ENODEV              19    /* No such device */

#define    ENOTDIR             20    /* Not a directory */

#define    EISDIR          21    /* Is a directory */

#define    EINVAL         22    /* Invalid argument */

#define    ENFILE         23    /* File table overflow */

#define    EMFILE        24    /* Too many open files */

#define    ENOTTY              25    /* Not a typewriter */

#define    ETXTBSY             26    /* Text file busy */

#define    EFBIG           27    /* File too large */

#define    ENOSPC        28    /* No space left on device */

#define    ESPIPE         29    /* Illegal seek */

#define    EROFS          30    /* Read-only file system */

#define    EMLINK        31    /* Too many links */

#define    EPIPE           32    /* Broken pipe */

#define    EDOM           33    /* Math argument out of domain of func */

#define    ERANGE              34    /* Math result not representable */

#endif

最常见的几个是-EBUSY,-EINVAL,-ENODEV,-EPIPE,-EAGAIN,-ENOMEM.这些是每个体系结构里都有的,另外各个体系结构也都定义了自己的一些错误代码.这些东西当然也都是宏,实际上对应的是一些数字,这个数字就叫做错误号.而对于Linux内核来说,不管任何体系结构,最多最多,错误号不会超过4095.而4095又正好是比4k小1,即4096减1.而我们知道一个page可能是4k,也可能是更多,比如8k,但至少它也是4k,所以留出一个page出来就可以让我们把内核空间的指针来记录错误了.

转自:http://blog.csdn.net/adaptiver/article/details/8660217

时间: 2024-08-02 22:56:59

内核中判断返回指针是否错误方法的相关文章

C++ 中判断非空的错误指针

最近在写网络上的东西,程序经过长时间的运行,会出现崩溃的问题,经过DUMP文件的查看,发现在recv的地方接收返回值的时候,数据的长度异常的大差不多16亿多字节.而查看分配后的char指针显示为错误的指针,这可能是接收数据不对应产生的问题解决思路如下: 1.对返回值长度进行判断,如果超过项目内最大的返回值就直接return(比如我项目内的最大返回值为5000,哪么我设定的值为10000); 2.对char指针进行判断,由于这里返回的数据是有的,只是解析不出来而已,这里就是一个非空的错误指针,所以

jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?

1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本.随后服务器端返回的数据会根据这个值解析后,传递给回调 函数.可用值: •"xml": 返回

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下 $#代表了命令行的参数数量,可以看以下实例: 复制代码 代码如下: if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; f

WebApi中直接返回json字符串的方法

[HttpPost] public HttpResponseMessage Upload() { string json = "{\"result\":\"true\"}"; return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") }; } WebApi中直

webdriver中判断元素是否存在的方法

selenium.webdriver中没有内置的判断元素是否存在的方法,所以定义一个方法,如果找到该元素则返回True,否则返回False: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException class Demo: def __init__(self): # 初始化 self

Structs2中Action返回json到前台方法

1.传统方式JSON输出 这一点跟传统的Servlet的处理方式基本上一模一样,代码如下 01 public void doAction() throws IOException{ 02         HttpServletResponse response=ServletActionContext.getResponse(); 03         //以下代码从JSON.java中拷过来的 04         response.setContentType("text/html"

内核中通过函数指针打印出具体的函数

内核中函数指针用的很多,在debug 的时候能直接打印出一个函数指针对应的函数就会很方便. 打印裸指针(raw pointer)用 %p,%p除了可以用来打印指针外还可以打印其它的信息 %pF可打印函数指针的函数名和偏移地址,%pf只打印函数指针的函数名,不打印偏移地址. 如 printk("%pf %pF\n", ptr, ptr) will print: module_start module_start+0x0/0x62 [hello] 但是为了支持这个功能你需要开启CONFIG

2015.9.10关于链表中结构体指针的错误

昨天用结构体指针写了一个双链表的程序,编译环境是VC6.0,之前写单链表的时候也是用的这个编译器,但是昨天出了一个让我很费解的问题,代码如下: /********************************************************** * C语言实现双链表 *文件名:list.c *作者:Mr Wan *编写时间:2015.9.9 *功能:实现双链表的简单操作 *版本:1.0 * ********************************************