嵌入式驅動學習第一周——Linux錯誤碼以及 IS_ERR、ERR_PTR、PTR_ERR

前言

?? 本節來學習Linux錯誤碼,因為內核中的函數常常返回指針,如果出錯,也希望能夠通過返回的指針體現出來。

?? 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程,未來預計四個月將高強度更新本專欄,喜歡的可以關注本博主并訂閱本專欄,一起討論一起學習。現在關注就是老粉啦!

行文目錄

  • 前言
  • 內核返回的指針
  • IS_ERR()
  • IS_ERR_OR_NULL()
  • PTR_ERR()
  • ERR_PTR()
  • 使用案例
  • 附錄:Linux錯誤碼大全
  • 參考資料

內核返回的指針

?? 在介紹之前,我們需要理解一下內核空間最大的錯誤碼。對于一個64位的系統而言,內核空間占用(0x0000000000000000 ~ 0xffffffffffffffff)的虛擬地址。其中Linux采用分頁機制管理內存,而CPU訪問的是線性地址需要通過頁表轉化成物理地址。所以內核就約定留出最后一頁4k(fffffffffffff000 ~ 0xffffffffffffffff)用來記錄內核空間的錯誤指針。

?? 因此所謂的錯誤指針已經指向了內核空間的最后一頁

?? 指針一般有三種:合法指針、錯誤指針、NULL指針。

合法指針:內核返回的指針一般是指向頁面的邊界,即ptr & 0xfff == 0
非法指針:不指向任何有效內存地址
錯誤指針:錯誤指針是指指向無效、未定義或未分配內存的指針

IS_ERR()

?? 將傳入的值與(unsigned long)-MAX_ERRNO的值進行比較,在Linux中,定義了MAX_ERRNO的定義為4095,其含義就是最大錯誤號。

?? -4096的二進制是補碼,其值為0xfffff001,即大于等于0xfffff001的指針為非法指針。而這一部分正好是Linux內核的最后一頁,存儲的錯誤碼,對應的值就是錯誤類型。

?? IS_ERR()的結果:

有效指針、空指針返回false
錯誤指針返回true

IS_ERR_OR_NULL()

?? 和IS_ERR()的區別在于其NULL也返回true

有效指針返回false
錯誤指針、空指針返回true

PTR_ERR()

?? 將傳入的void *類型指針強轉為long類型,并返回。用于將錯誤指針轉為long類型值,從而返回出錯誤類型

ERR_PTR()

?? 將傳入的long類型強轉為void *類型指針,并返回

使用案例

imx6uirq.class = class_create(THIS_MODULE, IMX6UIRQ_NAME);
if (IS_ERR(imx6uirq.class)) {return PTR_ERR(imx6uirq.class);
}imx6uirq.device = device_create(imx6uirq.class, NULL, imx6uirq.devid, NULL, IMX6UIRQ_NAME);
if (IS_ERR(imx6uirq.device)) {return PTR_ERR(imx6uirq.device);
}

?? 現在我們利用class_create()函數和device_create()函數創建了相應的設備節點,返回的是一個指針,我們需要對指針的合法性進行判斷,因此就會使用IS_ERR()函數判斷,如果是無效的就會調用PTR_ERR()函數將錯誤碼返回。

附錄:Linux錯誤碼大全

?? 注意: 返回錯誤碼的時候一般加個負號,如-EIO

