Linux設備驅動程序(二)

第二章  構造和運行模塊

Hello World模塊

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL")

static int hello_init(void)

{

      printk(KERN_ALERT "Hello,World\n");

      return 0;

}

static void hello_exit(void)

{

     printk(KENR_ALERT "Goodbye,cruel world\n");

 

}

module_init(hello_init);

module_eixt(hello_exit);

1.內核模塊與應用程序的不同:大多數小規模及中規模應用程序是從頭到尾執行單個任務而模塊只是預先註冊自己以便服務於將來的某個請求,然後它的初始化函數就立即結束。應用程序在退出時,可以不管資源的釋放或者其他清除工作,但模塊的退出函數卻必須仔細撤銷初始化函數所做的一切,否則,在系統重新引導之前某些東西就會殘留在系統中。

2.用戶空間和內核空間:模塊運行在所謂的內核空間裏,而應用程序運行在所謂的用戶空間中。當處理器存在多個級別時,Unix使用最高級別和最低級別。在Unix當中,內核運行在最高級別(超級用戶態),在這種級別中可以進行所有的操作。而應用程序運行在最低級別(用戶態),在這個級別中,處理器控制着對硬件的直接訪問以及對內存的非授權訪問。每當應用程序執行系統調用或者硬件中斷掛起時,Unix將執行模式從用戶空間切換到內核空間。一個驅動程序要執行兩類任務:模塊中某些函數作爲系統調用的一部分而執行,而其他函數則負責中斷處理。

3.內核中的併發:編寫內核模塊時要銘記:同一時刻,可能會有許多事情正在發生。

4.應用程序在虛擬內存中佈局,並具有一塊很大的棧空間。當然,棧是用來保持函數調用歷史以及當前活動函數的自動變量的。而相反的是,內核具有非常小的棧,它可能只和4096字節大小的頁那樣小。我們自己的函數必須和整個內核空間調用鏈一同共享這個棧。因此,聲明大的自動變量不是一個好主意,如果我們需要大的結構,則應該在調用時動態分配該結構。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章