1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即ptr & 0xfff == 0 2)非法指针:这样ptr的值不可能落在(0xfffff000,0xffffffff)之间(这个区间是内核高端内存所在的区间,关于用户空间和内核空间,可以看考这里。), 而一般内核的出错代码也是一个小负数,在-1000到0之间,转变成unsigned long,正好在(0x...
这三个宏(内联函数)的定义在err.h中 #defineMAX_ERRNO 4095#ifndef__ASSEMBLY__#defineIS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)staticinlinevoid*ERR_PTR(longerror){return(void*) error; }staticinlinelongPTR_ERR(constvoid*ptr){return(long) ptr; }staticinlinelongIS_ERR(const...
1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即ptr & 0xfff == 0 2)非法指针:这样ptr的值不可能落在(0xfffff000,0xffffffff)之间(这个区间是内核高端内存所在的区间,关于用户空间和内核空间,可以看考这里。), 而一般内核的出错代码也是一个小负数,在-1000到0之间,转变成unsigned long,正好在(0x...
比如说我们上面的filp_open函数返回值,用IS_ERR函数去检查,如果地址落在0xfffffffffffff000~0xffffffffffffffff范围,表示filp_open函数失败,IS_ERR为1,同时filp_open返回的错误地址对应一个linux的错误号,如果想知道是哪个错误号,就用PTR_ERR函数来转化。错误的返回地址和错误号是可以根据截图中的ERR_PTR、PTR_ERR...
表示filp_open函数失败,IS_ERR为1,同时filp_open返回的错误地址对应一个linux的错误号, 如果想知道是哪个错误号,就用PTR_ERR函数来转化。 错误的返回地址和错误号是可以使用 ERR_PTR、PTR_ERR 相互转化的。
Linux的errno和指针:Linux函数返回值类型包括整型和指针。内核中,整型用于errno,指针分为三种:空指针NULL(地址为0),异常指针(地址空间高4095个字节,32位为0xfffff001-0xffffffff,64位为0xfffffffffffff001-0xffffffffffffffff),以及普通指针。errno最大值MAX_ERRNO在err.h定义,为4095。变量...
非法指针:这样的ptr的值不可能落在(0xfffff000, 0xffffffff)之间(这个区间是内核的高地址区间),而一般内核的出错代码也是一个小负数,在-1000到0之间,转换成unsigned long类型,正好在(0xfffff000, 0xffffffff)之间。因此可以用(unsigned long)ptr > (unsigned long)-MAX_ERRNO来判断内核函数返回值是一个有效的指...
常见的Linux函数返回值类型包括整型和指针,内核中这两种返回值类型的函数会互相调用。Linux的errno为整型,为了与errno对应,Linux将指针分为3种: - 空指针:NULL,地址为0 - 异常指针:地址空间的高4095个字节。0xfffff001 - 0xffffffff(32位)和0xfffffffffffff001 - 0xffffffffffffffff(64位) -普通指针 ...
ERR_PTR()和 PTR_ERR() ERR_PTR()和 PTR_ERR()都是很简单的类型转换, 没有什么可说的。 IS_ERR()有一些妙处。 内核中的函数常常返回指针, 问题是如果出错, 也希望能够通过返回的指针体现出来。 所幸的是, 内核返回的指针一般是指向页面的边界(4K 边界),即 这样 ptr 的值不可能落在(0xfffff000, 0x...
return ERR_PTR(-EIO); } } 我们在调用这个函数的时候: [cpp]view plaincopy struct device *d; d = foo(); if (IS_ERR(d)) { long err = PTR_ERR(d); printk("errno is %d\n", err); } 这样就可以提取错误码,然后根据错误码再做什么处理就由具体的驱动来处理了。我感觉其实将内核的机构与...