2017年6月28日 星期三

Chapter 1: Hello world kernel module

簡單記錄一下第一支kernel module


#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h>   /* Needed for the marcos */

MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye~~~\n");
}

module_init(hello_init);
module_exit(hello_exit);



 Makefile

obj-m += hello.o

KERNEL=/lib/modules/`uname -r`/build

all:
    make -C $(KERNEL) M=$(shell pwd) modules

clean:
    make -C $(KERNEL) M=$(shell pwd) clean

module_init()以及module_exit()是kernel module初始化的起點,所以是kernel module不可或缺的要素。module_init()以及module_exit()裡面代的參數分別是起始與結束的函數。從例子可以看到起始函數是hello_init()而結束函數是hello_exit()。
因此當用insmod去載入編譯好的ko檔時,透過dmesg可以看到字串"Hello world",而用rmmod時可以看到字串"Goodbye~~~"。

當要在kernel裡面秀出message時要透過printk()來達成,printk的用法跟printf很像,只是printk要加入message的level(Ex: KERN_INFO, KERN_DEBUG)。

To be continued....

2017年5月30日 星期二

Linux kernel 學習心得


    大約半年前從Non-OS的世界跨到embedded linux世界,
這巨大轉變可以對我來說可以說是非常艱辛阿,
雖然以前在學校有學過linux系統,但早就忘光光啦!

    學Linux kernel一開始翻網路上的資料以及身邊朋友的推薦就先看了傳說中的Linux聖經書"Linux Device Drive, 3e" (作者是 Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman)。在看LDD之前我對linux kernel的認識可以說是零,也就是完全不認識!在這情況下去看LDD可以說是非常痛苦... 雖然書中有提供例子參考,但是我連第一個例子都不知道要怎麼下make去build出kernel的ko檔,硬是死讀了幾章之後發現這樣下去不行,書中的介紹很多(字超級多!! 作者怎麼這麼會啦賽...),但是我一點都看不懂在說什麼,於是找另一本書來看。

    第2本書"Linux Device Driver Programming驅動程式設計" (作者是平田豐) 。這一本才真正開啟我對Linux kernel的大門,為什麼哩?因為書中有明確的例子可以參考!!!Oh my god! 有範例才是王道阿!!而且還是可以執行的範例,不是那種辛苦打了範例程式碼之後,結果make一直過不了,e04! 有了實際例子可以編譯並執行,我才真正可以體會每一段程式碼在幹什麼且會達到怎樣的效果。所以這本非常適合沒有任何底子的初學者來看,非常快就上手! 當初要是早點看這本書的話,工作上就不會被電得不要不要的... (但這又牽扯到新人訓練跟公司環境問題,唉~ 無奈啊~,有實力的人不一定懂得如何教人...)。

    還好只是想了解linux kernel的基礎知識,修改kernel code的機會不大,至少對於kernel code的寫法以及架構有比較清楚的認識了。接下來還有user space的東東要學,感覺這也是一個蠻龐大的東西啊...