那么没有问题,申请成功了,如果指针指向了最后一个page,那么说明实际上这不是一个有效的指针,这个指针里保存的实际上是一种错误代码.而通常很常用的方法就是先用IS_ERR()来判断是否是错误,然后如果是,那么就调用PTR_ERR()来返回这个错误代码.只不过咱们这里,没有调用PTR_ERR()而已,因为起决定作用...
void*ERR_PTR(longerror);longIS_ERR(constvoid*ptr);longPTR_ERR(constvoid*ptr); 第一个函数实际上把错误值作为指针返回。假若函数在内存申请失败后要执行语句return -ENOMEM;,则必须改为这样的语句:return ERR_PTR(-ENOMEM);。 第二个函数用于检查返回值是否是指针错误:if (IS_ERR(foo))。最后一个函数返...
getname()返回有可能是一个分配的页面的首地址,也有可能因为内存不足返回ERR_PTR(-ENOMEM);先看返回是页面首地址的情况,接着 通过PTR_ERR()将这个指针类型的地址转化成为一个整型,再通过IS_ERR()来判断是否是一个有效的页面首地址,这跟前面分析的一样. 再接下来看一下,如果返回的是错误码的情况,ENOMEM在kern...
#defineIS_ERR_VALUE(x)unlikely((x)>=(unsigned long)-MAX_ERRNO)staticinlinevoid*__must_checkERR_PTR(long error){return(void*)error;}staticinline long __must_checkPTR_ERR(constvoid*ptr){return(long)ptr;}staticinline long __must_checkIS_ERR(constvoid*ptr){returnIS_ERR_VALUE((unsigned lon...
常见的Linux函数返回值类型包括整型和指针,内核中这两种返回值类型的函数会互相调用。Linux的errno为整型,为了与errno对应,Linux将指针分为3种: - 空指针:NULL,地址为0 - 异常指针:地址空间的高4095个字节。0xfffff001 - 0xffffffff(32位)和0xfffffffffffff001 - 0xffffffffffffffff(64位) - 普通指针 ...
ERR_PTR,PTR_ERR还有IS_ERR函数详解 内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。 1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即ptr & 0xfff == 0...
几个内核函数:filp_open、filp_read、IS_ERR、ERR_PTR、PTR_ERR,程序员大本营,技术文章内容聚合第一站。
Linux内核IS_ERR/ERR_PTR/PTR_ERR 对于一个指针,一般分为3类:1、有效指针;2、NULL;3、非法指针 IS_ERR/ERR_PTR/PTR_ERR均定义在include/linux/err.h文件中。 1、IS_ERR static inline bool __must_check IS_ERR(__force const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); } 1 2 ...
static inline void *ERR_PTR(long error) { return (void *) error; } static inline long PTR_ERR(const void *ptr) { return (long) ptr; } static inline long IS_ERR(const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr);
Linux的errno和指针:Linux函数返回值类型包括整型和指针。内核中,整型用于errno,指针分为三种:空指针NULL(地址为0),异常指针(地址空间高4095个字节,32位为0xfffff001-0xffffffff,64位为0xfffffffffffff001-0xffffffffffffffff),以及普通指针。errno最大值MAX_ERRNO在err.h定义,为4095。变量...