對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 事件成員 函式成員 方法,屬性,建構函式,終...