嵌入式linux2.6.12内核源码树配置及hello_world模块实验

2019-07-13 06:49发布

 一、内核源码树配置   
       因为开发板的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. ");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye,linux. ");
}
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          卸载模块
完。。。