转自:http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html

本文是参考了网上多篇帖子而写的算不上什么原创。唯一值得欣慰的只不过在本机上实现罢了。因为毕竟失败了几次。也因为本人是初学驱动编程 很多简单的问题在我来说是相当的困难的。望有识之士不要笑话。最后,希望本文能给刚学驱动而还没开头的人提供一些帮助。

刚看 O'REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。那怎么建立呢?为此上网“翻云覆雨”起来而结果却是“惨败而归“。 
为 此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的 hello wrold 都没实现。(书中p22页最简单也最没用的驱动事列) 
不 过功夫不负有心人。在今天终于弄明白了怎么回事。下面就请让我慢慢道来吧。

先查看自己OS使用的内核版本

shana@shana:~$ uname -r 
2.6.22-14-generic /* 这是我显示的结果 */

如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)

shana@shana:/usr/src$ ls 
linux-headers-2.6.22-14 
linux-headers-2.6.22-14-generic 
linux-source-2.6.22 /*这个就是解压后的源码目录 */ 
linux-source-2.6.22.tar.bz2 /* 这是我下的源码 包 */ 
shana@shana:/usr/src$

如果没有源码。(一般ubuntu 都没有吧) 
查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没 有此命令)

shana@shana:/usr/src$ apt-cache search linux-source 
linux-source - Linux kernel source with Ubuntu patches 
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches 
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 
shana@shana:/usr/src$

我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~ 
然后 install 之

shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22

下载完成后,在/usr/src下,文件名 为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

注意 已经切换到超级用户模式

root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2

解压后生成一个新的目录/usr/src/linux-source- 2.6.22,所有的源代码都在该目录下。

进入该目录

开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)

root@shana:/usr/src/linux-source-2.6.22# make oldconfig

当 然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。

完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。

shana@shana:/usr/src/linux-source-2.6.22$ make

shana@shana:/usr/src/linux-source-2.6.22$ make bzImage

当 然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。

然后 :

root@shana:/usr/src/linux-source-2.6.22#make modules /* 编译 模块 */

root@shana:/usr/src/linux-source-2.6.22#make modules_install /* 安装 模块 */

执行结束之后,会在/lib/modules下生成新的目录/lib /modules/2.6.22-14-generic/ 
。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。

至此 内核树就建立啦 原来不是很难.....

写一个 最简单 最没用的驱动吧 
我在 /home/shana/linux_q/ 目录下创建2个文本文件 hello.c Makefile

//hello.c 
#include <linux/init.h> 
#include <linux/module.h> 
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void) 

printk(KERN_ALERT "Hello, world\n"); 
return 0; 
}

static void hello_exit(void) 

printk(KERN_ALERT"Goodbye, cruel world\n"); 
}

module_init(hello_init); 
module_exit(hello_exit);

程 序我就不解释了……

Makefile 文件

obj-m := hello.o 
KERNELDIR := /lib/modules/2.6.20/build 
PWD := $(shell pwd)

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

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

如果以上你都完成了在 make 时出现这样的错误

shana@shana:~/linux_驱动开发$ make 
make: 没有什么可以做的为 `modules'。

原因很简单 你肯定是从我这直接复制的吧~~~呵呵,Makefile格式错误啦~ 
解决办法就是 你把如 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 移动到行首 然后按Tab 键自动对齐 
这 时里边的变量都变成绿色了~然后在 make 吧

shana@shana:~/linux_驱动开发$ make 
make -C /lib/modules/2.6.22-14-generic/build M=/home/shana/linux_驱动开发 modules 
make[1]: Entering directory `/usr/src/linux-headers-2.6.22-14-generic' 
CC [M] /home/shana/linux_驱动开发/hello.o 
Building modules, stage 2. 
MODPOST 1 modules 
CC /home/shana/linux_驱动开发/hello.mod.o 
LD [M] /home/shana/linux_驱动开发/hello.ko 
make[1]: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic' 
shana@shana:~/linux_驱动开发$

shana@shana:~/linux_驱动开发$ ls -l 
总用量 124 
-rw-r--r-- 1 shana shana 303 2008-03-16 10:43 hello.c 
-rw-r--r-- 1 shana shana 49039 2008-03-16 12:11 hello.ko 
-rw-r--r-- 1 shana shana 687 2008-03-16 12:11 hello.mod.c 
-rw-r--r-- 1 shana shana 25840 2008-03-16 12:11 hello.mod.o 
-rw-r--r-- 1 shana shana 24360 2008-03-16 12:11 hello.o 
-rw-r--r-- 1 shana shana 8344 2008-03-16 09:17 linux_qudong_qu.txt 
-rw-r--r-- 1 shana shana 266 2008-03-16 12:09 Makefile 
-rw-r--r-- 1 shana shana 0 2008-03-16 12:11 Module.symvers 
shana@shana:~/linux_驱动开发$

然后加载模块 (超级用户)

root@shana:/home /shana/linux_驱动开发# insmod ./hello.ko

按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)

root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko 
root@shana:/home/shana/linux_驱动开发#

查看加载模块

root@shana:/home /shana/linux_驱动开发# lsmod 
Module Size Used by 
hello 2560 0

已 经加载上咯~~

删除模块

root@shana:/home/shana/linux_驱动开发# rmmod hello 
root@shana:/home/shana/linux_驱动开发#

