模块编译
1、假设有如下的目录结构
其中driver中是模块的源码,linux-2.6.35-farsight中是已移植好了的linux内核源码,rootfs是通过nfs挂载的嵌入式根文件系统的目录
2、进入内核目录,内核按照正常的步骤进行配置(make menuconfig),执行内核映像文件的编译(make zImage)。注意:这两个步骤将内核进行了配置并自动生成了一些模块编译所使用的头文件
下面为可选
3、编译内核自身目录下的模块:make modules
4、安装内核自身目录下的模块:make INSTALL_MOD_PATH=../rootfs modules_install。其中“INSTALL_MOD_PATH=../rootfs”是nfs挂载的嵌入式根文件系统的目录相对于内核源码目录的位置,也可以用绝对路径,“INSTALL_MOD_PATH”这个变量需要按照实际的目录结构进行赋值。
5、执行了上述操作后,在nfs挂载的嵌入式根文件系统的目录会自动生成lib/modules/2.6.35/目录,并将内核自身编译出的模块和一些模块的依赖文件拷贝到该目录下
6、在driver目录下编写模块的源文件和Makefile,Makefile的模版如下:
#ifeq ($(KERNELRELEASE),)
PWD ?= $(shell pwd)
KERNELDIR ?= /home/kevin/Workspace/S5PC100/kernel/linux-2.6.35-farsight
INSTALLDIR ?= /home/kevin/Workspace/S5PC100/rootfs
modules:
modules_install:
clean:
.PHONY: modules modules_install clean
#else
obj-m := chardev.o
#endif
使用时只根据实际情况修改KERNELDIR、INSTALLDIR两个变量和模块的文件名(即“obj-m :=”之后的名字)即可。其中KERNELDIR是内核源码树的目录,INSTALLDIR是nfs挂载的嵌入式根文件系统的目录
7、进入到driver目录,执行make命令可以编译出本目录下的模块
8、进入到driver目录,执行make modules_install命令可以将本目录下的模块安装到nfs挂载的嵌入式根文件系统的目录的lib/modules/2.6.35/extra/目录下
9、以上操作都是在PC机上进行的
10、在嵌入式linux系统的终端中执行“depmod”命令,可以解决模块的一些依赖关系
11、在嵌入式linux系统的终端中执行“modprobe xxx”(xxx是模块的名字)命令,可以自动装载相应的模块,并自动解决依赖,把依赖的模块一同装载
12、在嵌入式linux系统的终端中执行“rmmod xxx”(xxx是模块的名字)命令,可以卸载模块,但是如果模块正在被使用,卸载将会不成功