【linux设备驱动程序--001】第一篇:设备驱动程序简介

【声明】本文内容为学习《LINUX设备驱动程序》一书的笔记,在书籍内容基础上加入了个人学习的理解与总结,以便后续复习回顾。

 Linux内核代码由大量复杂的代码结构组成,通常Linux设备驱动程序是进入Linux内核世界的大门。设备驱动程序在Linux内核中扮演着特殊的角色,它们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备工作的细节。

Linux系统自开发到现在,已经存在许多良好可用的设备驱动模块,那么是什么原因导致许多人对Linux驱动开发感兴趣呢?其一,新硬件的问世(或过时)的速度就会使驱动编写人员面临很多任务;其二,个人用户可能需要了解一些驱动程序知识才能访问设备;其三,器件厂商通过提供Linux驱动程序能为自己的产品带来许多潜在的用户;其四,Linux系统是开源的,驱动源码可以在用户间迅速流传及使用。

1、设备驱动的作用

区分机制和策略是Unix设计背后隐藏的最好设计思想之一。大多数编程问题可分成两部分:“需要什么功能”(机制)“如何使用这些功能”(策略)。如果这两个问题可以由程序的不同部分实现,或者由不同的程序来处理,则这个软件就更易于根据需要来调整。

驱动程序同样存在机制和策略分离的问题。通常情况下,不同环境使用硬件的方式可能不同,因此我们应当尽可能做到驱动程序中不包含策略。在编写驱动程序时,要注意以下基本概念:

编写访问硬件的驱动代码时不要给用户强加任何特定策略,驱动应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序。实际上驱动也可以看做是应用层和硬件物理层之间的一个软件接口层。

驱动程序设计时主要考虑以下三个方面:1)提供给用户尽量多的选项;2)编写驱动占用的时间;3)尽量保持程序简单。

2、内核功能划分

2.1、进程管理

进程管理主要负责创建和销毁进程,并处理他们和外部世界的连接(输入、输出)。不同进程间的通信(通过信号、管道或进程间通信原语)是整个系统的基本功能,因此也由内核处理。概括来说,内核进程管理活动就是在单个或多个CPU上实现多个进程的抽象。

2.2、内存管理

内存是计算机最主要的资源之一,用来管理内存的策略是决定系统性能的一个关键因素。内核在有限的资源上为每一个进程都创建一个虚拟地址空间。内核的不同部分在和内存管理子系统交互时使用一组函数调用,包括简单的malloc、free以及其他复杂函数。

2.3、文件系统

Unix中的每个对象几乎都可以当做文件来处理。内核在没有结构的硬件上构造结构化的文件系统,而文件抽象整个系统中广泛使用。

2.4、设备控制

除了处理器、内存和其他几个有限制的对象外,所有设备控制操作都由与被控制设备相关的代码来完成,这段代码就叫做设备的驱动程序。内核必须为系统中的每个外设嵌入相应的驱动程序。

2.5、网络功能

网络功能也必须由操作系统来管理,因为大部分网络操作和具体的进程无关:数据包传入是异步事件。另外,所有的路由和地址解析问题也由内核处理。

3、可装载模块

Linux一个比较好的特性:内核提供的特性可在运行时进行扩展。这意味着我们可以在系统启动后再向内核加载或移除某一些功能。可在运行时添加到内核中的代码,我们成为“模块”,每个模块由目标代码组成(没有连接成一个完成的可执行程序),我们可以用内核提供的insmod将模块插入到运行的内核中,也可以使用rmmod将模块从内核中移除。

4、设备和模块的分类

Linux系统将设备分成三种基本类型,每个模块通常实现为其中的一种:字符设备、块设备和网络设备。

【字符设备】

字符(char)设备是个能够像字节流(类似文件)一样被访问的设备。字符设备驱动程序通常至少要实现open、close、read和write系统调用。字符终端(/dev/console)和串口(/dev/ttys0)就是两个字符设备。字符设备可以通过文件系统节点访问,另外大多数字符设备是一个只能顺序访问的数据通道。

【块设备】

块设备也是通过/dev目录下的文件系统节点访问。块设备(例如磁盘)上能够容纳文件系统。Linux可以让应用程序像字符设备一样访问块设备,因而块设备和字符设备的区别仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口不同。

【网络设备】

任何网络事务都经过一个网络接口形成,网络驱动程序不需要知道每一个连接的相关信息,只需要处理数据包的接收和发送。由于不是面向字节流的设备,因此将网络接口映射到文件系统的节点(比如/dev/tty1)比较困难。Unix访问网络接口的方法仍然是给他们分配一个唯一的名字(如eth0),但这个名字在文件系统中不存在对应的节点。内核和网络设备之间的通信是内核调用一套和数据包传输相关的函数实现的,不会调用write/read等系统调用。

【文件系统】

除设备驱动程序外,内核中的其他一些功能也模块化,一个常见例子是文件系统。文件系统并不是设备驱动程序,因为没有任何实际的物理设备与之相对应。相反,文件系统类型是一个软件驱动程序,将底层数据结构映射到高层数据结构,决定文件名可以有多长及目录项中存储文件的哪些信息等。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只特立独行的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值