新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 編譯在arm板上運行的內(nèi)核模塊

編譯在arm板上運行的內(nèi)核模塊

作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
前兩天被這個事情搞暈了,看視頻的時候感覺編譯一個內(nèi)核模塊很簡單的,就是修改makefile的兩個地方,但是自己一做就出現(xiàn)問題了,因為我是自己自學(xué)的,身邊沒有可以指導(dǎo)的人,所以很多都要靠自己摸索了,我自己編譯的時候出現(xiàn)很多警告信息和錯誤,提示找不到頭文件,還有一些看不懂的信息,到處找資料,但是都沒有說清楚,看了很久也沒看出什么對自己有用的東西,看的頭暈,準(zhǔn)備放棄了,今天在學(xué)習(xí)的時候又去看結(jié)果看到一篇博文,才煥然大悟,makefile里面要改的源代碼路徑是移植到arm板上的linux源代碼,才突然想起來,我自己改錯了,就是要把路徑指上你開發(fā)板上運行的linux內(nèi)核源代碼的頂層路徑,我是用的通過nfs啟動系統(tǒng)的,是按照國嵌的視頻一步步做的,所以我的路徑在我的nfs所在的路徑。這些問題對于一些學(xué)了很久的人來說可能很低級,但是對于初學(xué)者來說可能碰到后半天搞不好,所以寫下來供參考。。。

下面是我自己找的一個小實驗:

本文引用地址:http://m.butianyuan.cn/article/201611/319249.htm

#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");
static int __init hello_init()
{
printk(KERN_EMERG"Hello World!n");
return 0;
}
static void __exit hello_exit()
{
printk(KERN_EMERG "Goodbye Cruel World!n");
}
module_init(hello_init);
module_exit(hello_exit);
第一步是編譯,首先要做的是設(shè)置交叉編譯器,修改makefile,打開makefile文件,如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR := /forlinux/kernel/linux-2.6.28
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
首先需要指定kernel的源代碼路徑:
我的是KDIR :=/opt/GTStudio/GT2440/opt/GTStudio/GT2440/linux-2.6.30.4/
這個路徑由自己決定,移植的arm平臺下的linux源代碼放在什么地方就填什么路徑,如果指定錯誤的話,會提示找不到下面兩個文件的。
#include
#include

然后指定交叉編譯器,CROSS_COMPILE=arm-linux-(前提是你的arm-linux-gcc安裝到根目錄下了,而且修改了環(huán)境變量,否則需指定安裝路徑)
makefile主要修改這兩個地方就OK了,保存關(guān)閉。
在控制臺命令下,進(jìn)入hello.c目錄,make,可以看到hello.ko內(nèi)核模塊生成了,將它拷貝到2440板上:
insmod hello.ko
可以看到hello world打印信息,但是在rmmod的時候,確無法卸載,需要在linux源碼目錄下,執(zhí)行make prepare一下,修復(fù)bounds.h文件。
再rmmod hello



關(guān)鍵詞: 編譯arm板內(nèi)核模

評論


技術(shù)專區(qū)

關(guān)閉