網站首頁 編程語言 正文
在Linux內核中經常能在list_head雙向鏈表和socket等等操作中看到使用container_of宏定義來取到具體的結構體。
?當然第一眼看到的時候就會覺得這是啥?這又是啥?這什么東西?為什么通過這個可以拿到結構體的基地址?
問題不大,筆者會用此文章+畫圖的方法來仔細講解container_of宏定義。
?那么,用一個列子+畫圖來理解把。
在struct-A結構體中,存在幾個變量,包括struct-B。當我們已知struct-B的絕對地址時,此時需要得到struct-A的絕對地址,是不是就可以用struct-B的絕對地址 - struct-B前面的變量大小 = struct-A的絕對地址。?如下圖所示:
此時,有一個很愚蠢的方法,就是硬生生的減去上面變量的大小,就可以得到struct-A的基地址,但是如果之前有很多很多變量呢?所以此方法肯定是行不通的。
而內核使用的是0地址的騷操作來得到前面的變量的大小,虛擬出一個從0開始的內存,在內存中放入struct-A結構體,得到struct-B的偏移量。此時struct-B的偏移量就是前面變量的總大小。
用struct-B的絕對地址 - struct-B在0地址的偏移量 = struct-A的基址。?
我們再來看看container_of宏定義的源碼。
// ptr 已知的字段的地址
// type 結構體
// member 已經字段的字段名
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
// TYPE結構體
// MEMBER已知字段的字段名
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
container_of參數
????????// ptr 已知的字段的地址
????????// type 結構體
????????// member 已知的字段的字段名offsetof參數
????????// TYPE 結構體
????????// MEMBER 已知的字段的字段名
- ?先把已知字段的地址轉換成具體的結構體中變量的類型(因為此方法在內核任意地方使用)。
- 把地址類型轉換成char*來解釋,因為offsetof算出來的是基于0地址的偏移量,所以必須要用char*來解釋(因為地址-1,代表減去地址所對應的類型個大小的內存單元)。
- offsetof算出基于0地址的偏移量。
- 絕對地址 - 偏移地址 = 結構體的首地址。
- 再轉換成結構體的指針來解釋這段內存空間。
總結:
最后,如果本帖對您有一定的幫助,希望能點贊+關注+收藏!您的支持是給我最大的動力,后續會一直更新各種框架的使用和框架的源碼解讀~!
原文鏈接:https://blog.csdn.net/qq_43799161/article/details/126223620
相關推薦
- 2022-09-01 React新文檔切記不要濫用effect_React
- 2022-06-25 Python中最強大的錯誤重試庫(tenacity庫)_python
- 2024-07-13 通過maven基于springboot項目構建腳手架archetype
- 2022-06-27 Python利用re模塊實現簡易分詞(tokenization)_python
- 2022-07-18 CSS基礎語法和盒模型
- 2022-04-11 git項目初次push提示error: failed to push some refs to ht
- 2022-05-04 基于Python中的turtle繪畫星星和星空_python
- 2023-04-27 解讀react的onClick自動觸發等相關問題_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支