操作系统--7Linux驱动程序编写基础

来源:互联网 发布:对外承包工程数据库 编辑:程序博客网 时间:2024/06/16 15:10

用户通过加载内核模块可以方便地给内核添加功能,也可以通过内核模块将内核不需要用的功能卸载。

现代的操作系统的内核主要分为单内核和微内核两种。单内核操作系统内部可以划分成层次或模块,但运行时时一个大的二进制映像,模块间的交互通过直接调用其他模块中的函数来实现。微内核操作系统内核中仅包含资源控制与通信功能,其他功能都在内核,由用户态下运行的服务进程实现,通过微内核提供的消息传递机制完成进程之间的通信。

LINUX操作系统是一种单内核结构的操作系统,但是在其基础上引入了模块机制,克服了单内核的缺点,一定程度上解决了单内核功能的适应性、灵活性和可伸缩性问题。

Linux提供的模块机制的完整叫法是动态可加载内核模块(LKM),一般简称为内核模块或模块。内核模块是一个目标文件,其代码可以在运行时链接到内核或从内核中解除链接。利用内核模块的主要优点如下:

1)模块化方法

2)平台无关性

3)节省内存使用

4)无性能损失

内核在管理内核模块时,主要有两个任务一是符号表管理,二是维护内核模块引用计数。

内核提供了init_module()和delete_module()两个系统调用实现内核模块的动态安装和卸载。LINUX系统限制只包含CAP_SYS_MODULE权限的用户才能对内核模块进行安装和卸载。linux系统也提供了insmod、rmmod和modprope三个命令行工具供用户在命令行下对内核模块进行操作。

7.3中断服务例程

驱动程序可以采用两种方式等待外设完成操作。一种是查询方式,驱动程序在提交命令后就开始查询设备的状态寄存器,当状态寄存器表明操作完成时,驱动程序才继续后续的处理。另一种是利用中断,驱动程序提交命令后立即进入休眠状态,设备结束操作之后,产生中断信号,操作系统则根据设备的中断信号负责唤醒驱动程序。

在LINUX中,多个设备可以共享同一个中断。对于一个中断,内核维护了一个中断服务例程(ISR)的链表。当中断到来时,该中断的每一个中断服务例程都会被一次调用。内核允许设备驱动将自己的中断服务例程插入响应中断的队列。

7.3.1概述

由于受中断向量数量较少的硬件限制,不能给每一个外设分配一根单独的中断号。为了解决这个问题,一些外设必须共享同一个中断号。共享同一个中断号的多个外设发出的中断信号是相同的。当共享中断号的任何一个外设产生中断,处理器都会转跳到同一个中断处理程序。为了使每个设备能够有独立的中断处理程序,LINUX引入了中断服务例程的概念。

中断处理程序与中断服务例程是两个不同的概念。

中断处理程序相当于某个中断的总处理程序,并不服务于任何特定的设备。当发生中断后,中断处理程序的主要工作是做一些通用的现场保护,并把该中断所包含的所有的ISR依次运行一遍。

中断服务例程:ISR是为某一个具体设备服务的程序。每个外设都有各自的ISR与之对应。

为了使整个中断处理过程的时间尽可能缩短,每一个ISR被运行时,ISR要检测该中断是不是由ISR所对应设备发出的,如果不是,ISR应立即退出。

7.4上半部和下半部

当中断发生时,中断服务例程被串行化执行。为了提高内核处理中断的吞吐量,提高内核的响应速度,把中断服务例程分成上半部和下半部。上半部会立即被内核执行下半部分会被推迟执行。下半部的执行并不需要指明一个确切的时间,只要把这些任务推迟,让它们在系统不太繁忙并且中断恢复后执行就可以。

LINUX提供的下半部实现机制主要有软中断、tasklet和工作队列软中断只能被静态定义,执行的速度快,一般用于对时间要求非常严格的场合;tasklet是下半部处理的首选机制,能够动态被创建,但它在执行过程中不能睡眠工作队列在一个内核线程的上下文中执行,在工作队列中的任务是能够睡眠的,并且工作队列中的任务还可以在指定延时后才被执行。

————————————————————————————————————

系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序的本质是实现逻辑设备到物理设备的转换,启动相应的I/O设备,发出I/O命令,完成相应的I/O操作,它是内核与外围设备数据交流的核心代码。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。

LINUX2.6内核开发了全新的设备模型,采用sysfs文件系统,该文件系统类似proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。

LINUX2.6引入新的设备管理机制kobject,通过这个数据结构使所有设备在底层都具有统一接口,提供基本的对象管理,是构成linux2.6设备模型的核心机构,与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。

LINUX中的任一设备在设备模型中都有一个device对象描述,对应数据结构struct device.

系统中的每个驱动程序都由一个device_driver对象描述,对应的数据结构使struct device_driver.


0 0