hello world
许多的编程都是从hello world开始编写,虽然简单但是意义重大!!!
hello.c
1 /*********************************************************************************
2 * Copyright: (C) 2015 guanlei
3 * All rights reserved.
4 *
5 * Filename: hellow.c
6 * Description: This file hellw.c
7 *
8 * Version: 1.0.0(2015年10月22日)
9 * Author: guanlei <995318056@qq.com>
10 * ChangeLog: 1, Release initial version on "2015年10月22日 19时08分08秒"
11 *
12 ********************************************************************************/
13
14 #include<linux/init.h> //所有驱动编写都要包含的头文件
15 #include<linux/module.h>
16
17
18 static int hello_init(void)
19 {
20 printk(KERN_ALERT"hello world\n"); //KERN_ALERT是在内核中定义的规定的打印级别
21 return 0;
22 }
23
24
25 static int hello_exit(void)
26 {
27
28 printk(KERN_ALERT"GOOD BEY\n");
29
30 }
31
32 module_init(hello_init); // module_init module_exit 内核中合数的宏 insmod 时会调用的module_init() 中的函数
33 module_exit(hello_exit);
34
~
~
hello world驱动的Makefile编写
适用于自己的linux操作系统
1
2 obj-m=hello.o //驱动模块从目标文件中构造
3 modules:
4 make -C /lib/modules/`uname -r`/build/ M=`pwd` modules // -C 指定内核源代码的目录 uname -r获得自己内核的版本信息 M指定编译生成的文件放在哪个路径中
5 make clean
6
7 clean:
8 rm -f *.ko.* *.o *.mod.c *.order *.symvers
~
~
make 成功后,会生成一个hello.ko的文件,insmod hello.ko (2.6版本的内核要加.ko 3.0版本的内核不用加.ko)就会在加载我们的驱动模块,若果想要看结果,敲dmesg再组后一行就会有hello world ,移除hello.ko的话要用rmmod命令,就会调用module_exit()里边调用的函数,dmesg查看信息的就会在最后一行出现GOOD BEY
2 obj-m=hello.o //驱动模块从目标文件中构造
3 modules:
4 make -C /lib/modules/`uname -r`/build/ M=`pwd` modules // -C 指定内核源代码的目录 uname -r获得自己内核的版本信息 M指定编译生成的文件放在哪个路径中
5 make clean
6
7 clean:
8 rm -f *.ko.* *.o *.mod.c *.order *.symvers
~
~
make 成功后,会生成一个hello.ko的文件,insmod hello.ko (2.6版本的内核要加.ko 3.0版本的内核不用加.ko)就会在加载我们的驱动模块,若果想要看结果,敲dmesg再组后一行就会有hello world ,移除hello.ko的话要用rmmod命令,就会调用module_exit()里边调用的函数,dmesg查看信息的就会在最后一行出现GOOD BEY
接下来的makefile是适配fl2440开发板的
Makefile
1 CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc //应为要把模块给开发板用所以我们要把交叉编译器作指定我们的编译器
2 KDIR?=/home/guanlei/fl2440/kernel/linux-3.0 //该目录是告诉Makefile 从哪找到我们的内核
3 obj-m:=hello.o
4
5 default:
6 $(MAKE) -C $(KDIR) M=`pwd` modules
7 make clean
8
9 clean:
10 rm -f *.ko.* *.o *mod.c *.order *.symvers
~
make之后和上面的步骤一样,唯一的区别就是在加载驱动模块和移除驱动模块时 insmod 和rmmod不要.ko
感兴趣的读者若果想要知道insmod的工作,它就依赖于定义在kernel/module.c中的系统调用
Makefile
1 CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc //应为要把模块给开发板用所以我们要把交叉编译器作指定我们的编译器
2 KDIR?=/home/guanlei/fl2440/kernel/linux-3.0 //该目录是告诉Makefile 从哪找到我们的内核
3 obj-m:=hello.o
4
5 default:
6 $(MAKE) -C $(KDIR) M=`pwd` modules
7 make clean
8
9 clean:
10 rm -f *.ko.* *.o *mod.c *.order *.symvers
~
make之后和上面的步骤一样,唯一的区别就是在加载驱动模块和移除驱动模块时 insmod 和rmmod不要.ko
感兴趣的读者若果想要知道insmod的工作,它就依赖于定义在kernel/module.c中的系统调用