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

 一、内核源码树配置   

       因为开发板的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          卸载模块


完。。。


你可能感兴趣的:(嵌入式软件开发,配置构造内核树,linux,hello_world模块,驱动)