因为错误码都是整数,而返回的是指针,所以需要强制转换一下,这就诞生了这三个宏PTR_ERR,ERR_PTR,IS_ERR。这三个宏(内联函数)的定义在err.h中 #defineMAX_ERRNO 4095#ifndef__ASSEMBLY__#defineIS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)staticinlinevoid*ERR_PTR(longerror){return(v...
ERR_PTR,PTR_ERR还有IS_ERR函数详解 内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针。 1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即ptr & 0xfff == 0 2)非法指针:这样ptr的值不可能落...
(unsigned long)ptr > (unsigned long)-1000L 来判断内核函数的返回值是一个有效的指针,还是一个出错代码。 涉 及到的任何一个指针,必然有三种情况,一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针.而所谓的错误指针就是指其已经到达了最 后一个page.比如对于32bit的系统来说,内核空间最高...
在IS_ERR()函数中(unsigned long)-1000L实际上表示的是0x FFFF F000(因为负数在计算机中是原码的补码加一),在linux中虚拟内存空间的分配,0~3G是给用 户空间的,而3G~4G是给linux内核的,而0xFFFFF000就位于linux内核的虚拟内存空间范围内,从0xFFFFF000到4G间的大小 只有4KB,这实际上也就是一个PAGE_SIZE的大小...
该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。 filp_close extern int filp_close(struct file *, fl_owner_t id); 参数说明: 第一个参数是filp_open返回的file结构体指针 第二个参数基本上都是NULL
Linux的errno和指针:Linux函数返回值类型包括整型和指针。内核中,整型用于errno,指针分为三种:空指针NULL(地址为0),异常指针(地址空间高4095个字节,32位为0xfffff001-0xffffffff,64位为0xfffffffffffff001-0xffffffffffffffff),以及普通指针。errno最大值MAX_ERRNO在err.h定义,为4095。变量...
我们在调用这个函数的时候: [cpp]view plaincopy struct device *d; d = foo(); if (IS_ERR(d)) { long err = PTR_ERR(d); printk("errno is %d\n", err); } 这样就可以提取错误码,然后根据错误码再做什么处理就由具体的驱动来处理了。我感觉其实将内核的机构与原理理解清楚了,内核的一些技巧就...
static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr) { if (IS_ERR(ptr)) return PTR_ERR(ptr); else return 0; } 应用到如下地方用于减少函数行,使用统一api diff --git a/drivers/pci/controller/dwc/pcie-kirin.c b/drivers/pci/controller/dwc/pcie-kirin.c ...
IS_ERR宏的出现,是为了解决函数返回值的问题。由于C语言的函数返回值只能有一个,如果一个函数在正常执行后,返回一个指针,而在出现错误的时候,返回错误码,如何来实现这个需求呢?下面是一段示例代码: void*p=NULL;interr=func(&p);if(err==0){// p有效}else{// p无效} ...
内核中的函数常常返回指针, 问题是如果出错, 也希望能够通过返回的指针体现出来。 所幸的是, 内核返回的指针一般是指向页面的边界(4K 边界),即 这样 ptr 的值不可能落在(0xfffff000, 0xffffffff) 之间, 而一般内核的出错代码也是一个小负数, 在-1 000ptr& 0xfff == 0 到 0 之间, 转变成 unsigned long...