再上一篇:6.5.4 嵌入式 Linux 的发展方向
上一篇:6.5.5 基于 Intel XScale 处理器的开发环境
主页
下一篇:6.6.1 Windows CE 简介
再下一篇:6.6.2 基于 Intel Xscale 处理器的 Windows CE 开发环境定制 Windows CE
文章列表

6.5.6 嵌入式 Linux 驱动程序开发

嵌入式系统(修订本)——Intel XScale 结构与开发 陈章龙 著

一、Linux 系统驱动程序开发简介
进行嵌入式系统的开发,很大的工作量是为各种设备编写驱动程序,除非你的系统不使 用操作系统,程序直接操纵硬件。Linux系统中,内核提供保护机制,用户空间的进程一般
是不能直接访问硬件的。 和其他Unix系统一样,Linux中设备被抽象出来,所有设备都看成文件。设备的读写和
普通文件一样。用户进程通过文件系统的接口访问设备驱动程序。设备驱动程序主要完成这 些功能:

z 探测设备和初始化设备

z 从设备接收数据并提交给内核

z 从内核接收数据送到设备 z 检测和处理设备错误 Linux设备驱动程序在Linux的内核源代码中占有很大的比例,从2.0、2.2到2.4版的内核,

源代码的长度日益增加,主要是驱动程序的增加。

Linux系统把设备分成三种类型:字符型设备,块设备和网络设备。字符设备的读写以 字节为单位,存取时没有缓存。块设备读写以块为单位,存取时有缓存支持以提高效率。典 型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘、CD-ROM等。一个文 件系统要安装进入操作系统必须使用块设备。网络设备用于通信,网络设备在Linux里做专 门的处理。Linux的网络系统主要基于BSD Unix的socket机制。在系统和驱动程序之间定义 有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提 供流量控制机制,提供对多协议的支持。

所有设备的驱动程序都有一些共性,是写所有类型的驱动程序都通用的,操作系统提供 给驱动程序的支持也大致相同。这些特性包括:

1. 读写 几乎所有设备都有输入和输出。每个驱动程序要负责本设备的读写操作。操作系统的其

他不需要知道对设备的具体读写操作怎样进行,这些都由驱动程序屏蔽掉了。操作系统定义 好一些读写接口,由驱动程序完成具体的功能。在驱动程序初始化时,需要把具有这种接口 的读写函数注册进操作系统。

2. 中断 中断在现代计算机结构中有重要的地位。操作系统必须提供驱动程序响应中断的能力。

一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后调用驱动程序的处 理程序。Linux支持中断的共享,即多个设备共享一个中断。

3. 时钟 在实现驱动程序时,很多地方会用到时钟。如某些协议里的超时处理,没有中断机制的

硬件的轮询等。操作系统应为驱动程序提供定时机制。一般是在预定的时间过了以后回调注 册的时钟函数。
嵌入式Linux系统驱动程序开发和普通Linux没有区别。嵌入设备由于硬件种类非常丰 富,在缺省的内核发布版中不一定有所有驱动程序。可以在硬件生成厂家或者Internet上寻 找驱动程序。如果找不到,可以根据一个相近的硬件的驱动程序来改写。这样开发速度就会 很快。
二、内核模块

Linux的内核是一个整体式程序(Monolithic kernel,与之对应的是微内核,Micro kernel), 即所有的内核功能是连接在一起,在同一个地址空间执行的。但完全这样做会带来很多不便 和浪费。如果新添加一个硬件,就需要重新编译内核,如果去掉一个硬件,那么这个硬件已 经编译进内核的驱动程序就是浪费。Linux操作系统提供了一种机制解决这个问题-内核模 块。可以根据需要,在不需要重新编译内核的情况下,把模块插入内核或者从内核卸载掉。

模块是内核的一部分,但是并没有被编译到内核里去。它们被分别编译和连接成目标文 件。用命令insmod插入一个模块到内核中,用命令rmmod卸载一个模块。在Linux内核中, 以下内容一般编译成模块:
大多数的驱动程序。包括SCSI设备,CD-ROM,网络设备,不常用的字符设备,如打 印机,watchdog等。
大多数文件系统,理论上除了根文件系统不能是模块,其他文件系统都可以是模块。桌 面Linux常用的文件系统包括:minix,fat16,fat32,nfs,smbfs,iso9660,proc等。嵌入式 Linux常用的文件系统:cramfs,ramfs,jffs,proc等。
一些内核支持的不常用的可执行文件格式,如binfmt_misc。

§6.6 Windows CE 系统开发