IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠見教育科技集團<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠見教育科技集團 > 嵌入式學(xué)習(xí) > 講師博文 > 揭開linux內(nèi)核中container_of的神秘面紗
揭開linux內(nèi)核中container_of的神秘面紗
時間:2016-12-22作者:華清遠見

在linux 內(nèi)核中有一個大名鼎鼎的宏container_of(),這個宏是用來干嘛的呢?我們先來看看它在內(nèi)核中是怎樣定義的。

呵呵,乍一看不知道是什么東東。

我們先來分析一下container_of(ptr,type,member),這里面有ptr,type,member分別代表指針、類型、成員。看一個例子:

Struct test
        {
                int i;
                int j;
                char k;
        };
        Struct test temp;

現(xiàn)在呢如果我想通過temp.j的地址找到temp的首地址就可以使用container_of(&temp.j,struct test,j);

現(xiàn)在我們知道container_of()的作用就是通過一個結(jié)構(gòu)變量中一個成員的地址找到這個結(jié)構(gòu)體變量的首地址。

下面來看看比較復(fù)雜的內(nèi)容:

我們用上面的struct test張展一下

Const typeof(((struct test *)0)->j) * __mptr = (&temp.j);

其中,typeof是GNU C對標準C的擴展,它的作用是根據(jù)變量獲取變量的類型。因此,上述代碼的作用是首先使用typeof獲取結(jié)構(gòu)體成員j的類型為int,然后頂一個int指針類型的臨時變量__mptr,并將結(jié)構(gòu)體變量中的成員的地址賦給臨時變量__mptr。

(struct test *)((char *)__mptr - offsetof(struct test,j));

接著我們來看一下offsetof(struct test,j),他在內(nèi)核中如下定義

展開(size_t)&((struct test *)0)->j,這是什么東東?

一開始也不明白,這里要感謝曹老師老師的熱心幫助,一語驚醒夢中人,呵呵,可以是這樣理解。

其中size_t是整型,那么我們可以知道終的結(jié)果是一個整形值,也就是j相對于0地址的偏移量。也許現(xiàn)在你會問,整出這么個玩意干嘛,下面看個列子:

程序運行結(jié)果:

發(fā)現(xiàn)沒有如果把第二個值 減去后一個值,就能得到第一個值。

在回首一下它:

(struct test *)((char *)__mptr - offsetof(struct test,j));

是不是可以獲得結(jié)構(gòu)體變量temp的首地址呀,是不是太精妙了呀,linux內(nèi)核中隨隨便便一個宏就有如此精妙,呵呵,想想對linux了解非常多的牛人,還有很長一段路。

