在写第一个外部驱动模块(hello.ko)遇到的问题剪辑:
1:在执行默认平台上的一些配置的时候,通常会make XX_config之类的东西,
XX_config的位置位于arch/xxx/configs/*,最终在linux的目录下生成“.config”的配置文件;
2:内核编译器的指定在linux-2.6.24/Makefile中说明的;
3:在交叉编译ko模块的时候,需要在Makefile中指定编译器(隐式的)!看下面的sample code--》
4:在跨平台编译module的时候,需要指定目标平台的内核文件目录(KERNELDIR:=/lib/modules/$(shell uname -r)/build),其中目标内核的库文件;
这个路径(构造好内核源代码树)是哪里来的呢,在编译内核的时候,通过make modules_install可以在本地机上/lib/modules/2.6.24处(不是本地内核那个,ex:我的主机2.6.32-71.el6.i686)生成目标机器(开发板环境)内核文件目录;
5:EX Code:
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
简化过程:
AA:"/lib/modules/$(KVERS)/build " 参数1
BB:" M=$(CURDIR) "参数2
CC:"modules" 相当于target;
make 【-C 参数1】【 参数2】 modules,进一步简化==>make modules
其中-C的含义是在执行Makefile之前,预读AA中所有的内容;
-C指定代码树的位置,M=$(CURDIR) 则是回到当前目录来执行build;
完整代码过程:
[root@localhost hello]# make
make -C /lib/modules/2.6.24.3/build M=/opt/china_ldd/drivers/hello modules
make[1]: Entering directory `/opt/linux-2.6.24.3'
CC [M] /opt/china_ldd/drivers/hello/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /opt/china_ldd/drivers/hello/hello.mod.o
LD [M] /opt/china_ldd/drivers/hello/hello.ko
=========================Makefile============================
| 1 KVERS =2.6.24.3
|3 #KVERS = $(shell uname -r)
| 5 # Kernel modules
| 6 obj-m += hello.o
~ | 7
~ | 8 # Specify flags for the module compilation.
~ | 9 #EXTRA_CFLAGS=-g -O0
~ | 10
~ | 11 build: kernel_modules
~ | 12
~ | 13 kernel_modules:
~ | 14 make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
#编译器也在这里面啦,应该是借用内核配置ARCH :=mips CROSS_COMPILE :=mipsel-linux-
~ | 15
~ | 16 clean:
~ | 17 make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
6:完了之后,将生成的hello.ko加载到pc上的时候,就会出错(执行平台不匹配),但是在开发板上执行insmod的时候,则出现”hello module“大功告成;
阅读(3999) | 评论(0) | 转发(0) |