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
- LDD3源码学习日记<一>
- LDD3源码学习日记<二>
- LDD3源码学习日记<四>
- LDD3源码学习日记<五>
- LDD3源码学习日记<六>
- LDD3源码学习日记<七>
- LDD3源码学习日记<八>
- LDD3学习笔记(一)
- LDD3源码学习笔记之scull_pipe转
- springFramework 源码学习日记(一)源码下载与编译
- LDD3学习-第十章-中断处理<一>
- ldd3 5 继续学习ldd3
- ldd3学习笔记--环境搭建(构建linux2.6.10源码树)
- PHP学习日记一
- DODS学习日记(一)
- Ajax学习日记一
- ActiveDirectory学习日记(一)
- Java学习日记(一)
- 冒泡排序
- Linux命令行下编辑常用的快捷键
- 丢包导致的视频花屏马赛克问题解决办法
- jquery画小图插件-jquery.sparkline.js
- LayoutInflater的使用
- LDD3源码学习日记<一>
- 人可以被毁灭,但不可以被打败
- 模拟鼠标键盘事件的工具简介--xdotool
- 将XP风格文件manifest合并到资源文件
- tar.xz解压
- Java设计模式---简单工厂
- opencv笔记7----Mat访问每个像素
- Oracle EBS数据定义移植工具:Xdf(XML Object Description File)
- 精通Android4学习笔记-intent