Linux模組程式設計系列之一 編譯與安裝

2021-04-13 21:37:52 字數 1117 閱讀 4605

1.

編譯相關的問題

為了區別與應用程式,核心模組在編譯的時候都需要定義如下幾個巨集

__kernel__

module

由於核心中有很多inline限定的函式,所以在編譯的時候,應該對編譯器的優化機制有所了解。gcc通過帶引數-on(0,1,2,3,4)告知編譯器優化等級。如果不做優化,那麼inline將不起作用;但在-o2以上,gcc主動的將某些非inline函式內聯,也將導致問題,所以編譯模組時,應將優化等級設在-o 與 –o2之間,以確保inline特性的正確性。

如果模組由多個.c檔案實現,最終需要把多個由.c生成的.o檔案組合成乙個檔案。這個時候可以用ld –r來實現.-r(relocateable)告訴ld,不需要做link動作(link的時候會去找每個符合的定義),只是把輸入的檔案重新定位,產生乙個輸出檔案。

2. 核心的版本

在中定義了與版本相關的幾個巨集

#define uts_release "

2.4.20

-8"string

形式的版本號

#define linux_version_code 132116 int

型的版本號

#define kernel_version(a,b,c) (((a) << 16) + ((b) << 8) + (c))

通過主版本號a,副版本號b與修改號c生成版本號

3. 建立裝置節點

如何模組註冊了乙個裝置(如register_char_device),在正確安裝後,會在/proc/device檔案下寫一條記錄,可以查閱模組的major number,名字和型別。為了方便應用程式操作該裝置,需要在/dev下面建立相應的節點。可以用mknod建立乙個裝置節點。例如在/proc/device裡有一條mymod的記錄,通過如下方式建立其在/dev下的對應節點:

major_number = cat /proc/device | awk 「/$2=mymod 」

mknod /dev/mynod c $major_number 0

c –

字元裝置

$major_number –

主版本號

0 –

從版本號,系統只認主版本號,從版本可自行定製

linux命令系列之一

du wzwz h 檢視目錄或者檔案wzwz占用空間的大小 ls 1 每行顯示乙個 ls more 分頁顯示 ls a 全部顯示包括隱藏檔案和目錄 ls l 顯示每一項的詳細資訊 groupdel 刪除組 userdel 刪除使用者 top 顯示系統程序 df h 檢視磁碟各分割槽的使用情況 df ...

7z系列之一 7zip SDK中C 模組的編譯

最近想使用7zip壓縮,就研究了下7zip的sdk,將過程留下,分享與大家。這是本篇系列的第一篇,主要內容就是編譯。嚴格來說,7zip這個詞是有問題的,因為官方使用了不同的詞來表達恰當的含義,如下圖所示 因為這次研究的主要目的就是在c 中解壓縮7z格式檔案,為了方便下文就稱為7zip。目前版本 9....

神話系列之一 C 程式不能反編譯

網上流傳很多c和c 神話 我聽了以後,決定打破這些美麗的神話。給大家開開眼界,更希望能說明乙個神話,解開我 最神秘的等待 c程式能不能反編譯成 c語言的程式?神話 無法反編譯的,只能通過彙編來解釋。詳細 c語言源程式經過編譯 優化,得到目標格式,但由目標格式不能逆推得到c原始碼,因為目標碼可能是經過...