方法一:用 module 的方式撰寫 driver

將 driver 製作成 module 的好處是可以在不重開機的狀下,重複載入更新過的 driver ,在開發 driver 時是一個方便的許選擇。

在編譯 module 前,要先更新 ubuntu 的套件。請在終端機下鍵入:

sudo apt-get install module-assistant

1.調整 kernel 為接受 module

因為原本預設的 kernel config 並不接受動態掛載 module ,我們要新增對 loadable module 的支援。

首先找到在實驗二中所使用的 linux kernel 原始碼,接著在的 menuconfig[3] ,找到 「 Loadable Module Support 」,並將它裡面的 「 Enable loadable module support 」、「 Module unloading 」以及「 Forced module unloading 」勾選為 built-in ,再存檔離開即可。

接著請重新編譯 kernel ,即可產生支援動態掛載 module 的 kernel image 了。

[3] 編譯 linux kernel 的相關步驟可參考實驗二

2 編譯 driver module

編譯 module 的方法和一般的程式有一些不同,請先到 opencsl 網站下載 Makefile :

wget http://opencsl.openfoundry.org/src/Makefile

將它和 demo.c 放到同一層目錄,並在上面鍵入 [4]

make -C <linux>  M=$(pwd) modules ARCH=arm CROSS_COMPILE=arm-linux-uclibc-

即可產生 demo.ko ,這是我們之後要拿來掛載的 module 。

[4] <linux> 為 linux source 的根目錄路徑

3 掛載 driver

在 linux 中和 module 有關的指令有三:

  1. insmod : 掛載 module
  2. lsmod : 檢查目前 module 的狀態
  3. rmmod :卸載 module

在用 QEMU 載入新 kernel image 後,可以在 demo.ko 的目錄下鍵入

insmod demo.ko

即可將 demo 載入 kernel 中。此時可用 lsmod 來確定 demo 是否有被成功掛載。

在掛載 demo 的同時,我們也可以發現 linux 有印出我們在 demo.c 裡定義的訊息。

若要將 demo 移除或重新掛載,可以鍵入

rmmod demo.ko

就可以將 demo 移除。


方法二:將 driver 寫成 kernel 的一部分

若想要將 driver 編成 kernel 的一部分,在開機時就直接掛載到 Linux 上,要先將 driver 程式放在 kernel source 裡,並將 Makefile 作一些調整使編譯 kernrl 時能夠將 driver 囊括進去。

1 編輯 driver source

請將在 2.2 完成的 driver source 放到 <linux>/driver/char/ 目錄中,這裡放的是 linux character device driver 的程式碼。

2 調整 Kconfig

接下來,我們要調整 Kconfig 使 make menuconfig 時出現 demo driver 的選項。 <linux>/driver/char/Kconfig 是定義 menuconfig 的檔案,請跳到最後一行,並在 endmenu 前加入

config DEMO
tristate "DEMO driver for OPENCSL"
default n

其中 config DEMO 是宣告一個新的選項叫做 DEMO ,它的說明為 DEMO driver for OPENCSL , menuconfig 的預設是沒有選取。

3 調整 Makefile

再來是調整 Makefile ,使 driver 能夠在編譯時被包含到 kernel 中。在 <linux>/driver/char/Makefile 這個關於 character device driver 的 Makefile 中找到

obj-$(CONFIG_TCG_TPM) += tpm/

並在其下一行加入

obj-$(CONFIG_DEMO)   += demo.o

即可。

4 重新編譯 kernel

最後,使用 cross-compiler 重新編譯 kernel ,即可產生包含 DEMO driver 的 kernel image 。

測試 driver

我們可以撰寫一個簡單的測試程式來觀察 driver 的運作模式。

#include <stdio.h>
int main()
{
char buf[512];
FILE *fp = fopen("/dev/demo", "w+");
if(fp == NULL) {
printf("can't open device!\n");
return -1;
}
fread(buf, sizeof(buf), 1, fp);
fwrite(buf, sizeof(buf), 1, fp);
fclose(fp);
return 0;
}

接著,使用 cross-compiler 並加上 -static 參數即可編譯出執行檔。

 新增 device

在使用測試程式之前,我們必須先在 /dev 中建立 driver 要用到 device ,在開啟 qemu 後鍵入

mknod /dev/demo c 60 0

其中 c 為 character device 的意思,60 以及 0 則分別為該 device 的 major 和 minor number

 使用 driver

我們可以透過執行剛編譯出的測試程式來觀察 driver 的運作流程,或是直接在命令列鍵入

echo "?" >  /dev/demo

對 /dev/demo 寫入一些資料,也會產生類似的效果。

arrow
arrow
    全站熱搜

    pcman 發表在 痞客邦 留言(0) 人氣()