Linux驱动开发①--Linux基础及hello模块

原创 2017年01月03日 16:55:04

       驱动程序是系统的重要组成部分,Linux中所有对硬件的的操作都是基于驱动程序的。驱动程序可以直接编译进内核也可以使用module的方式手动添加到内核之中,为了学习方便,我将使用模块module的方式将模块加载到内核。

       编写驱动的第一步是搭建环境,我有一台运行Ubuntu16的虚拟机,可以直接在Ubuntu上进行驱动模块的编写工作,因为Ubuntu下已经有完整的Linux源代码和头文件,在目录/lib/modules/和/usr/src/下,具体不知道两个目录的区别,可能是通过连接文件的链接功能使得最终两个目录的文件其实是一样的。源码目录下有多个文件夹,表示多个不同的Linux内核版本,需要选择与机器匹配的内核版本才能保证编译出来的模块可以正确使用,查看本机的Linux内核版本的方法为:uname -r,出现机器内核版本,例如我的机器为“4.4.0-53-generic”,这样选择源码目录的时候就需要指定4.4.0-53-generic版本。假如,虽然我没有遇到过,机器中没有找到源码,可以从Linux官方网站上下载对应内核版本的Linux源码包,这个源码包就可以作为模块编写的环境了。有了源码路径之后基本上就算搭建好了模块设计的开发环境了,因为我不是使用交叉编译,我是在本机上进行模块设计,编写的模块给本机使用,如果是为嵌入式Linux系统编写模块的话需要有嵌入式Linux的源码包和嵌入式Linux的编译器,也就是大名鼎鼎的arm-linux-gcc编译器,关于嵌入式Linux的模块编写以后在说,这里处于学习的目的现在PC电脑上进行实验,需要注意的是树莓派以及类似的运行Debian或者Ubuntu的π都可以直接在本身Linux环境中进行驱动模块的开发,因为它们本身就是一个完整的计算机系统。

       接下来就可以进行驱动模块的编写了,驱动程序的编写和应用程序不同,它没有main函数,只有初始化、释放、操作函数,显得很复杂的样子,但是只要清楚了驱动程序的原理,一切还是很明朗的,至少我是这么想的,虽然我还没很明朗。下面是一个最简单的驱动程序:

#include <linux/init.h>         /* printk() */   
#include <linux/module.h>       /* __init __exit */   
  
static int  __init  hello_init(void)      /*模块加载函数,通过insmod命令加载模块时,被自动执行*/  
{  
  printk(KERN_INFO " Hello World enter\n");  
  return 0;  
}

static void  __exit  hello_exit(void)    /*模块卸载函数,当通过rmmod命令卸载时,会被自动执行*/  
{  
  printk(KERN_INFO " Hello World exit\n ");  
}  
  
module_init(hello_init);  
module_exit(hello_exit);  
  
MODULE_AUTHOR("tangquan");           /*模块作者,可选*/  
MODULE_LICENSE("Dual BSD/GPL");     /*模块许可证明,描述内核模块的许可权限,必须*/  
  
MODULE_DESCRIPTION("A simple Hello World Module");	/*模块说明,可选*/  
MODULE_ALIAS("a simplest module");	/*模块说明,可选*/
       驱动程序源码完成之后就可以进行编译了,这里使用和编译应用程序一样的方法使用Makefile文件自动编译,所以需要先编辑Makefile文件:

obj-m := hello.o
module-objs := hello.o
KDIR :=/lib/modules/4.4.0-51-generic/build/
#KDIR :=/usr/src/linux-headers-4.4.0-53-generic/
PWD := $(shell pwd)
all:      
	$(MAKE)  -C  $(KDIR)  SUBDIRS=$(PWD)  modules  
	@rm -rf *.mod.*  
	@rm -rf .*.cmd  
	@rm -rf *.o  
	@rm -rf Module.*  
clean:  
	rm -rf *.ko
	
obj-m := hello.o表示的是目标文件,这样会生成hello.ko文件。

module-objs := hello.o表示连接的文件。

KDIR表示Linux源码路径。

PWD就是驱动程序的路径。

       运行make就可以进行模块编译了,生成的hello.ko文件就是目标模块,使用insmod安装该模块没有错误表示模块安装成功,使用rmmod可以卸载模块。由于驱动程序中的printk打印的信息不能直接显示在终端上,可以使用 dmesg 查看自开机以来的信息就可以看到printk输出的信息了,使用dmesg | tail可以查看最后的几个消息。

       关于编译模块出错参考上一篇文章:http://blog.csdn.net/tq384998430/article/details/53994637

       Linux驱动编写参考文章:http://www.linuxidc.com/Linux/2011-10/44721.htm

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux设备驱动开发入门——Hello world

      近期做的工作主要有两个,一是将dvsdk_4中的video_copy项目移植到自己的板子上,在参考资料极其匮乏的情况下,本人继续发扬艰苦奋斗的作风和打不死的小强精神,终于将Omap3530...
  • liuqiqi677
  • liuqiqi677
  • 2011年06月20日 15:45
  • 5755

编写一个简单的内核模块程序Hello World!

一、Linux内核模块基本原理Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。...
  • sh21_
  • sh21_
  • 2017年03月09日 16:47
  • 2995

Linux 最简单内核模块 Hello World 示例

注:如果想要按照本篇实践,需要有能运行的arm开发板和对应版本的内核(如果想在Linux主机上编译运行,请参考附1) 1. 在相应版本内核的driver目录下新建如下文件: module fil...
  • chinaeran
  • chinaeran
  • 2015年04月28日 08:38
  • 6097

Linux---我的第一个内核模块之Hello World

1、什么是内核模块? 内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称为模块。Linux内核之所以提供模块机...
  • L_in12
  • L_in12
  • 2015年11月04日 17:24
  • 836

Linux驱动开发(2):Hello world模块

配置好内核树以后开始最简单的模块的构造和运行,我发现所有的编程都是从Hello world开始的,没新意啊。。。 1.写hello.c文件         自己建立一个工程文件夹hello,在he...
  • u013398364
  • u013398364
  • 2014年12月24日 10:57
  • 287

linux 第一个内核模块Hello World

 内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个...
  • blank_bird
  • blank_bird
  • 2011年06月12日 01:03
  • 4055

如何学习linux驱动开发

linux设备驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而且门槛又不是特别高,而内核级开发从业人员要少得多,而且资料又较少。有许多刚刚接触到linux设备驱动开发的同仁会感觉...
  • hwunion
  • hwunion
  • 2014年11月30日 12:23
  • 838

Linux驱动开发经典书籍

Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为《linux_device_driver 3rd Edition》,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本侧重于实战的...
  • xiaocainiaoshangxiao
  • xiaocainiaoshangxiao
  • 2013年12月28日 11:32
  • 2481

Linux内核编程 -- 从HelloWord到基于NetFilter的Linux驱动Demo

基于Linux Ubuntu 1.安装内核头文件1.1查看Linux内核版本usname -r 1.2安装Linux内核头文件sudo apt-get install linux-heade...
  • xushuzhan
  • xushuzhan
  • 2017年12月19日 15:30
  • 81

linux驱动开发总结(一)

基础性总结1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装3, 驱动开发中设计到的硬件: ...
  • viewsky11
  • viewsky11
  • 2016年11月20日 18:19
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动开发①--Linux基础及hello模块
举报原因:
原因补充:

(最多只允许输入30个字)