我靠,這個可真TM的折騰人啊(先咆哮兩句)。沒人告訴我驅動開發還得要搭建環境,拿著《linux裝置驅動》這本書,一開始我就蒙了,真的!不知道還得構建一個核心樹,心裡想linux作業系統不是已經裝了嗎?我現在也沒明白為什麼還要自己去構建一核心樹。兩天半啊,啥事也沒幹就搭建它了。哎。
1. 我的機器上裝的是LINUX 6.0(伺服器),核心版本2.6.32.7.所以我下載的標準LINUX核心源碼也是這個版本,在這裡下載相應的核心源碼然後頁面搜尋你需要的版本例如你linux-2.6.32.7則搜linux-2.6.32.7.tar.bz2這是源碼包。版本不一致的話,真的會有問題的(哥鬱悶過了)。
然後解壓到/usr/src目錄下:tar -zxvf xx.tar.gz 或者tar -jxvf xx.tar.bz2(xx就是如:linux-2.6.32.7啦)。
2.編譯核心碼:
step1:make oldconfig (or make menuconfig)
step2:make
這一step花時間很長,我大概是40分鐘,還有就是注意系統時間設定下,我就是因為一開始沒有設定系統時間所以make就一直報:時鐘錯誤....。哎我的嗎呀,這個東西搞死我了。
step3:make bzImage
step4: make modules
step5:make modules_install
step6:make install
3.修改boot鏡像檔案
進入/boot下,你會發現多了一個Vmlinuz-2.6.32.7檔案,和initramfs-2.6.32.7.img檔案,這個可都是剛剛編譯核心出來的啊。
然後我們再進入/boot/grub,開啟menu.list文檔,你會發現裡面會有root=,把原來系統內建的刪掉,保留我們編譯的核心。不然的話(uname -r)預設的是原來系統內建的版本。(我靠我已不知道為什麼原來的版本後面還多一段字串就是2.6.32-71.el6.i686).
4.現在可以開始我們的hello,world了。
例子是書上的:
// hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "goodbye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
然後寫個Makefile文檔:
obj -m:=hello.o
儲存到同一個目錄例如:/usr/drivermodules
cd到這個目錄然後:
make -c /lib/modules/(uname -r)/build SUBDIRS=$PWD modules (ubame -r 其實就是你的核心版本號碼的目錄)
看看是不是多了幾個檔案?yes!下一步:
ok!你載入一下insmod hello.ko
再執行dmesg,看到hello,world了吧
rmmod hello.ko,看到goodbye,cruel world
當然前面的那個命令有點長,我們可以直接卸載Makefile文檔裡面:
#mark start
obj-m:=hello.c
KERNELDIR=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(RM) *.o *.ko *.mod.c Module.symvers
#make end
完了!
閱讀全文
類別:Linux 查看評論