Linux设备驱动程序系列(一)——开篇

2011-03-24


 

最近一段时间捣鼓了一顿Linux,结果呢,其实还是刚刚起步,勉强算是个开始。不过挺高兴的总算是开始了,万事开头难,尤其“Linux设备驱动程序”的学习。也怪我最近各种活动多,组织“CS火拼”、还买了单车,经常和同学出去骑车,简单总结就是,一个星期在教研室,能有个一两天在状态我就很高兴了,嗬嗬——不罗嗦了,下面开始记录“Linux设备驱动”学习的笔记,算是我自己的一个整理,做个备份,以后忘了,就回来找找。


 

一、准备工作

        要写“Linux设备驱动”首先得有合适的环境以及大量的参考资料。

至于环境,我使用的是Ubuntu 11.04(一般自带GCC等编译工具,如果没有,自己发挥一下)

至于参考资料,我列举一下:

1、内核源码(Linux 2.6.30)

 

      内核源码包的下载地址http://www.kernel.org/pub/linux/kernel/  绝对可以找到你想要的版本,我使用Linux 2.6.30。

      为了方便阅读,我提供一个网站,十分给力,大家千万要试一下,为阅读内核源码提供很很大的方便,地址为http://lxr.linux.no/linux+v2.6.30/

2、参考书籍

      书别整太多,看不过来,我的第一本书《Linux设备驱动程序(第三版)》魏永明翻译那本,号称Linux驱动界的圣经,咱得有吧,这本书去是不错,刚开始看可能有困难,慢慢就好了。这本书也可以在线看,网址为http://oss.org.cn/kernel-book/ldd3/index.html同样很给力。

      第二本书《嵌入式Linux驱动程序设计从入门到精通》冯国进编著。中国人特色的书,你们懂得。


二、知识准备

      学习“Linux设备驱动”需要的知识准备有点忒多了,我合计着能看这篇文章的,基础知识应该差不了,就不多说,说下关于“驱动、内核”的基本概念:

设备驱动程序:驱动程序在 Linux 内核里扮演着特殊的角色. 它们是截然不同的"黑盒子", 使硬件的特殊的一部分响应定义好的内部编程接口. 它们完全隐藏了设备工作的细节. 用户的活动通过一套标准化的调用来进行, 这些调用与特别的驱动是独立的; 设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上. 这个编程接口是这样, 驱动可以与内核的其他部分分开建立, 并在需要的时候在运行时"插入".——《Linux设备程序

    其实设备驱动程序实际上就是硬件设备与应用程序之间的一个中间层。驱动程序工作在内核空间,而应用程序一般工作在用户空间。设备驱动程序是操作系统内核和硬件设备之间的接口。

    设备驱动程序的本质是实现逻辑设备物理设备的转换,启动相应的I/O设备,发出I/O命令,完成相应的I/O操作,它是内核与外围设备数据交流的核心代码。设备驱动程序为应用程序屏蔽了硬件设备的具体细节。在用户空间的应用程序看来,硬件设备只是一个文件,应用程序刻意像操作普通的文件一样借助于驱动程序对硬件设备进行操作。

学过“操作系统”的同志们应该知道内核功能的划分进程管理内存管理文件系统设备控制以及网络功能等。

来张图:

     至此,内核和驱动之间的关系应该解释得很清楚了——至于更深刻的理解,大家看一下我推荐的书吧。


 

      Linux 的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力. 这意味着你可以在系统正在运行着的时候增加内核的功能( 也可以去除 ).

     以 Linux 的方式看待设备可区分为 3 种基本设备类型. 每个模块常常实现 3 种类型中的 1 种, 因此可分类成字符模块, 块模块, 或者一个网络模块。             

 

字符设备

一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 ); 一个字符驱动负责实现这种行为. 这样的驱动常常至少实现 open, close, read, 和 write 系统调用. 文本控制台( /dev/console )和串口( /dev/ttyS0 及其友 )是字符设备的例子, 因为它们很好地展现了流的抽象. 字符设备通过文件系统结点来存取, 例如 /dev/tty1 和 /dev/lp0. 在一个字符设备和一个普通文件之间唯一有关的不同就是, 你经常可以在普通文件中移来移去, 但是大部分字符设备仅仅是数据通道, 你只能顺序存取.然而, 存在看起来象数据区的字符设备, 你可以在里面移来移去. 例如, frame grabber 经常这样, 应用程序可以使用 mmap 或者 lseek 存取整个要求的图像.

块设备

如同字符设备, 块设备通过位于 /dev 目录的文件系统结点来存取. 一个块设备(例如一个磁盘)应该是可以驻有一个文件系统的. 在大部分的 Unix 系统, 一个块设备只能处理这样的 I/O 操作, 传送一个或多个长度经常是 512 字节( 或一个更大的 2 的幂的数 )的整块. Linux, 相反, 允许应用程序读写一个块设备象一个字符设备一样 -- 它允许一次传送任意数目的字节. 结果就是, 块和字符设备的区别仅仅在内核在内部管理数据的方式上, 并且因此在内核/驱动的软件接口上不同. 如同一个字符设备, 每个块设备都通过一个文件系统结点被存取的, 它们之间的区别对用户是透明的. 块驱动和字符驱动相比, 与内核的接口完全不同.

网络接口

 

任何网络事务都通过一个接口来进行, 就是说, 一个能够与其他主机交换数据的设备. 通常, 一个接口是一个硬件设备, 但是它也可能是一个纯粹的软件设备, 比如环回接口. 一个网络接口负责发送和接收数据报文, 在内核网络子系统的驱动下, 不必知道单个事务是如何映射到实际的被发送的报文上的. 很多网络连接( 特别那些使用 TCP 的)是面向流的, 但是网络设备却常常设计成处理报文的发送和接收. 一个网络驱动对单个连接一无所知; 它只处理报文.

   

每块可以在运行时添加到内核的代码, 被称为一个模块. Linux 内核提供了对许多模块类型的支持, 包括但不限于, 设备驱动. 每个模块由目标代码组成( 没有连接成一个完整可执行文件 ), 可以动态连接到运行中的内核中, 通过 insmod 程序, 以及通过 rmmod 程序去连接。

接下来,咱们就开始第一个Linux设备驱动程序——字符设备的驱动程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值