【转】第一个Linux内核驱动程序

原文网址:http://blog.csdn.net/nexttake/article/details/8181008

刚看 O’REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。

先查看自己OS使用的内核版本
[email protected]:~$ uname -r
2.6.22-14-generic           /*  这是我显示的结果 */
如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)
[email protected]:/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         /*  这是我下的源码 包 */
[email protected]:/usr/src$ 
如果没有源码。(一般ubuntu 都没有吧)
查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)
[email protected]:/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
[email protected]:/usr/src$ 
我选择了   linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches   这个~
然后 install 之
[email protected]:/usr/src$sudo  apt-get install linux-source-2.6.22 (相当于下载这个版本的内核源码)
下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

可以使用apt-get purgelinux-source-2.6.22 卸载。
注意 已经切换到超级用户模式
[email protected]:/usr/src#sudo tar jxvf linux-source-2.6.20.tar.bz2
解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。
---------------------------------------------------------------------------------------------------------------------------------------------------

进入该目录
开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)
[email protected]:/usr/src/linux-source-2.6.22# make oldconfig或者 make defconfig
当然你也可以使用 自己喜欢的配置方式 如  menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。
完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。
[email protected]:/usr/src/linux-source-2.6.22$ make
[email protected]:/usr/src/linux-source-2.6.22$  make bzImage
当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。
然后 :
[email protected]:/usr/src/linux-source-2.6.22#make modules                /*   编译 模块 */
[email protected]:/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  文件

[html] view plaincopy

  1. obj-m := hello.o
  2. KERNELDIR := /lib/modules/2.6.38-8-generic/build/
  3. PWD := $(shell pwd)
  4. modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  5. modules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

其实如果使用这个命令编译,Makefile一行即可

[html] view plaincopy

  1. obj-m := hello.o

[email protected]:~/linux_驱动开发$make -C /lib/modules/2.6.38-8-generic/build/  M=/home/yzy/mydriver  
[email protected]:~/linux_驱动开发$ ls -l
总用量 124
-rw-r--r-- 1 shana shana   303 2008-03-16 10:43 hello.c
-rw-r--r-- 1 shana shana 4Array03Array 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 0Array:17 linux_qudong_qu.txt
-rw-r--r-- 1 shana shana   266 2008-03-16 12:0Array Makefile
-rw-r--r-- 1 shana shana     0 2008-03-16 12:11 Module.symvers
[email protected]:~/linux_驱动开发$ 
然后加载模块 (超级用户)
[email protected]:/home/shana/linux_驱动开发# insmod ./hello.ko 
按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)
[email protected]:/home/shana/linux_驱动开发# insmod ./hello.ko   或者sudo -s先切换到root用户
[email protected]:/home/shana/linux_驱动开发# 
查看加载模块
[email protected]:/home/shana/linux_驱动开发# lsmod
Module                  Size  Used by
hello                   2560  0 
已经加载上咯~~
删除模块
[email protected]:/home/shana/linux_驱动开发# rmmod hello
[email protected]:/home/shana/linux_驱动开发#

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中
[email protected]:~/linux_驱动开发$  dmesg
[ 2266.586863] Hello, world\n
[ 2389.281426] Goodbye, cruel world\n
 
至此 全部工作都完成了。

时间: 2024-11-05 18:48:15

【转】第一个Linux内核驱动程序的相关文章

在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)

在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序一文中举例子说明 了如何在Linux内核编写驱动程序.在这一篇文章中,我们将继续介绍Android系统硬件驱动程序的另一方面实现,即如何在硬件抽象层中增加硬件模块来和内核驱动程序交互.在这篇文章中,我们还将学习到如何在

在Ubuntu上为Android系统编写Linux内核驱动程序

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6568411 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份

在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Android系统逐步扩大市场占有率,终端设备的多样性亟需更多的移动开发人员的参与.据业内统计,Android研发人才缺口至少30万.目前,

在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6571210 在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello.proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/v

Linux内核驱动程序Hello

1.printk打印输出的优先级 #define  KERN_EMERG     "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/#define  KERN_ALERT      "<1>"/*报告消息,表示必须立即采取措施*/#define  KERN_CRIT        "<2>"/*临界条件,通常涉及严重的硬件或软件操作失败*/#define  KERN_ERR         &qu

一个Linux内核的自旋锁设计-接力嵌套堆栈式自旋锁

锁的开销 锁的开销是巨大的,特别是对于多核多处理来讲.       引入多处理,本身就是为了将并行化处理以提高性能,然而由于存在共享临界区,而这个临界区同时只能有一个线程访问(特别是对于写操作),那么本来并行的执行流在这里被串行化了,形象地看,这里好像是宽阔马路上的一个瓶颈,由于串行化是本质上存在的,因此该瓶颈就是不可消除的.问题是线程执行流如何度过这个瓶颈,很显然,它们谁都绕不开,现在问题是是它们到达这个瓶颈时该怎么办.       很显然,斗殴抢先是一种不合理但实用的简单方案,朴素的自旋锁就

基于Windows8与Visual Studio11开发第一个USB内核驱动程序

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net USB ,是英文Universal Serial BUS(通用串行总线)的缩写,而其中文简称为“通串线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯.是应用在PC领域的接口技术.USB接口支持设备的即插即用和热插拔功能.USB是在1994年底由英特尔.康柏.IBM.Microsoft等多家公司联合提出的. 从1994年11

linux设备驱动程序_hello word 模块编译各种问题集锦

在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块.原以为很简单,真正弄起来,发现问题不少啊.前两天编过一次,由于没有记录,今天看的时候又忘了,所以不管多晚,都得记录一下. 1.首先说明一下我的系统环境:ubuntu 14.04,内核是3.13.0-29-generic 2.在我电脑里装了git版本控制器,我clone了一个linux内核库在我的电脑上,所以我就可以随意的切换到任意的分支上去.最初是用的2.6.3,后来编译的时候遇到各种问题.googl

Linux高危漏洞曝光:Linux 内核 ipv4/udp.c 远程恣意代码执行

漏洞描述 Linux kernel是美国Linux基金会发布的操作体系Linux所使用的内核.Linux kernel 4.5之前的版别中的udp.c文件存在安全缝隙,Linux内核中的udp.c答应长途攻击者经过UDP流量履行恣意代码,这些流量会在履行具有MSG_PEEK象征的recv体系调用时触发不安全的第2次校验和核算,长途攻击者可精心构造数据履行恣意代码,进一步致使本地提权,归于高危缝隙.但由于现实状况中,根据UDP协议的效劳时MSG_PEEK象征在实际使用的状况较少,受该长途指令履行缝