重温IS_ERR PTR_ERR ERR_PTR

问题起源于这个问题:

http://linux.chinaunix.net/bbs/thread-1051055-1-35.html

主要是当初不知道Linux/Unix下产生错误时会返回一个小的错误码。如-ENXIO -ENOMEM

 

知道后又想了解一下原理,下面两个地址说的比较明白:

http://linux.chinaunix.net/bbs/thread-1019406-1-1.html

注意,上面链接里的三楼那个说法在我看来是错的,不是4K边界的问题,应该是最后4K边界 的问题。如果每个指针都检查是不是一个页面的4K边界,还不要烦死啊。

 

代码索引:

http://lxr.free-electrons.com/source/include/linux/err.h#L22

 

拿第一个链接里我问的问题来讲,__register_chrdev_region返回值是指针,alloc_chrdev_region里通过IS_ERR来判断是正常指针还是错误(指针)(错误指针肯定落在最后一个内核页面内)。如果是错误,我们直接返回错误码(通过PTR_ERR转换),正确的话返回0.

 

关键还是设计:

把错误码设计为1-4095区间内的值,然后取负数,-1~-4095强制转换成指针类型的话就是0xFFFFF000~0xFFFFFFFE,正常的指针值不允许出现在这个范围(OS和编译器来完成?)。出现在这个范围的就是错误码而不是指针。

 

PTR_ERR 和 ERR_PTR哪个返回指针哪个返回long整型? 看下划线后面那个单词,ERR_PTR后面的是PTR,返回的是PTR(指针)类型。

 

PS:这个问题再次说明了写博客很有用处,当初也找过这个问题,不过这么久了都忘记了,还得再重新搜索一遍。

你可能感兴趣的:(OS,编译器)