第一個 kernel module - hello
依 The Linux Kernel Module Programming Guide 文上所說的,編寫第一個kernel module
- hello.c
#include
/* Needed by all modules */
#include/* Needed for KERN_INFO */
#include/* Needed for the macros */
#define DRIVER_AUTHOR "Peter Jay Salzman"
#define DRIVER_DESC "A sample driver"
static int __init init_hello(void)
{
printk(KERN_INFO "Hello, world\n");
return 0;
}
static void __exit cleanup_hello(void)
{
printk(KERN_INFO "Goodbye, world\n");
}
module_init(init_hello);
module_exit(cleanup_hello);
MODULE_LICENSE("GPL");
MODULE_AUTHOR(DRIVER_AUTHOR); /* Who wrote this module? */
MODULE_DESCRIPTION(DRIVER_DESC); /* What does this module do */
MODULE_SUPPORTED_DEVICE("testdevice"); - Makefile
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
確定是可以在 X86 host 上成功編譯,運作也一切正常。
但問題來了,我該如何改寫 Makefile,使其能 cross compile 呢?
目前還不知道該如何解決,因為對 Makefile 及 cross compile 步驟還在粗淺的認識階段,以前也都是利用套件所提供的 configure 工具來代勞。
所以就想到將新增的 module 加到 kernel source 中,這樣就可以利用 kernel source 所提供 cross compile 的功能來幫我做相關設定了。
利用 kernel source 來 cross compile 新增的 module
- 環境設定
- Target Board 是 arm,所以在Makefile 裡: ARCH=arm, CROSS_COMPILE=arm-none-linux-gnueabi-
- 新增一個 module,在 driver 目錄下新增一個測試目錄 rayn,測試 module 位於 driver/ryan/hello.c。
- 編輯 configure 的選項
- 修改 arch/arm/Kconfig (因為我們的target 為 arm,所以必需改在 arch/arm 裡的 Kconfig 才有用)
- 加入這一行 source "drivers/ryan/Kconfig",將新增的測試目錄加到 configure 選項中
- 修改 drivers/{Kconfig,Makefile}
- Kconfig
- 新增 source "drivers/ryan/Kconfig"
- Makefile
- 新增 obj-$(CONFIG_RYAN_TEST) += ryan/
- Kconfig
- 新增目錄,driver/ryan 及所需的檔案
- Kconfig
menu "RYAN test devices"
config RYAN_TEST
bool "RYAN test"
config RYAN_TEST_HELLO
tristate "The first kernel module - hello"
depends on RYAN_TEST
endmenu - Makefile
obj-$(CONFIG_RYAN_TEST_HELLO) += hello.o
- hello.c
- Kconfig
- 修改 arch/arm/Kconfig (因為我們的target 為 arm,所以必需改在 arch/arm 裡的 Kconfig 才有用)
- make menuconfig,將 hello 編為 module。可以看見新增的選項
[*] RYAN test
The first kernel module - hello
- make modules。可以看見 hello.ko 已生成。
Building modules, stage 2.
MODPOST 4 modules
CC drivers/ryan/hello.mod.o
LD [M] drivers/ryan/hello.ko
CC fs/jffs2/jffs2.mod.o
LD [M] fs/jffs2/jffs2.ko
- 在 target 上測試
bash-3.2# insmod ./hello.ko
<6>Hello, world
Hello, world
bash-3.2# rm
rm rmdir rmmod
bash-3.2# rmmod hello
<6>Goodbye, world
Goodbye, world
完畢…
2 comments:
您好,
小弟最近在學習寫Driver給Embedded System使用
照著您文章的步驟操做完後,仍然無法在make menuconfig視窗中看到選項
不知是否方便進一步聯絡
我的信箱是 yaushung (AT) gmail.com
謝謝 :)
應該是這樣....
make menuconfig ARCH=arm
不過make modules ARCH=arm 還是有錯
感覺原po有些細節可能沒有交代到...
希望能有回覆~
Many thanks!!
--
C. W.
Post a Comment