微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux设备驱动开发之:设备驱动概述

嵌入式Linux设备驱动开发之:设备驱动概述

时间:08-13 来源:3721RD 点击:

11.1 设备驱动概述

11.1.1 设备驱动简介及驱动模块

操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。设备驱动程序是内核的一部分,硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有60%以上。因此,熟悉驱动的编写是很重要的。

在第2章中已经提到过,Linux内核中采用可加载的模块化设计(LKMs,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其他的代码可以编译到内核中,或者编译为内核的模块文件(在需要时动态加载)。

常见的驱动程序是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则直接编译在内核文件中。有时也把内核模块叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。因此,加载驱动就是加载内核模块。

这里,首先列举一些模块相关的命令。

n lsmod列出当前系统中加载的模块,其中左边第一列是模块名,第二列是该模块大小,第三列则是使用该模块的对象数目。如下所示:

$ lsmod

Module Size Used by

Autofs 12068 0 (autoclean) (unused)

eepro10018128 1

iptable_nat 19252 0 (autoclean) (unused)

ip_conntrack 18540 1 (autoclean) [iptable_nat]

iptable_mangle 2272 0 (autoclean) (unused)

iptable_filter 2272 0 (autoclean) (unused)

ip_tables 11936 5 [iptable_nat iptable_mangle iptable_filter]

usb-ohci19328 0 (unused)

usbcore 54528 1 [usb-ohci]

ext3 67728 2

jbd 44480 2 [ext3]

aic7xxx 114704 3

sd_mod 11584 3

scsi_mod 98512 2 [aic7xxx sd_mod]

n rmmod是用于将当前模块卸载。

n insmod和modprobe是用于加载当前模块,但insmod不会自动解决依存关系,即如果要加载的模块引用了当前内核符号表中不存在的符号,则无法加载,也不会去查在其他尚未加载的模块中是否定义了该符号;modprobe可以根据模块间依存关系以及/etc/modules.conf文件中的内容自动加载其他有依赖关系的模块。

11.1.2 设备分类

本书在前面也提到过,Linux的一个重要特点就是将所有的设备都当做文件进行处理,这一类特殊文件就是设备文件,它们可以使用前面提到的文件、I/O相关函数进行操作,这样就大大方便了对设备的处理。它通常在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在。

Linux系统的设备分为3类:字符设备、块设备和网络设备。

n 字符设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备, 如并口设备、虚拟控制台等。字符设备可以通过设备文件节点访问,它与普通文件之间的区别在于普通文件可以被随机访问(可以前后移动访问指针),而大多数字符设备只能提供顺序访问,因为对它们的访问不会被系统所缓存。但也有例外,例如帧缓存(framebuffer)是一个可以被随机访问的字符设备。

n 块设备通常指一些需要以块为单位随机读写的设备,如IDE硬盘、SCSI硬盘、光驱等。块设备也是通过文件节点来访问,它不仅可以提供随机访问,而且可以容纳文件系统(例如硬盘、闪存等)。Linux可以使用户态程序像访问字符设备一样每次进行任意字节的操作,只是在内核态内部中的管理方式和内核提供的驱动接口上不同。

通过文件属性可以查看它们是哪种设备文件(字符设备文件或块设备文件)。

$ ls –l /dev

crw-rw---- 1 root uucp 4, 64 08-30 22:58 ttyS0 /*串口设备, c表示字符设备*/

brw-r----- 1 root floppy 2, 0 08-30 22:58 fd0/*软盘设备,b表示块设备*/

n 网络设备通常是指通过网络能够与其他主机进行数据通信的设备,如网卡等。

内核和网络设备驱动程序之间的通信调用一套数据包处理函数,它们完全不同于内核和字符以及块设备驱动程序之间的通信(read()、write()等函数)。Linux网络设备不是面向流的设备,因此不会将网络设备的名字(例如eth0)映射到文件系统中去。

对这3种设备文件编写驱动程序时会有一定的区别,本书在后面会有相关内容的讲解。

11.1.3 设备号

设备号是一个数字,它是设备的标志。就如前面所述,一个设备文件(也就是设备节点)可以通过mknod命令

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top