linux 驱动程序 HelloWorld

Posted mingzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 驱动程序 HelloWorld相关的知识,希望对你有一定的参考价值。

 

Linux驱动可以直接编译进内核,也可以以模块的形式进行加载,前者比较复杂,本文就以模块的形式加载!

vi helloi_driver.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>


static int __init hello_init(void)
{
printk(KERN_ALERT "hello driver init!\n");
return 0;
}

static void __exit hello_exit(void)
{
printk(KERN_ALERT "hello driver exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

程序很简单,没有什么说的。关键时驱动的Makefile文件。

ifneq ($(KERNELRELEASE),)

obj-m :=hello_driver.o

 

else

KERNELDIR ?=/lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

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

endif

clean:
rm -rf *.o *~ .depend .* .

分析上述Makefile文件,KERNELRELEASE时内核源代码顶层所定义的一个变量,当Makefile第一次执行时,这个变量并没有定义,因此直接执行else中的内容,uname -r命令输出当前系统所使用的版本号,/lib/modules/$(shell uname -r)/build这个就是Linux源码所在的目录,当执行到modules时,-C $(KERNELDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。

当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。

obj-m后面跟的就是最终的模块名,hello_driver.o,make 会在该目录下自动找到hello_driver.c文件进行编译

hello_driver.o可能依赖多个文件或者模块,那么在obj-m后面就可以添加下面语句hello _driver-objs:=file.o file1.o

modules目标指向obj-m变量中设定的模块。

最后通过insmod加载驱动模块,用rmmod卸载模块,此外还有两个关于模块的命令:lsmod modprob modinfo,lsmod用来列出所有的模块,modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。

上面加载模块的例子在加载和卸载的过程中,就会有信息输出,通过dmesg打印输出。














以上是关于linux 驱动程序 HelloWorld的主要内容,如果未能解决你的问题,请参考以下文章

Linux驱动开发笔记:helloworld驱动源码编写makefile编写以及驱动编译基本流程

在linux下helloworld的C程序

Linux安装jdk,编写helloworld程序

在Linux最小系统上编译运行第一个helloworld程序

Linux设备驱动Hello World程序介绍

Linux初识----历史安装及第一个"helloworld"程序运行