码迷,mamicode.com
首页 > 系统相关 > 详细

Linux设备驱动程序学习随笔1--从头文件 linux/moudle.h开始

时间:2016-07-09 16:22:41      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

所有的程序员入门的第一个程序都是从 Holle World 开始,linux嵌入式驱动开发也不例外,《Linux设备驱动程序》这本书的第一个程序就是hello world。然而,人生写驱动程序的第一次编译就异常的艰难。

以下是hello world 的程序,很简单,基本上学过C就能看懂,该程序包括两个头文件,引用了4个外部函数,内建2个函数。

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 
 4 MODULE_LICENSE("Dual BSD/GPL");
 5 
 6 static int hello_init(void)
 7 {
 8         printk(KERN_ALERT "Hello world\n");
 9         return 0;
10 }
11 
12 static void hello_exit(void)
13 {
14         printk(KERN_ALERT "goodbye,cruel world\n");
15 }
16 
17 module_init(hello_init);
18 module_exit(hello_exit);

这个程序相当的清晰的指出了,驱动程序的程序结构,整个驱动程序由init函数引导加载,exit函数引导卸载。值得注意的是,驱动程序不需要main函数,这是驱动程序和普通程序一个比较明显的区别。

注:如果你使用的是老版本的书或者PDF,hello world的代码会和上述代码有所区别,建议使用上述代码,比较老版本是2.0时代的代码了(第一版是2000年左右出版的),不过书的内容并没有变化太大。

 


下面我们进入今天的正题。

 

写完这个简单的函数就可以进行编译了,然而这个时候如果你直接使用GCC编译的话你就会得到如下结果。

技术分享

这里mo.c就是我的源程序文件。

可以看到这个时候编译器报错,No such file or directory,书上并没有到如何解决,只能求助于万能的度娘了。百度一圈之后,我发现,原来默认编译器就没引用这个头文件,头文件的地址就在/usr/src/linux-headers-3.16.0-30下面,于是我用-I来引用头文件,然而并不能通过。

经过一番研究我发现,网上各路大神都是使用makefile进行编译

 1 obj-m := mo.o
 2 
 3  CURRENT_DIR :=$(shell pwd)
 4 
 5  KERNEL_DIR := /usr/src/linux-headers-$(shell uname -r)
 6 all:
 7     $(MAKE) -C $(KERNEL_DIR) M=$(CURRENT_DIR) modules
 8 
 9 clean:
10     rm -rf %.o

这些总可以开开心心编译了吧,呵呵,make之后

技术分享

这错误信息到底是啥意思?常识了10个小时,我终于发现

技术分享

 

 技术分享mdzz

 


 

总之makefile报错记得用权限跑一下 。。。。

Linux设备驱动程序学习随笔1--从头文件 linux/moudle.h开始

标签:

原文地址:http://www.cnblogs.com/luyufan498/p/5656026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!