#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 */  
#define EACCES      13  /* Permission denied */  
#define EFAULT      14  /* Bad address */  
#define ENOTBLK     15  /* Block device required */  
#define EBUSY       16  /* Device or resource busy */  
#define EEXIST      17  /* File exists */  
#define EXDEV       18  /* Cross-device link */  
#define ENODEV      19  /* No such device */  
#define ENOTDIR     20  /* Not a directory */  
#define EISDIR      21  /* Is a directory */  
#define EINVAL      22  /* Invalid argument */  
#define ENFILE      23  /* File table overflow */  
#define EMFILE      24  /* Too many open files */  
#define ENOTTY      25  /* Not a typewriter */  
#define ETXTBSY     26  /* Text file busy */  
#define EFBIG       27  /* File too large */  
#define ENOSPC      28  /* No space left on device */  
#define ESPIPE      29  /* Illegal seek */  
#define EROFS       30  /* Read-only file system */  
#define EMLINK      31  /* Too many links */  
#define EPIPE       32  /* Broken pipe */  
#define EDOM        33  /* Math argument out of domain of func */  
#define ERANGE      34  /* Math result not representable */ 

參考資料

[1] ERR_PTR,PTR_ERR還有IS_ERR函數詳解

[2] 如何理解Linux內核IS_ERR、ERR_PTR、PTR_ERR

[3] linux內核中的IS_ERR()、PTR_ERR()、ERR_PTR()

[4] 內核IS_ERR、PTR_ERR、ERR_PTR宏

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713540.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【正點原子STM32】RNG硬件隨機數(隨機數發生器、真隨機和偽隨機、應用場景、RNG結構和原理、RNG相關寄存器和HAL庫驅動、RNG基本驅動步驟)

一、RNG簡介 二、RNG框圖介紹 三、RNG相關寄存器介紹 四、RNG相關HAL庫驅動介紹 五、RNG基本驅動步驟 六、編程實戰 七、總結 一、RNG簡介 隨機數發生器(RNG)在計算機科學和密碼學中具有廣泛的應用場景,包括但不限于以下幾個方面&#xff1a…

QML中動態表格修改數據

1.qml文件中的實現代碼 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_model…

Python內置函數11——globals()、locals()

文章目錄 概要基礎用法 概要 globals()和locals()都是內置函數,用于獲取當前命名空間中的變量。 globals()函數返回全局命名空間的字典,包括全局變量、函數和模塊。它返回一個表示全局命名空間的字典。你可以使用該函數來查看和修改全局命名空間中的變量…

深入剖析k8s-控制器思想

