模組的一些基礎知識

2021-03-31 08:56:29 字數 2052 閱讀 1840

對linux核心而言, 模組是可有可無的特色。 這項特色必得在編譯核心時,選擇適當的選項才得以成功。 就我所知道的, 所有發行系統的核心,都是以模組化定為預設選項的。

我們甚至於可以替系統設計新的模組, 並且有核心載入執行,而不用重新編譯核心, 也不用重新啟動系統。

當一模組載入核心時, 便成了核心的一部份, 因此:

這個模組可以使用核心中所有的函式,而且可以訪問所有的引數和資料結構。

這個模組會以處理器最高層次的檔位來執行。 就 i386 的體系結構來說,就是第 0層的環 (ring level 0); 這麼一來, 這個模組就可以針對 i/o,做各式各樣的訪問動作, 並執行一般程式所無法執行的指令。

模組的**段和資料段, 都是直接對映到物理記憶體上去的,也就是說這種模組不可能做"分頁 (paging)" 的動作。這麼說來, 在模組執行期間, 就不可能會產生分頁錯誤的問題了。

如同我們所看到的, 動態載入模組已經有一些實時系統的特點:動態載入模組, 會避免由分頁錯誤所造成的時間延遲,而且動態載入模組, 可以訪問所有的硬體資源。

模組可以用 "c語言" 來寫。 這裡舉個例子(要執行下面所提到的命令,最好是以 su、root 的身份登陸系統):

example1.c

#define module

#include

#include

static int output=1;

int init_module(void)

void cleanup_module(void)

# gcc -i /usr/src/linux/include/linux -o2 -wall -d__kernel__ -c example1.c

選項 -c 是要求 gcc 在產生目標檔案之後就停下來,不要再做連線的動作了。 最後的結果是乙個目標檔案, example1.o。

核心缺少標準輸出函式, 因此我們不可以用 printf() 這個函式,而要以核心所提供的 printk()函式來代替。 printk() 和 printf() 幾乎沒有什麼兩樣, 唯一的差別是 printk() 會把輸出的結果,送到核心的環緩衝區 (ring buffer)裡面。這個緩衝區是系統所有資訊集中的地方, 就像開機時所看到的資訊,都可以在這個環緩衝區找到。 任何時候, 我們都可以用 dmseg 命令檢視環緩衝區的內容, 或是直接檢驗 /proc/kmsg 這個檔案。

注意到這個模組裡並沒有main() 函式, 反而有個不帶任何引數的 init_module()函式。 cleanup_module() 是最後乙個釋放模組前,所必須呼叫的函式。 in**od 是用來載入模組,然後執行模組的。

# in**od example1.o

現在我們已經安裝好 example1 模組了, 而且也執行了 example1 的 init_module()函式。 要看結果, 請用下列的命令:

# dmesg | tail -1

output= 1

命令 l**od 會列出當前所有載入核心中的模組:

# l**od

module pages used by:

example1 1 0

sb 6 1

uart401 2 [sb] 1

sound 16 [sb uart401] 0 (autoclean)

最後呢,我們用 rmmod 來釋放模組:

# rmmod example1

# dmesg | tail -2

output= 1

adi, bye, chao, orvua,

dmesg 顯示了函式 cleanup_module() 已經執行了。

現在我們只差還不知道怎麼把引數傳遞給模組了。 這個方法出奇的簡單,只要指定數值給引數, 再由 in**od 把引數傳遞給模組就行了。例如:

# in**od ejemplo1.o output=4

# dmesg | tail -3

output= 1

ads, bye, chao, orvua,

output= 4

現在模組大大小小的事情該知道的都知道了,還愣著幹什麼,趕緊學著寫乙個啊!

一些基礎知識

關於cd cd 返回剛才的位置 關於ls ls l,簡寫ll ls a顯示的檔案以.開頭,隱藏檔案 la al 關於cp cp r tmp dir 拷目錄 tmp拷到dir 需要加 r的 cp rm 10 13 1.grep 在乙個字元集合中找到符合條件的行輸出 如 grep hello file ...

一些基礎知識

linux基礎知識考查 1 在linux 系統中,以 檔案 方式訪問裝置 2 前台起動的程序使用 ctrl c 終止。3 在使用ls 命令時,用八進位制形式顯示非列印字元應使用引數 b 4 在linux 系統中,用來存放系統所需要的配置檔案和子目錄的目錄是 etc 5 在linux 系統中,壓縮檔案...

一些基礎知識(一)

1 類成員的組成 函式成員和資料成員 資料成員 字段,常量,事件成員 public int a 0 字段成員 public const int b 90 常量public event customeventhandler raisecustomevent 事件成員 函式成員 方法,屬性,建構函式,終...