最快速的方法,建立一個 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。
沒有留言:
張貼留言