Linux内核ISERR
本文介绍Linux 4.4内核 IS_ERR() 函数。
文件: include/linux/err.h ,定义如下: #define MAX_ERRNO 4095 ## 对于64位系统,判断x是否在0xffff ffff ffff f001 ~ 0xffff ffff ffff ffff #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) static inline long __must_check PTR_ERR(__force const void *ptr) { return (long) ptr; } static inline bool __must_check IS_ERR(__force const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); }一、功能
功能:判断传入的指针 ptr 是否有效。
Linux内核指针包括:有效指针、空指针(NULL)和错误指针。
Linux内核用最后4K空间保存指针的出错码,64位的系统地址为: 0xffff ffff ffff f001 ~ 0xffff ffff ffff ffff 。
如果是错误指针,配合 PTR_ERR() 函数判断错误代码。
文件: include/uapi/asm-generic/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 */ #define E2BIG 7 /* Argument list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file number */ #define ECHILD 10 /* No child processes */ #define EAGAIN 11 /* Try again */ #define ENOMEM 12 /* Out of memory */ ...
文件: include/uapi/asm-generic/errno.h ,定义如下: #define EDEADLK 35 /* Resource deadlock would occur */ #define ENAMETOOLONG 36 /* File name too long */ #define ENOLCK 37 /* No record locks available */ #define ENOSYS 38 /* Invalid system call number */ #define ENOTEMPTY 39 /* Directory not empty */ #define ELOOP 40 /* Too many symbolic links encountered */ ...
文件: include/linux/errno.h ,定义如下: #define ERESTARTSYS 512 #define ERESTARTNOINTR 513 #define ERESTARTNOHAND 514 /* restart if no handler.. */ #define ENOIOCTLCMD 515 /* No ioctl command */ #define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */ #define EPROBE_DEFER 517 /* Driver requests probe retry */ ...二、说明
1) inline :内联函数。内联函数的代码会直接嵌入到调用它的位置,调用几次就嵌入几次。
2) __must_check :指调用函数一定要处理函数的返回值,否则编译器会给出警告。
3) __force :表示变量可进行强制转换。
4) unlikely 后续专门介绍。
4) (unsigned long)-MAX_ERRNO :用补码的方式表示-4095,64位系统为 0xffff ffff ffff f001 。 三、示例
文件: drivers/gpu/drm/rockchip/rockchip_drm_drv.c printk(KERN_ERR" ==== unsigned long 0x%lx ", (unsigned long)-MAX_ERRNO); ... private->devfreq = devfreq_get_devfreq_by_phandle(dev, 0); printk(KERN_ERR"==== IS_ERR(private->devfreq) %d , private->devfreq %p ", IS_ERR(private->devfreq), private->devfreq); ## 1、判断是否有效指针 if (IS_ERR(private->devfreq)) { ## 2、判断错误码 if (PTR_ERR(private->devfreq) == -EPROBE_DEFER) { parent_np = of_parse_phandle(np, "devfreq", 0); if (parent_np && of_device_is_available(parent_np)) { ... } else { ## 3、运行到此处 dev_info(dev, "dmc is disabled "); } } else { ... } ... } ... private->hdmi_pll.pll = devm_clk_get(dev, "hdmi-tmds-pll"); printk(KERN_ERR"==== IS_ERR(private->hdmi_pll.pll) %d , private->hdmi_pll.pll %p ", IS_ERR(private->hdmi_pll.pll), private->hdmi_pll.pll);
程序运行后,相关日志如下: [ 2.270871] ==== unsigned long 0xfffffffffffff001 [ 2.271322] ==== IS_ERR(private->devfreq) 1 , private->devfreq fffffffffffffdfb [ 2.271993] rockchip-drm display-subsystem: dmc is disabled [ 2.272504] ==== IS_ERR(private->hdmi_pll.pll) 0 , private->hdmi_pll.pll ffffffc0782e6340
通过上面日志可以看出:
1) private->devfreq 值为 0xfffffffffffffdfb (值为-517),对应错误码 EPROBE_DEFER ,此时 IS_ERR 返回1。
2) private->hdmi_pll.pll 值为 0xffffffc0782e6340 ,是有效指针, IS_ERR 返回0。
512大内存的手机性价比推荐哪一款?二手也行?文小伊评科技第一款IQOONeo512512G版。(有全新机)全新价3000元左右二手价格2600元左右。配置骁龙870处理器,120Hz三星E3OLED硬质屏,UFS3。1闪存,
什么是数字人民币,对我们有什么影响?前段时间轰轰烈烈的数字人民币还是有很多人不清楚这到底是个什么东西,它对于我们的生活又会有什么影响呢?今天就来简单地介绍一下吧。所谓数字人民币你可以简单地理解为电子货币,但他是国家承
工信部发话,手机预装APP必须可卸载!再也不怕厂家乱装APP了不知道大家拿到新手机的第一件事是干嘛,对于强迫症的小编来说,第一件事当然是把手机中能卸载的预装软件通通卸载,因为新手机中的大部分预装软件都是平时用不到的,放着碍眼,而且日常使用手机
比尔盖茨再预言另一场全球大流行病即将到来微软创办人比尔盖茨(BillGates)周五(18日)表示,尽管目前新冠疫情的风险已大幅降低,但可以肯定的是,另一场大流行即将到来。比尔盖茨周五在德国年度慕尼黑安全会议上乐观表示,
越战越勇的刘强东读名人故事,获人生启迪刘强东和他的京东,从无名小卒,至今已经站到食物链顶端,很多时候和刘强东以及他的精神有关,越战越勇,遇强则强。京东初始刘强东是江苏宿迁人,1992年考上中国人民
由女性建立的加密俱乐部BoysClub是一个由女性和非二元性别人群组成的团体,它为加密好奇者创建一个无男性区域。参加BoysClub活动的人展示他们的临时纹身。图源NoaGriffel不管我们喜不喜欢,
从零开始学Python(三)while循环breakcontine01while循环这个i主要是控制循环次数的i0whilei100print(我错了)print(i)控制循环次数i1021到100之间的累加和i0mysum0whilei100p
rustwarp比gofasthttp要快数倍上周我发现了关于超性能的帖子。它表示rusttokiohyper性能高于gohttp。这是意料之中的,但有一条评论与fasthttp相比,其中rust的表现稍差。我决定自己执行基准
怎样开通可以支持信用卡付款的收款码?需要建行卡,营业执照。多码合一,微信支付宝都支持。直接到银行卡,办理不收费,收款按千分之二收。成都地区上门办理。我可以帮你开通,信用卡花呗都可以用,秒到账农村信用社可以开通,一码可
20W充电头怎么选?四款热门产品对比体验给你答案前言随着苹果手机相继取消原装充电器,同时新的快充总算到了20W,使用iPhone的小伙伴想要体验舒服的充电,选择一款快充头就十分必要了。原装的苹果20W表现中规中矩,同时149元的
微信又出新功能据网友反馈,iOS版微信在设置通用照片视频文件和通话中已经出现了聊天图片搜索功能且已向大部分用户推送开启该功能后可通过图片信息搜索聊天中的图片用户可以在聊天的搜索框中输入图像描述或