Linux设备驱动开发入门
怎样培养孩子本文以快捷而简单的方式讲解如何像一个内核开发者那样开发linux设备驱动
源作者: Xavier Calbet
版权:GNU Free Documentation License 翻译: 顾宏军(www.ossp)中文版权:创作共用.署名-非商业用途-保持一致
知识准备
要开发Linux 设备驱动,需要掌握以下知识:
•C 编程 需要掌握深入一些的C 语言知识,比如,指针的使用,位处理函数,等。
•微处理器编程 需要理解微机的内部工作原理:存贮器地
址,中断,等。这些内容对一个汇编程序员应该比较熟
悉。
Linux 下有好几种不同的设备。为简单起见,本文只涉及以模块形式加载的字符设备。使用2.6.x 的内核。(特别是Debian Sarge 使用的2.6.8内核。)用户空间和内核空间当你开发设备驱动时,需要理解“用户空间”和内核空间之间的区别。
1:2:3:4:5:6:
7:
8:
9:
10:11:
12:13:14:15:16:17:18:19:20:
21:
22:
23:
鼠年拜年祝福语
24:
25:
世界网友悼念袁隆平•内核空间 :Linux 操作系统,特别是它的内核,用一种简单而有效的方法管理机器的硬件,给用户提供一个简捷而统一的编程接口。同样的,内核,特别是它的设备驱动程序,是连接最终用户/程序员和硬件的一坐桥或者说是接口。任何子程序或者函数只要是内核的一部分(例如:模块,和设备驱动),那它也就是内核空间的一部分。•
用户空间. 最终用户的应用程序,像UNIX 的shell 或者其它的GUI 的程序(例如,gedit),都是用户空间的一部分。很显然,这些应用程序需要和系统的硬件进行交互。但是,他们不是直接进行,而是通过内核支持的函数进行。
它们的关系可以通过下图表示:图1: 应用程序驻留在用户空间, 模块和设备驱动驻留在内核空间
26:
房产过户费
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:38:
39:
40:
用户空间和内核空间之间的接口函数内核在用户空间提供了很多子程序或者函数,它们允许用户应用程序员和硬件进行交互。通常,在UNIX或者Linux系统中,这种交互是通过函数或者子程序进行的以便文件的读和写操作。这是因为从用户的视角看,UNIX的设备就是一个个文件。从另一方面看,在Linux内核空间同样提供了很多函数或者子程序以在底层直接地对硬件进行操作,并且允许从内核向用户空间传递信息。通常,用户空间的每个函数(用于使用设备或者文件的),在内核空间中都有一个对应的功能相似并且可将内核的信息向用户传递的函数。这种关系可从下表看出来。目前这个表是空的,在我们后面每个表项都会填入对应的函数。表 1. 设备驱动事件和它们在内核和用户空间的对应的接口函数事件用户函数内核函数加载模块打开设备读设备写设备关闭设备卸载模块内核空间和硬件设备之间的接口函数在内核空间同样有可以控制设备或者在内核和硬件之间交换信息的函数。表2解释了这些概念。同样的,这个表将在介绍到相应内容时填写上。
表 2. 设备驱动事件和它们在内核空间与硬件设备之间对应的接口函数事件内核函数
41:
42:
43:
凤凰花开的路口歌词44:
45:
46:
47:
48:
49:
50:
51:
2021年属兔人的全年运势52:
53:
54:
55:
56:57:58:
59:60:61:
62:63:64:
65:66:67:
68:69:70:
71:72:73:
74:75:76:
77:
78:
79:
80:
81:82:
83:
84:
读数据写数据第一个驱动:在用户空间加载和卸载驱动这一节将向你展示如何开发你的第一个Linux 设备驱动,该驱动作为一个内核模块存在。首先,写一个文件名为nothing.c 的文件,代码如下:<nothing.c> =#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");内核从2.6.x开始,编译模块变得稍微复杂些。首先,你需要有一份完整的,编译了的内核源代码树。如果你使用的是Debian Sarge系统,你可以按照附录B(在本文末尾)的步骤进行操作。在以下的内容里,假设你使用的是2.6.8内核。接下来,你需要撰写一个make file。本例子所用的make file文件名称为Make file,内容如下:<Makefile1> =obj-m := nothing.o 和之前版本的内核不同,你需要使用和你当前系统所用内核版本相同的代码来编译将要加载和使用的模块。编译该模块,可以使用以下命令:$ make -C /usr/src/kernel-source-2.6.8 M=`pwd` modules 这个非常简单的模块在加载之后,将属于内核空间,是内核空间
86:87:88:89:90:91:92:93:94:95:96:97:98:99:100:101:102:103:104:105:106:107:108:109:110:111:112:113:114:115:
的一部分。在用户空间,你可以以root账号加载该模块,命令如下:# insmod nothing.ko insmod命令用于将模块安装到内核里。但是这个特殊的模块不常用。要查看模块是否已经安装完成,可以通过查看所有已安装模块来进行:# lsmod 最后,模块可以通过以下命令从内核中移除:# rmmod nothing 同样的,使用lsmod命令,可以用于验证该模块已不在内核中。主要内容整理在如下表格里。表3. 设备驱动事件和它们在用户空间,内核空间对应的接口函数。Events User functions Kernel functions Load module insmod Open device Read device Write device Close device Remove module rmmod “hello world”驱动:在内核空间加载和移除驱动当一个模块设备驱动被加载到内核时,一些通常要做的事情包括:设备复位,初始化RAM,初始化中断,初始化输入/输出端
116:117:118:119:120:121:122:123:124:125:126:127:128:129:130:131:132:133:134:135:136:137:138:139:140:141:142:143:144:145:146:147:148:149:150:151:152:153:154:155:156:157:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论