那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中

shana@shana:~/linux_驱动开发$ cat /var/log/syslog |grep world 
Mar 16 12:14:53 shana kernel: [ 5937.529297] Hello, world 
Mar 16 12:16:05 shana kernel: [ 6009.439036] Goodbye, cruel world 
shana@shana:~/linux_驱动开发$

至 此 全部工作都完成了。是否对你有用呢?

*mknod命令创建节点

ubuntu下简单的驱动编译的更多相关文章

  1. ubuntu下升级网卡驱动

    ubuntu下升级网卡驱动 无线局域网环境下,有个笔记本儿的无线经常断,而其它的终端都好好的,唯独它不行.所以想到检查和更新下无线网卡的驱动看看.以下是操作流程,记录一下. 阅读说明:##为标签, / ...

  2. ubuntu下使用code::blocks编译运行一个简单的gtk+2.0项目

    在具体的操作之前,首先需要安装一些必要的软件.ubuntu下默认安装了gcc,不过缺少必要的Header file,可以在命令行中输入下面的指令安装build-essential套件:sudo apt ...

  3. Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法

    Linux下Code::Blocks无法编译运行提示 /bin/sh: 1: g++ not found 的解决办法 今天在Ubuntu 12.04 软件中心中选装了Code::Blocks,安装完成 ...

  4. ubuntu下C编程,编译基础( 转)

    buntu下C编程,编译基础     C 编程中相关文件后缀 .a 静态库 (archive) .c C源代码(需要编译预处理) .h C源代码头文件 .i C源代码(不需编译预处理) .o 对象文件 ...

  5. ACE在Ubuntu下的安装和编译

    之前写了很多linux下的底层网络API的demo,这些demo可用于了解底层的网络通信过程,但是想做出好的服务器用于实际业务还是非常困难的,需要大量的代码实现,移植性也非常差,想要写出高性能架构的服 ...

  6. Ubuntu下Eclipse安装与编译ns-3遇见的各种问题

    感觉Eclipse比其它东西装起来麻烦多了. 问题拾遗 (1)安装 这一块倒是没有什么大的问题,Linux操作系统也不需要像在Windows操作系统下下一些必须的东西(比如CDT等等).安装好了JDK ...

  7. Ubuntu下Android apk反编译

    需要用到的工具 1.apktool_2.0.3.jar https://bbuseruploads.s3.amazonaws.com/0becf6a1-1706-4f2e-9ae6-891e00a8d ...

  8. ubuntu下apk的反编译

    今天调试一个程序的时候,因为需要上传数据到服务器,但是程序太过久远了,服务器上传的地址就忘记了,但是源码又不在我这里,因为要的急所以就被逼无奈的情况下想到了反编译,我用的是Linux Mint 14. ...

  9. dnw for linux: Ubuntu下可用,无需编译驱动,mini2440可用

    1.安装所需库文件 sudo apt-get install libusb-dev 2.源代码如下 /* dnw2 linux main file. This depends on libusb. * ...

随机推荐

  1. 浅谈IOC--说清楚IOC是什么

    http://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1.IOC的理论背景 2.什么是IOC 3.IOC也叫依赖注入 ...

  2. linux 搭建SVN服务器,为多个项目分别建立版本库并单独配置权限

    1.安装svn服务    # yum install subversion   2.新建一个目录用于存储SVN所有文件    # mkdir /home/svn   3.在上面创建的文件夹中为项目 p ...

  3. hdu 1257 最少拦截系统(贪心)

    解题思路:[要充分理解题意,不可断章取义] 贪心:每个防御系统要发挥其最大性能, 举例: Input : 9 389 207 155 300 299 170 155 158 65 Output: 2 ...

  4. [LeetCode] Copy List with Random Pointe

    题目的关键是要让新链表和原有链表发送关联,可以通过这种关联来设置新链表的random pointer 思路:将新链表的元素插入到原有链表元素的后面,如下图所示,就可以根据原有链表的radom-> ...

  5. 关于vue.js 组件的调用

    包子初学vue.js,有很多不明白的地方还请大家多多指教,在组件的调用的时候,包子有点懵,因为感觉调用组件的方式非常的麻烦,每一个都要实例化,不过,通过不断询问大牛们,我找到了,动态加载组件的方法~~ ...

  6. TaskTracker任务初始化及启动task源码级分析

    在监听器初始化Job.JobTracker相应TaskTracker心跳.调度器分配task源码级分析中我们分析的Tasktracker发送心跳的机制,这一节我们分析TaskTracker接受JobT ...

  7. mySQL笔记2

    php主要实现B/S .net IIS java TomCat LAMP: Linux 系统 A阿帕奇服务器 Mysql数据库 Php语言(KE) mysql:c常用代码 create table c ...

  8. App架构设计经验谈:服务端接口的设计

    App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的 ...

  9. 第16章 使用Squid部署代理缓存服务

    章节概述: 本章节从代理缓存服务的工作原理开始讲起,让读者能够清晰理解正向代理(普通模式.透明模式)与反向代理的作用. 正确的使用Squid服务程序部署代理缓存服务可以有效提升访问静态资源的效率,降低 ...

  10. 又是一个二模02,不过day2

    话说比较简单.除了第三题不会写平衡树啊你妹!!边做边写吧. 机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链接~机智的链 ...