一、内核源码树配置
因为开发板的linux内核是2.6.12,所以内核源码树也用统一个内核版本构建。
1.准备内核源码包,并解压,得到目录linux-2.6.12:
tar -jxvf linux-2.6.12-090915.tar.bz2
2.进入目录linux-2.6.12
cd linux-2.6.12
3.修改顶层目录下的Makefile(linux-2.6.12/Makefile)把文件中的
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为:
ARCH =arm
CROSS_COMPILE =arm-linux-
4.make menuconfig(配置内核)
. 我的内核是是直接从飞凌的资料里复制过来的,配置时选择“load an alternate configuration file”,然后双击 .config 区域,改为S3C2440.CFG(linux2.6.12目录下以存在这一文件)。当然也可以手动配置。
5.配置完成后, make -> make modules ->make modules_install,命令完成后,在/lib/modules中就有了2.6.12-1940。内核在此文件夹中。
6.针对arm平台的内核树安装完成。
执行过程中遇到的问题:sudo make modules_install 时,提示 “make: arm-linux-gcc: Command not found”。
问题分析 :sudo make modules_install 获取超级用户权限来进行操作,你要先切换到root用户(su root)。
ubuntu默认进入普通用户,而root用户没有启用。
解决办法:sudo passwd root 设置root密码,su root命令进入root用户。执行命令 arm-linux-gcc -v,如果已经成功安装交叉编译器,会出现编译器版本信息。
二、第一个模块程序
hello_world.c
#include
#include
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,linux.\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("ly");
MODULE_DESCRIPTION("my first module,hello_world");
Makefile
obj-m := hello_world.o
KERNELDIR := /lib/modules/2.6.12-h1940/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *~
粗心将 obj-m := hello_world.o 写成了 obj-m := hello_world ,出现错误 arm-linux-gcc: no input files。
改正后 make, 生成 hello_world.ko。
通过minicom将模块传送到开发板,改变权限后可以加载运行模块。
insmod ./hello_world.ko 加载模块
rmmod hello_world 卸载模块
完。。。