日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于__init、__initdata和__exit、__exitdata的学习笔记

發(fā)布時間:2024/9/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于__init、__initdata和__exit、__exitdata的学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
由于4年前對于C語言和Linux的知識貧乏,所以當(dāng)時對于模塊中的函數(shù)定義沒有細(xì)看。這次在溫習(xí)《LDD3》的時候,重新看了一下關(guān)于__init、__initdata和__exit、__exitdata的知識,記錄如下:
對于__init、__initdata和__exit、__exitdata的定義位于<linux/init.h>,這些宏定義的作用是告訴編譯器將這些函數(shù)或者數(shù)據(jù)放入相應(yīng)的section中,而在模塊加載的階段,.ko文件中的代碼和數(shù)據(jù)的加載區(qū)域是根據(jù)section來加載的。
比如:如果函數(shù)的定義中帶有__init,那么這個函數(shù)的所有代碼會被放入.init.text的section中。 如果函數(shù)的定義中帶有__initdata,那么這個函數(shù)的所有代碼會被放入.init.data的section中。
之所以要使用這個宏定義,其中一個原因是標(biāo)記為初始化的函數(shù)和數(shù)據(jù),表明該函數(shù)和數(shù)據(jù)僅在初始化期間使用。在模塊裝載之后,模塊裝載就會將初始化函數(shù)扔掉。這樣可以將該函數(shù)占用的內(nèi)存釋放出來。
這種釋放根據(jù)是否編譯進(jìn)內(nèi)核是有區(qū)別的: (1)模塊編譯進(jìn)內(nèi)核:所有的初始化數(shù)據(jù)和函數(shù)都是在系統(tǒng)啟動的最后階段,在所有模塊都初始化完成以后被內(nèi)核統(tǒng)一釋放的。所有你一般可以在內(nèi)核啟動信息的后面看到:
  • PHY: 0:01 - Link is Up - 100/Full
  • VFS: Mounted root (nfs filesystem) on device 0:14.
  • devtmpfs: mounted
  • Freeing init memory: 196K
  • INIT: version 2.86 booting
  • (2)獨(dú)立的模塊:模塊是通過module-init-tool中的insmod的程序利用系統(tǒng)調(diào)用來掛載的,而所有的初始化數(shù)據(jù)和函數(shù)都是被這個系統(tǒng)調(diào)用所使用的,在模塊掛載完成并初始化過后,由系統(tǒng)調(diào)用來完成對初始化數(shù)據(jù)和函數(shù)所占空間的釋放。
    所以對于將內(nèi)核驅(qū)動代碼中的函數(shù)和數(shù)據(jù)定義為“初始化”時需要注意:不要將驅(qū)動定義的文件方法(如 open、read、write、close)或者驅(qū)動在實(shí)際工作中需要使用的函數(shù)和數(shù)據(jù)定義為“初始化”屬性,因?yàn)樵隍?qū)動初始化后這些東東就已經(jīng)被釋放了,如果使用了就會Oops。
    有些網(wǎng)上的文章中寫到:
  • __init宏使內(nèi)建模塊中的init函數(shù)在執(zhí)行完成后釋放掉,不過可裝載的模塊不受影響。
  • 這個是錯誤的,這些“初始化”宏同樣影響可裝載模塊。從模塊裝載的系統(tǒng)調(diào)用源碼中你可以找到釋放的地方,他釋放的是整個“初始化”section。具體的情況請參考《深入Linux內(nèi)核構(gòu)架》的《第七章 模塊》
    從代碼上可以證明“初始化”宏同樣影響可裝載模塊,從實(shí)驗(yàn)中同樣可以,實(shí)驗(yàn)步驟: (1)在一個簡單的字符驅(qū)動中定義一個“初始化”字符串,并在模塊初始化時打印出來。在驅(qū)動的其他方法中也試圖打印這個字符串,如果這個方法被系統(tǒng)調(diào)用執(zhí)行了,那么你就得到了一個Oops。 (2)去掉這個字符串定義時的“初始化”宏,再做一邊實(shí)驗(yàn),字符串依然可以被打印出來。

    總結(jié)

    以上是生活随笔為你收集整理的关于__init、__initdata和__exit、__exitdata的学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。