發(fā)表評論
評論列表(網(wǎng)友評論僅供網(wǎng)友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 天木生物科技有限公司-高通量自动化-细胞筛选平台 | 洛阳牡丹瓷工艺品生产厂家-特色旅游纪念品礼品定制网! | 智慧环保大数据云平台_车载走航式扬尘/恶臭/噪声污染源在线监测管控信息系统平台_环保土壤/环境监测系统云平台-奥斯恩智能科技 | 尼日利亚SONCAP认证_沙特SABER认证_摩洛哥COC认证-诺帝检测技术(上海)有限公司 | 湖南实验台-防静电工作台-实验设备厂家-长沙实验室设备有限公司-湖南贝塔实验室设备有限公司 | 铨盛国际供应链-PC增韧剂/硅系增韧剂/耐寒增韧剂/耐化学增韧剂 | 厦门空压机-厦门空压机出租-厦门钻机出租-厦门岩立盛机电设备有限公司 | 兰州物流公司_兰州货运公司_兰州物流电话上门取货_兰州立辉物流公司 | 厦门鼎星五金制品有限公司-厦门弹簧,电池簧,扣簧 | 实木运动地板价格_运动木地板厂家-欧氏实木运动地板网 | 三氯异氰尿酸_二水二氯异氰尿酸钠_氰尿酸 | 深圳市大业激光成型技术有限公司| 气胀轴丨安全夹头丨电磁制动器丨纠偏系统丨磁粉离合器丨张力控制器厂家- 东莞天机通信科技有限公司 | 潍坊志扬机械有限公司_扫地机-抓蔗机-履带运输机-自上料搅拌车 | 友信京泰-操作台-调度台-控制台-监控台定制厂家 | 饮料制造机械设备-罐体设备报价-CIP清洗设备-饮料生产线交钥匙工程-上海哲苏轻工机械有限公司 | 凝汽器换管-胶球清洗装置-二次滤网_连灵动 | 图观 - 数字孪生 应用开发引擎 | 三维可视化 | 江苏吉宏特专用汽车制造有限公司_联合吸污车-下水道管道清洗疏通车-综合养护吸排车 | 真空清洗炉_真空煅烧炉_铸铝加热器-盐城市钰凯电器有限公司 | 中陕核二一〇研究所有限公司| 智慧环保大数据云平台_车载走航式扬尘/恶臭/噪声污染源在线监测管控信息系统平台_环保土壤/环境监测系统云平台-奥斯恩智能科技 | 山东向阳电子科技有限公司-多用户集中式电能表生产厂家,NB物联网水表,刷卡水电表生产厂家,泰安智能水电表价格 | 小字符喷码机,激光喷码机,喷码机厂家_山东闪创电子设备有限公司 小型生活污水处理设备_MBR膜生物反应器_口腔医院/脱脂污水处理设备_酸洗磷化/喷涂废水处理设备-上海台江环保 | 深圳PCB电路板厂|PCB线路板厂|FPC柔性电路板厂|FPC软性线路板生产厂家|恒成和电路板:18681495413 | 输送机电动滚筒_山东电动滚筒_输送机滚筒_皮带输送机-山东中输输送机械有限公司 | 木别墅-小木屋-防腐木木屋-成都腾龙装配式建筑科技有限公司 | 湖南长沙手术室、实验室、无尘室、洁净室、无尘车间的净化工程装修公司-福临建设 | 粮食烘干机|玉米烘干机|稻谷烘干机|小麦烘干机|大型连续烘干塔|500吨连续烘干塔|钢板仓|-郑州新光矿山机械制造有限公司 | 蒸汽孔板流量计-法兰式孔板流量计-一体化标准孔板流量计-金湖中原仪表有限公司 | 饲料车_散装饲料车_畜禽运输车_散装饲料运输车_饲料车厂家_铝合金运猪车-程力专用汽车股份有限公司 | 石家庄华龙鼎电动门,石家庄电动门电话,石家庄电动门配件,石家庄电动门维修电话,石家庄电动门安装电话,石家庄华龙电动门 | 氯化亚铜_氯化亚铜厂家_衡水丰亿工贸有限公司 | 郑州井盖雨水篦子厂家-建联建材 郑州建网站,郑州做网站,郑州网站建设,郑州网站制作,郑州高端定制网站,郑州APP开发 | 浙江创洁卫生消杀有限公司-浙江杀虫公司,温州消杀公司,温州灭鼠公司,灭蟑螂,灭蚊蝇,灭跳蚤,灭书虱,灭臭虫,灭螨虫,白蚁防治,房间消毒除味等专业服务 | 水暖空调厂家|山东水暖空调厂家|泰安燃气壁挂炉-泰安市鸿雁科贸有限公司 | 艺考培训-中影人教育 【官网】-中国艺考教育的引航者 | 景观造雾_人造雾设备_雾森系统_冷雾降温_雾化消毒_喷雾除尘厂家-成都景程雾森 | 青岛抛丸机_抛丸清理机_树脂砂设备_除尘设备| 上海品牌设计公司|品牌策划公司|包装设计公司|上海全案LOGO设计VI设计-木马品牌设计 | 硬度计-布氏硬度计-维氏硬度计-莱洛特试验仪器有限公司 |