解读PTR_ERR,ERR_PTR,IS_ERR
在看内核代码时遇到几个宏PTR_ERR,ERR_PTR,IS_ERR(其实是内联函数),通过阅读内核源码,知道了这几个宏的定义,下面就说一下这几个宏的由来与用处。
我们知道内核有些函数是返回指针的,如Kmalloc分配内存,如果分配不到内核就会返回NULL指针,这样我们可以通过判断是否是NULL指针来判断Kmalloc执行成功与否。但是有些函数返回错误时,我们不仅需要知道函数错了,还需要知道错在哪里了,也就是说我们要或得错误码。在用户空间编程的时候,因为每个线程都有一个error变量,我们可以通过访问这个变量来得到错误码。但是在内核就没有这个变量,所以不能这样或得函数执行的错误码。那么聪明的内核开发着就根据内核的地址空间特点用了一种新的方法来或得错误码,那就是PTR_ERR,ERR_PTR,IS_ERR这三个宏,暂时先不说这三个宏怎么用,我们来看一下错误码与内核地址空间的特点。
我们知道内核有些函数是返回指针的,如Kmalloc分配内存,如果分配不到内核就会返回NULL指针,这样我们可以通过判断是否是NULL指针来判断Kmalloc执行成功与否。但是有些函数返回错误时,我们不仅需要知道函数错了,还需要知道错在哪里了,也就是说我们要或得错误码。在用户空间编程的时候,因为每个线程都有一个error变量,我们可以通过访问这个变量来得到错误码。但是在内核就没有这个变量,所以不能这样或得函数执行的错误码。那么聪明的内核开发着就根据内核的地址空间特点用了一种新的方法来或得错误码,那就是PTR_ERR,ERR_PTR,IS_ERR这三个宏,暂时先不说这三个宏怎么用,我们来看一下错误码与内核地址空间的特点。
基本的错误码在内核中的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 */
- 。。。。。。。