首页 > 代码库 > Linux设备驱动程序(一)设备驱动程序简介

Linux设备驱动程序(一)设备驱动程序简介

  • 机制or策略:

驱动提供机制(what),而不是提供策略(how);

 

  • 内核功能划分:

根据内核完成任务的不同,可分为如下几个部分:

1. 进程管理

负责进程的的创建和销毁,并处理它们和外部之间的连接(输入输出)。不同进程之间的通信是整个系统的基本功能,因此由内核处理。

除此之外,控制进程如何共享CPU的调度器也是进程管理的一部分。

概括来说,内核进程管理就是在单个或者多个CPU上实现了多个进程的抽象。

 

2. 内存管理

内存是计算机的主要资源之一,用来管理内存的策略是决定系统性能的一个关键因素。

内核在有限的可用资源上为每个进程都创建了一个虚拟地址空间。

内核的不同部分在和内存管理子系统交互时,使用一组函数调用,如malloc/free,以及其他一些复杂的函数。

 

3. 文件系统

unix的每个对象都可以当做文件来看待。

内核在没有结构的硬件上构造了结构化的文件系统。

linux支持多种文件系统类型,实质上是在物理介质上组织数据的不同方式。

 

4. 设备控制

几乎每个系统操作最终都会映射到物理设备上。除了处理器,内存以及其他很有限的几个对象外,所有设备控制操作都由与被控制设备的相关代码来完成,即驱动程序。

内核必须为系统中的每个外设嵌入相应的驱动程序。

 

5. 网络功能

网络功能必须由操作系统管理,因为大部分网络操作与具体进程无关:数据包的传入是异步时间。在某个进程处理这些数据包之前,必须收集,标识,分发这些数据包。系统负责在应用程序和网络接口之间传递数据包,并根据网络活动控制程序的指向。

另外,路由和地址解析也都由内核处理。

 

  • 可装载模块

linux内核提供的特性可在运行时扩展,即在系统启动并且运行时,我们可以向内核添加或从内核移除功能。

可在运行时添加到内核中的代码叫做“模块”。

linux内核支持好几种模块类型,包括但不限于设备驱动程序。

每个模块由没有连接成一个完整可执行程序的目标代码组成。

添加模块--insmod  移除模块--rmmod

 

  • 设备和模块的分类

linux将设备分为三种类型:字符设备,块设备,网络设备。

1. 字符设备:

字符设备是能够像字节流一样被访问的设备,由字符设备驱动程序实现这种特性。

字符设备驱动程序通常至少需要实现open,close,read,write系统调用。

字符设备可以通过/dev目录下的文件系统节点访问。

字符设备与普通文件的唯一差别:普通文件的访问可以前后移动访问的位置,而大多数字符设备是一个只能顺序访问的数据通道。

 

2. 块设备:

块设备和字符设备类似,也是通过/dev目录下的文件系统节点来访问。

块设备上能过容纳文件系统。

linux可以让应用程序像字符设备一样地读写块设备,允许一次传递任意多字节的数据。

块设备和字符设备的区别:仅仅在于内核内部数据的管理方式,也就是内核以及驱动程序之间的软件接口,而这些不同对于用户来说是透明的。内核中,字符驱动和块驱动具有完全不同的接口。

 

3. 网络接口

网络事务都是经过网络接口形成的。

通常,接口是个硬件设备,但也可以是个纯软件设备,比如回环接口。

网络接口由内核中的网络子系统驱动,负责发送和接收数据包,但它不需要了解每项十五如何映射到实际传送的数据包。

由于不是面向流的设备,因此将网络接口映射到文件系统的节点比较困难。unix仍然给它们分配一个唯一的名字(比如eth0),但这个名字在文件系统中不存在对应的节点。

内核和网络设备驱动程序之间的通信,完全不同于内核和字符以及块设备驱动程序之间的通信,内核调用一套和数据包传输相关的函数而不是read,write等。

 

Linux设备驱动程序(一)设备驱动程序简介