首页 > 学院 > 开发设计 > 正文

驱动篇-认识hello word 的内核文件创建过程(一)

2019-11-06 08:29:02
字体:
来源:转载
供稿:网友

        今天闲着没事整理一下内核.ko文件的创建过程,算是一个入门级教程吧。环境:Ubuntu。编译工具gcc

         1.首先创建一个hello.c的文件,内容如下:

#include <linux/init.h>#include <linux/module.h> static int hello_init(void){    PRintk("Hello World!/n");    printk("I will win the World!/n");return 0;}static void hello_exit(void){    printk("Good Bye!/n");} module_init(hello_init);module_exit(hello_exit);          

         2.创建Makefile文件,内容如下:

obj-m:=hello.otestmodule-objs:=moduleKDIR:=/lib/modules/3.11.0-15-generic/build    MAKE:=makedefault:	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modulesclean:	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean上面的KDIR的路径可以通过 uname -a 看出你使用的是哪个版本的内核,然后在lib/modules里面找到对应的目录。

注解:首先看第一行 其中的obj-m指的是编译的目标是编译为模块,如果编译的源文件为hello.c 只需写为obj-m:=hello.o即可

default下面的 make -C是切换到指定目录进行编译 如果是编译当前系统的内核模块即为上述目录,如果是进行交叉编译,之需要将目录修改为对应的内核源代码目录即可

下面附一个比较简单的Makefile模板,更具体的内容大家网上找。

#简单实用的Makefile模板:objs := a.o b.otest:$(objs)  gcc -o test $^# .a.o.d .b.o.ddep_files := $(foreach f,$(objs),.$(f).d)dep_files := $(wildcard $(dep_files))ifneq ($(dep_files),)  include $(dep_files)endif%.o : %.c   gcc -Wp,-MD,.$@.d -c -o $@ $<clean:  rm *.o test

#/*关键解释*/	这里面用到了一些Makefile函数,首先我们来说一下Makefile函数的格式:$(函数名 参数,参数,......)这里用到了两个函数,我们分别来说一下:1、dep_files := $(foreach f,$(objs),.$(f).d)依次取出objs中的成员,放在f中,然后加上.d后缀,组成一个字符串(各个成员以空格分开),返回给dep_files !2、dep_files := $(wildcard $(dep_files))展开当前目录下名字为符合dep_files的文件名,并组成字符串返回给dep_files此外还有一点要说的是:gcc -Wp,-MD,.$@.d -c -o $@ $<1、-Wp,-MD:表示生成依赖文件,后跟依赖文件的名字2、$@:表示规则的目标      $^:所有的依赖      $<:第一个依赖      $?:代表依赖文件列表中被改变过的所有文件
# 第一次执行,没有依赖文件,这个ifneq不执行,# 当修改.h文件之后,判断执行这个include $(dep_files)ifneq ($(dep_files),)  include $(dep_files)endif-----------------------

3.  执行make Makefile,会生成hello.ko文件

4.  insmod hello.ko  加载内核 

可以通过dmesg看到打印出来的log

[ 2472.307050] Hello World![ 2472.307055] I will win the World!

当然也可以用lsmod|grep hello

root@lll-virtual-machine:/home/lll/share/linuxdev#   lsmod|grep hellohello                  12496  0

5.  rmmod hello

查看是否成功跟上面一样!

整个流程就是这样了!相当简单。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表