引言 本文是《深入剖析Kubernetes》學習筆記——《深入剖析Kubernetes》 正文 控制器都遵循K8s的項目中一個通用的編排模式——控制循環 for {實際狀態 : 獲取集群中對象X的實際狀態期望狀態 : 獲取集群中對象X的期望狀態if 實際狀態 期望狀態 {// do nothing} else {執行…

buuctf misc做題筆記

喵喵喵 使用stegsolve.jar,按BGR順序提取出一個png圖片,是一個一半得二維碼,修改圖片高度后,解析出一個百度網盤地址,https://pan.baidu.com/s/1pLT2J4f 下載得到壓縮包flag.rar。解壓成功,但是報一個出錯…

4 在QEMU硬件模擬器中運行開源鴻蒙OpenHarmony4.1的操作系統,無需實體開發板

在QEMU硬件模擬器中運行開源鴻蒙OpenHarmony4.1的操作系統,無需實體開發板 作者將狼才鯨日期2024-03-01 先下載源碼和編譯程序: 查看 開源鴻蒙OpenHarmony4.1源碼下載、編譯,生成OHOS_Image可執行文件的最簡易流程 我準備在QEMU模擬器中運行…

LangChain---大型語言模型(LLM)的標準接口和編程框架

1.背景說明 公司在新的一年規劃中突然提出要搞生成式AI(GenAI)的相關東西,在公司分享的參考資料中了解到了一些相關的信息,之所以想到使用LangChain,是因為在應用中遇到了瓶頸問題,除了已經了解和研究過的OpenAI的ChatGpt&#xf…

藍橋杯Java B組歷年真題(2013年-2019年)

一、2013年真題 1、世紀末的星期 使用日期類判斷就行,這里使用LocalDate,也可以使用Calendar類 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:無需package // 2: 類名必須Main, 不可修改p…

1小時網絡安全事件報告要求,持安零信任如何幫助用戶應急響應?

12月8日,國家網信辦起草發布了《網絡安全事件報告管理辦法(征求意見稿)》(以下簡稱“辦法”)。擬規定運營者在發生網絡安全事件時應當及時啟動應急預案進行處置。 1小時報告 按照《網絡安全事件分級指南》&#xff0c…

速盾:動態網站用cdn更慢嗎

當談到網站速度時,內容傳遞網絡(Content Delivery Network,CDN)是不可忽視的一個因素。很多人可能有疑惑,動態網站使用CDN是否會導致加載速度變慢。為了解決這個問題,我們需要了解動態網站和CDN的工作原理&…

mybatis動態加載mapper.xml

mybatis動態加載mapper.xml mybatis動態加載mapper.xml、springboot mybatis動態加載mapper.xml 教程連接:https://blog.csdn.net/weixin_44480167/article/details/136356398

測試linux系統某些文件屬性之test命令

要檢測系統上某些文件或相關屬性時,我們可以使用test命令,比如:檢查/root/ztj.txt文件是否存在,可以使用test -e /root/ztj.txt命令,不過執行結果不會顯示任何信息,需配合$?或&&及||來展現具體結果…

Find My掃地機器人|蘋果Find My技術與機器人結合,智能防丟,全球定位

掃地機器人又稱自動打掃機、智能吸塵、機器人吸塵器等,是智能家電的一種,能憑借人工智能,自動在房間內完成地板清理工作。一般采用刷掃和真空方式,將地面雜物先吸納進入自身的垃圾收納盒,從而完成地面清理的功能。現今…

[AutoSar]BSW_Com07 CAN報文接收流程的函數調用

目錄 關鍵詞平臺說明一、背景二、順序總覽三、函數說明3.1 Com_RxIndication() 關鍵詞 嵌入式、C語言、autosar、OS、BSW 平臺說明 項目ValueOSautosar OSautosar廠商vector ,芯片廠商TI 英飛凌編程語言C,C編譯器HighTec (GCC)…

貝葉斯定理與條件獨立假設:樸素貝葉斯分類方法深度解讀

今天給大家分享的是樸素貝葉斯算法,這個算法在實際使用中不是很多,因為現在很多算法已經發展的很好,性能上也比樸素貝葉斯算法的好很多,因此在實際中我們其實看到在實際應用中樸素貝葉斯算法的使用已經比較少,即使出現…

HotFix原理學習 IL2CPP 學習

原文鏈接:Unity 游戲用XLua的HotFix實現熱更原理揭秘-CSDN博客 本文通過對XLua的HoxFix使用原理的研究揭示出來這樣的一套方法。這個方法的 第一步:通過對C#的類與函數設置Hotfix標簽。來標識需要支持熱更的類和函數。第二步:生成函數連接器…

好視通視頻會議系統存在任意文件讀取漏洞復現 [附POC]

漏洞簡介 好視通視頻會議是由深圳市華視瑞通信息技術有限公司開發,其在國內率先推出了3G互聯網視頻會議,并成功應用于SAAS領域。 資產 FOFA:app"好視通-視頻會議" POC GET /register/toDownload.do?fileName../../../../../../../../../.…

代碼隨想錄-回溯算法

組合 //未剪枝 class Solution {List<List<Integer>> ans new ArrayList<>();Deque<Integer> path new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n, k, 1);return ans;}public void back…

MySql安全加固:可信IP地址訪問控制 設置密碼復雜度

MySql安全加固&#xff1a;可信IP地址訪問控制 & 設置密碼復雜度 1.1 可信IP地址訪問控制1.2 設置密碼復雜度 &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; 1.1 可信IP地址訪問控制 當您在創建用戶時使用’%作為主機部分&#xff0c;…

【C語言】字符型變量and整型變量的類型轉換

一、將字符型變量轉換為整型變量 char c A; int i (int)c; 二、將整型變量轉換成字符型變量 int i 65; char c (char)i;