Pages

2014年5月15日 星期四

[linux driver] #1 Build a quick hello_world as module driver under Ubuntu


最快速的方法,建立一個 module 型態的 linux driver

1.  創建一個 hello_world.c 。並在裡面貼入下面的程式碼。含註解

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

/*上面的include 和 下面的所有程式,一個 driver的最小需求。一定得有。*/

static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}
module_init(hello_start);
module_exit(hello_end);


2. 為了要build 它,為它寫一個Makefile。創建一個檔名叫做 Makefile的文字檔。gedit or vim....
並且貼入下面命令。

obj-m = hellow_driver.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean



***一定要注意,Makefile 很重視格式。 all: 下一行的 make 之前,一定要用 tab 來空格。這樣你打make它才會認到。


obj-m = hellow_driver.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean


好了,就這些。 我們檢查一下現在應該有的狀況。



在你的driver 資料夾下,直接打ls,應該就只有這兩個檔案如下。

~/Documents/liunx_driver/example_hello_driver$ ls
hello_driver.c  Makefile



3.make 它。

~/Documents/liunx_driver/example_hello_driver$ make
make -C /lib/modules/3.11.0-15-generic/build M=/home//Documents/liunx_driver/example_hello_driver modules
make[1]: Entering directory `/usr/src/linux-headers-3.11.0-15-generic'
  CC [M]  /home/Documents/liunx_driver/example_hello_driver/hello_driver.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home//Documents/liunx_driver/example_hello_driver/hello_driver.mod.o
  LD [M]  /home//Documents/liunx_driver/example_hello_driver/hello_driver.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.11.0-15-generic'


make完,在ls 看一下,多了很多檔案,其中 .ko 的檔案就是我們要的kernel module driver 檔
Documents/liunx_driver/example_hellow_driver$ ls
hello_driver.c  hello_driver.ko  hello_driver.mod.c  hello_driver.mod.o  hello_driver.o  Makefile  modules.order  Module.symvers


4. insmod module driver by the following command.
jerry@jerry-VirtualBox:~/Documents/liunx_driver/example_hello_driver$

sudo insmod ../example_hello_driver/hello_driver.ko 





5.我們可以看一下,在module init 的function 中,所印的message 有沒有被執行到。
打 dmesg 看一下kernel log.
jerry@jerry-VirtualBox:~/Documents/liunx_driver/example_hello_driver$ dmesg
..............
............
[15333.654875] Loading hello module...
[15333.654877] Hello world


有了。


6. the same, if you want go unmount or remove this driver , you can type....

sudo rmmod ../example_hellow_driver/hellow_driver.ko


And if you check the dmesg log, you will see....
.....................
.......................

[15603.477087] Goodbye Mr.

那正是我們在exit function 印的log 。





Summary:
1.一個driver 最少也要有init, 和 exit function.
2.init, 和 exit function 也是相對應在driver 被載入和卸載時被呼叫。
3. __init 前面的 __ 是兩個底線。給compiler 看的。

static int __init hello_start(void)
{
xxxxxxx
}
4.Makefile 裡面第一行的 obj-m = hello_driver.o  的檔名要和driver 名稱一樣。

5.Makefile 中的make 指令前面,要用tab 鍵來產生空格。



到這裡,一個可以被載入和卸除的driver 算是產生了。
但是,事實上,這個還不能被ap 的人所使用,且目前也不
屬於任何一種型別的driver。接下來,我們還要再讓它去註冊。
成為某一種類型的driver。











沒有留言:

張貼留言