• <code id="zjelh"></code>

          <source id="zjelh"><form id="zjelh"></form></source><acronym id="zjelh"><form id="zjelh"><blockquote id="zjelh"></blockquote></form></acronym>

          1. <acronym id="zjelh"><form id="zjelh"></form></acronym>

            <input id="zjelh"><rt id="zjelh"></rt></input>
            <var id="zjelh"><rt id="zjelh"></rt></var>
            <source id="zjelh"><form id="zjelh"><del id="zjelh"></del></form></source>
            Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育集團<北京總部官網>,專注嵌入式工程師培養15年!
            當前位置: > 華清遠見教育集團 > 嵌入式學習 > 講師博文 > 揭開linux內核中container_of的神秘面紗
            揭開linux內核中container_of的神秘面紗
            時間:2016-12-22作者:華清遠見

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

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

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

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

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

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

            下面來看看比較復雜的內容:

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

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

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

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

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

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

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

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

            程序運行結果:

            發現沒有如果把第二個值 減去后一個值,就能得到第一個值。

            在回首一下它:

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

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

            發表評論
            評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
            yy4480影院