LDD3源码学习日记<一>

来源:互联网 发布:rac数据库启停步骤 编辑:程序博客网 时间:2024/05/06 05:08

花了一周的时间把韦东山第一期关于内核模块的视频学完了,把视频里的代码都自己敲了一遍,编译,调试,对内核模块总算有了点苗头;这学期课程不多,一周三天课,一天两节。。。。大四党伤不起。准备花一个月时间好好研读一下LDD3,把基本功弄扎实点,废话不说,走起!

由于先前自己已经把Linux-2.6.30.4移植到了s3c2440上,书中说到的内核树就用它了。虚拟机使用的是红帽子5,先在虚拟机上编译好后传到开发板上的 文件系统进行测试。

<一>

hello.c

#include <linux/init.h>#include <linux/module.h>
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, cruel world\n");}module_init(hello_init);module_exit(hello_exit);
这个是最简单的程序,了解了驱动大概的框架。个人觉得值得注意的是书后面一点提到的初始化和关闭函数:

static int _ _init initialization_function(void){    /* Initialization code here */}module_init(initialization_function);
__init标记,对内核来讲,是一种暗示,表示该函数只在初始化期间使用,在模块被卸载后,模块装载器就会将初始化函数丢掉,释放其内存。注意不要在初始化结束之后仍要是用的函数上使用这个标记,__exit标记用法类似;

带参数的hellop.c,在模块中添加module_param()函数后,就可以在执行insmod指令时加入要传入模块的参数;

<二>Makefile

LDD3提供的Makefile模板:

ifeq ($(KERNELRELEASE),)//判断是否定义了KERNELRELEASE,如果为空,执行下面代码

    /*KERNELDIR ?= /lib/modules/$(shell uname -r)/build,给KERNELDIR变量赋值,该变量保存内核源码树所在的路径。*/

    /*linux各发行版本会把内核源码树的一个符号链接放在/lib/modules/$(shell uname -r)/build,如果按照上面那样赋值*/

   /*他实际指向的路径是/usr/src/kernels/2.6.18-53.el5-xen-i686,而由于需要使用我们自己建立的内核树,我给*/

   /*KERNELDIR赋的是我自己移植到开发板上的内核所在的目录*/


    KERNELDIR ?= /opt/EmbedSky/linux-2.6.30.4

    PWD := $(shell pwd)//PWD := $(shell pwd),给PWD变量赋值,该变量保存当前路径


modules:

/*如果在命令行执行make modules命令,则相应会执行下面这条命令编译模块。*/

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:

      /*如果在命令行执行make modules install命令,则相应会执行下面这条命令安装模块。*/
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:

     /*如果在命令行执行make clean命令,则相应会执行下面这条命令删除文件。*/
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY: modules modules_install clean
else
    # called from kernel build system: just declare what our modules are
    obj-m := hello.o hellop.o  //
参照这个模板,我们需要修改的就是前面的KERNELDIR和这里需要生成的.o文件名称了
endif

参考博客:http://blog.csdn.net/liuhaoyutz/article/details/7382956



原创粉丝点击