驱动程序原理.doc

上传人:hw****26 文档编号:2414242 上传时间:2019-05-12 格式:DOC 页数:7 大小:146.50KB
下载 相关 举报
驱动程序原理.doc_第1页
第1页 / 共7页
驱动程序原理.doc_第2页
第2页 / 共7页
驱动程序原理.doc_第3页
第3页 / 共7页
驱动程序原理.doc_第4页
第4页 / 共7页
驱动程序原理.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、知识体系结构 应用程序:是一段可以执行的代码,由操作系统管理。 编译原理,链接器,装载器:是对操作系统依赖的一个工具,将用户的代码变成可执行的机器码,编译器仅仅检查和翻译用户的语言逻辑,但并不装配成符合操作系统要求的可执行文件格式,如 windows 要求的 EXE 文件为 PE 格式( EXE 文件并不仅仅是一个可执行的代码段,而且包含了很多其他的内容,如数据段)。 操作系统接口 API:是一个可以被用户程序调用的系统功能接口,可以说,我们编写程序,除了计算和流程控制这些只需要用到 CPU 指令和 CPU 寄存器的代码外,其余要访 问其他(硬件)资源(包括内存,外设)的代码,均是通过调用 O

2、S 的 API 来操作除 CPU 外的资源的,如向屏幕写一个字母,对于程序来说简单得很, print(“A”); 但是其编译后执行的过程是复杂的,编译后的程序会调用操作系统的 API,将当前应用程序的状态(上下文,如光标的位置)以及字母传递给显示器的驱动程序去显示。 操作系统管理与调度:操作系统要实现一般通用的资源管理,也要实现资源使用的协调,包含 CPU,内存,磁盘,外设。 首先要确定为什么需要操作系统,操作系统设计的目标是什么? 1 我们总是不能等做完一件事情才去做 另外一件,因为有些事情做的过程需要等待,有时候也需要暂停一下当前的任务,先去处理更急的事情,等我回来时又需要以前的任务保持当

3、时的状态,所以需要计算机也要具备这样的能力,那怎么实现呢? 2 CPU 和内存是计算机的最需要的资源,就如我们的人脑一样,一般很难在同一时间做两件事情。需要处理好一件事情再处理另一件,如果处理得越快就越好,但是不能前一件事情要等待,你就休息了,后面一件也做不了,计算机的办法就是你不用 CPU 了,那好你等待下,我先处理下一个事情。 3 我们写程序,不可能对每个应用,我们重新去写那些驱动程序,也不可能 按照自己的想法去处理这些通常的资源管理。否则很多人各自写的应用软件就没法在一个电脑上运行。 操作系统目标: 1 实现代码重用,对于硬件的访问,对于 CPU 和内存的充分利用,使不同的应用不需要重新

4、去写这些代码。 2 实现各个任务(不同应用程序)的协调使用,使用户可以实现暂停、重新启用某个任务。 3 实现数据的安全管理,实现良好的人机界面的管理。 4 实现一个开放的体系结构,提供系统调用使用户可以快速编写自己的应用,并提供编译器、链接器、装载器来让用户编写的程序变成可以与操作系统接口的可执行软件。 操作系统的功能分层: CPU 管理是操作系统的核心:操作系统与用户程序其实可以看成是一个程序,与以前的单任务系统和单片机程序没有本质的区别。 我们来看整个 PC 机运行过程 : 1 系统上电。 2 主板上 CPU 的 CS 值设置为 0Fx000, IP 值设置为 0xFFF0,这样 CS:I

5、P 就指向0xFFFF0 位置,这个是程序的开始地址,而硬件上在总线上挂接在 0xFFFF0 地址的是主板的 BIOS 芯片, BIOS 开始运行, BIOS 是 Basic Input Output System 简写,意思即基本的输入输出系统,如果学过单片机就很好理解,其实就是一个程序,由 主板设计的公司的程序员编写的,通过一定的方法(如编程器)写入到芯片内,这段程序会一上电就开始运行。 3 BIOS 会检查所有的主板资源,并初始化主板的硬件资源,如总线控制器、显示卡、内存等,并将主板的固有资源和接插件的信息放入固定的内存区域,以便操作系统可以从中获取得到当前的主板上有些什么设备资源。 4

6、 BIOS 会在内存地址的最低位 0x000000 构建起中断向量表,共 1K内存(一个向量CS:IP 各两个字节,共 256 个向量), 接着是 1/4K( 256byte)的内存放 BIOS 数据,接下来在 0x0E2CE( 56K 处)加载 了 8K 左右的与中断向量表相应的若干中断服务程序。 5 当 BIOS 程序检测到主板上的设备符合启动系统的条件,就读取硬磁盘的引导扇区(第一扇区,这里也是一个程序,从哪个磁盘加载由 CMOS 设置确定), BIOS系统将这段程序 bootloader 读入内存,并将控制权交给引导程序。 6 BIOS 具有驱动硬盘等硬件的驱动程序,并且,具有基本的硬

7、件驱动服务程序。这些都由主板硬件厂商提供。 Bootloader 会调用 BIOS 的驱动程序和已有的中断服务来从硬盘读取操作系统的核心到内存,并将 CPU 控制交给操作系统。(操作系统就如一段数据被 映射到内存,然后程序通过修改 CS:IP 跳转到操作系统的入口。) 7 操作系统会通过 IGDT 重新构建中断向量表。每个硬件产生的中断,其编号在硬件设计之初就已经设计好,外部硬件中断 /CPU 内部异常中断 /程序调用中断,其中断号和程序是预先设置好的,当有外部中断时,中断寄存器 IPR 会暂时存储,并与中断屏蔽寄存器 IMR 进行 AND 位运算,然后就可以确定是否处理当前中断,这个是硬件电

8、路实现的,运算后的结果经过中断处理(中断译码)进入 CPU 的中断寄存器 IDTR, CPU 执行完当前指令,会自动处理(检查)中断,并将 CS:IP 指向中 断地址,这个地址是什么呢?在实模式下( 16 位模式),中断译码根据中断号N x 4(每个中断 4 个字节 )直接设置 IP,也就是中断的程序地址没法更改的,然后在中断向量的位置就是一个跳转指令,跳转到服务程序处。在保护模式下呢,中断向量的原理与组织与实模式基本一样,也是 256 个中断处理程序,但是其中断服务程序不在固定的位置,中断向量表也不在固定的位置, CPU 的 IDTR 寄存器由操作系统在系统初始化之初就装入了中断向量表(中断

9、门表)在内存中的寻址位置信息,保护模式下,硬件将 IDTR 和中断号 N 译码找到中断表的该中断描述项, 而描述项说这个服务程序在 GDT 或 LDT 表中的第 X 项描述的段中,以及偏移多少可以找到程序,然后找到这个段的基址 +32 位的地址偏移量。 8 操作系统从实模式转保护模式时,最重要的一个是构建内存映射表和各种描述符表。 CPU 访问内存时,是通过 MMU 进行了译码的, MMU 的作用就是把 CPU 指令中的虚拟地址(是程序员编写的地址,一般高级语言编写的程序不直接写地址,但是程序装载到内存后,所有访问地址的指令都发生了地址修改,这是由装载器设置的。)变成实际的物理地址。 9 操作

10、系统为什么需要 MMU,计算机从主板启动后,是在 ROM 中 运行的,速度相对于 RAM 来说是非常慢,我们就想到把程序复制到 RAM 中运行,但是计算机体系的执行是有固定的地址的,如 CPU 上电首先从 0xFFFF0 地址加载第一条指令,发生错误则会自动将 IP 指向 0x0000 开始的中断向量表,如果我们将程序 COPY到 RAM 运行,但是硬件一中断,还是会跑到硬件地址的 0x0000 处的向量表去运行,还是在 ROM 中,一样缓慢,为了解决这个问题,我们想到了地址转换,当将程序 COPY 到 RAM 中后,构建 MMU 的页表,然后启动 MMU 的地址转换功能,然后程序开始从我们设

11、定的地址开始运行(如 0xFFFA0),而 CPU 也为了与操作系统配合,也定义了保护模式,其运行规则也相应发生了变化,其 IGTR 中的值由实模式时的 0x000 变成了由操作系统定义的中断门表的地址。保护模式时的中断程序的寻址比实模式复杂,因其中断处理器硬件也复杂。而对于 BIOS 的ROM 访问地址,也被映射到了新的虚拟地址空间,不再是 0xFFFF0,所以对于ROM 中的中断程序的访问,是通过 IGTR+中断描述项定位到该内存地址。所有的外设的内存映射地址均被操作系统重新映射和管理。 (系统上电时,处理器的程序指针从 0x0(或者是由 0Xffff_0000 处高端 启动)处启动,顺序

12、执行程序,在程序指针( PC)启动地址,属于非易失性存储器空间范围,如 ROM、 FLASH 等。然而与上百兆的嵌入式处理器相比, FLASH、 ROM等存储器响应速度慢,已成为提高系统性能的一个瓶颈。而 SDRAM 具有很高的响应速度,为何不使用 SDRAM 来执行程序呢?为了提高系统整体速度, 可以这样设想,利用 FLASH、 ROM 对系统进行配置,把真正的应用程序下载到 SDRAM中运行,这样就可以提高系统的性能。然而这种想法 又遇到了另外一个问题,当ARM 处理器响应异常事件时,程序指针将要跳转到 一个确定的位置,假设发生了IRQ 中断, PC 将指向 0x18(如果为高端启动, 则

13、相应指向 0vxffff_0018 处 ),而此时 0x18 处仍为非易失性存储器所占据的位置,则程序的执行还是有一部分要在FLASH 或者 ROM 中来执行 的。那么我们可不可以使程序完全都 SDRAM 中运行那?答案是肯定的,这就引入了 MMU,利用 MMU,可把 SDRAM 的地址完全映射到 0x0 起始的一片连续地址空间,而把原来占据这片空间的 FLASH 或者 ROM映射到其它不相冲突的存储空间位置。 例如, FLASH 的地址从 0x0000_00000x00ff_ffff,而 SDRAM 的地址范围是 0x3000_0000 0x31ff_ffff, 则可把 SDRAM地址映射为

14、 0x0000_0000 0x1fff_ffff 而 FLASH 的地址可以映射到 0x9000_0000 0x90ff_ffff(此处地址空间为空闲,未被占用)。映射完成后,如果处理器发生异常,假设依然为 IRQ 中断, PC 指针指 向 0x18 处的地址,而这个时候 PC 实际上是从位于物理地址的 0x3000_0018 处读取指令。通过 MMU 的映射,则可实现程序完全运行在 SDRAM 之中 ) 10 内存映射表:是为 MMU 构 建的一块内存区域,其内容为一个表,或者叫一个数组,每个元素标记了 虚拟地址:物理地址 ,页表一般分两极,第一级为 1M 一个项,第二级则是 1M 内的索引

15、。那会有多少呢, 4G=4K 项,然后每个 1M=256项, 所以页表大小为 1M,如果每个项为 32bit,那么至少需要 256K 个指令周期才能把内存的页表装入 MMU,也就是 0.4ms, windows 的 CPU 分时片为 20ms。那么进程切换的时间不少于 1ms。 11 CPU 中有是否启用 MMU 的寄存器设置,如果不启用,则 CPU 发出读写地址 线信号,同时 MMU 不会做出反应,使能信号直接 被 MMU 输出, RAM 检测到指令,直接将数据放到总线上,并通知 CPU 数据准备好。如果启用 MMU, CPU 发出读写指令, MMU 同时从总线获取地址数据经过硬件运算,仅仅

16、一个硬件周期,然后修改总线的地址,并通知内存或北桥芯片地址准备好。 12 对于操作系统来说,只要构建每个进程的内存映射表,并在进程切换时将内存映射表复制到 MMU 的缓冲中。 13 而对于应用程序来说,是不能操作 MMU 的,所以,当企图访问没有映射的虚拟内存时, MMU 会向 CPU 会产生缺页中断,然后在中断服务程序中,操作系统会根据是否是被换出内存还是没有初始化,来决定是 从硬盘装载内存,或抛出异常错误。 14 操作系统的内存管理,是分段式管理,并在内存中构建了一个段描述符表,这个表是用来告诉大家( CPU,所有程序)每个段内放了什么东西,是可执行代码,或是数据,或者是一个只读存储器,或

17、者这个部分是不能访问的。为什么要这样,因为系统的 4G 内存空间,其实是不连续的,所有的硬件都是挂接在总线的, CPU只有通过 32 位总线来访问所有的非 CPU 的外设,包括 MMU, RAM,北桥,硬件上 CPU 就仅与上面的器件通过 32 位总线连接,对于键盘、鼠标、显示器、 PCI卡、 USB、电池芯片、声卡、网卡等等的访 问,都是通过写地址总线,然后读数据总线(其实就是地址线,冯。诺伊曼结构的总线复用),来获取或写入一个数据。而硬件的挂接地址是不连续的,我们访问内存地址时,就要清楚每个实际地址的用途,为了安全,在不清楚的情况下,即使发出错误指令,系统也会自动根据段的属性来检查是否处于

18、保护中的地址,以免系统马上崩溃。不是说过 Win32 环境下不用“段”了吗?是的,这些“段”实际上并不是 DOS 汇编中那种意义的段,而是内存的“分段”。上一个段的结束就是下一个段的开始,所有的“分段”合起来,包括系统使用的地址空间,就组成了整个可以寻址 的 4 GB 空间。由于 Win32环境的内存管理使用了 80386 处理器的分页机制,每个页( 4 KB 大小)可以自由指定属性,所以上一个 4 KB 可能是代码,属性是可执行但不可写,下一个 4 KB就有可能是既可读也可写但不可执行的数据,再下面呢?有可能是可读不可写也不可执行的数据。 Win32 汇编源程序中“分段”的概念实际上是把不同

19、类型的数据或代码归类,再放到不同属性的内存页(也就是不同的“分段”)中,这中间不涉及使用不同的段选择器。虽然使用和 DOS 汇编同样的 .code 和 .data 语句来定义,意思可是完全不同了!为了 简单起见,在本书中还是简称“段”,读者应该注意到其中不同的含义。在程序中如果不小心用了对 .const 段中的数据做写操作的指令,会引起保护错误。在程序中不必定义堆栈段,系统会自动分配堆栈空间。惟一值得一提的是,堆栈段的内存属性是可读写并且是可执行的,这样靠动态修改代码的反跟踪模块可以拷贝到堆栈中去边修改边执行。一些病毒或者黑客工具用到的缓冲区溢出技术也用到了这个特征,有兴趣了解的读者可以查阅相

20、关的资料。 15 4K, 是 windows 管理内存的最小单位,每个 4K的虚拟地址对应整块的 4K实际地址,而每个实际的 4K 地 址为一个段,每个段又有自己的存储属性。当程序访问某个虚拟地址时, MMU 先获得虚拟地址与实地址的对应的页表描述项,描述项说地址我不知道,但是我知道他在操作系统的段表中 ,要么在 GDT 要么在 LDT 中的第 N 项,然后在 GDT 中的 N 项说这个段是不能被访问的, MMU 就报告出错了,如果可以访问,那么就根据这个段的起始地址 + (虚拟地址 / 4K 的余数就是段内偏移地址。) 16 Windows 的内存分配机制,当应用程序调用操作系统的内核程序申

21、请一个内存区域,内核程序会根据当前的应用程序的内存使用链表来来决定是否需要申请新的页(段 ),如果在当前已经申请的 4K 内存页还有符合申请的大小块就直接重建链表,分配一个地址给当前进程,可见当前的进程的内存的分配也是操作系统管理的。 17 DMA 控制器,用于管理两个外设之间的数据流传输,如控制从磁盘读取数据进入内存, DMA 控制器是一个连续 地址信号 发生器,同时也有读写的方向时序控制,数据不经过 CPU, 由 DMA 控制直接在总线上传输。 设备驱动程序: 操作系统的驱动程序结构,首先明白计算机硬件与 CPU 及操作系统的关系,操作系统的代码仅仅在 CPU 中运行,所以只要 CPU 支

22、持该操作系统的指令代码,就可以启动 操作系统,而至于访问硬件的过程,就是读取内存地址的过程( MOV eax, &0xFFF330),对于 i386其 IO 地址是独立的地址空间 0x0000-0xFFFF 共 64K所以 CPU的地址空间对于 i386有两个,访问的指令也有两种,而对于 ARM 这些来说 IO 地址是被编址到 32 位内存地址空间的,所有外设也被挂接到内存总线上的。这些硬件的物理地址在主板制造好时就已经定了,无法更改,而 BIOS 的功能之一也就是收集这些设备与 IO 的地址对应信息,并交给操作系统。然后操作系统根据 BIOS 提供的设备信息安装相应的设备驱动程序给 操作系统

23、内核使用。如果BIOS 不提供这些设备的 IO 信息,那么操作系统怎么办呢,那操作系统不可能搜索整个 IO地址空间来确定有哪些设备,所以也就没法知道有哪些外设 IO。外设的 IO 分配是主板设计者决定的,每个设备均有连续的三部分寄存器 IO 地址, 1。控制寄存器, 2。数据寄存器,3。状态寄存器。通过对寄存器的读写,也就是执行指令 IN/OUT 0xFFFF,来读写寄存器实现对于外设的操作,可以看到,这个与单片机对于单个引脚的控制方法不同。 PC 机的目标是数据交换和处理,而单片机的目标主要是控制每个引脚的电平实现硬件的控 制。 操作系统会自带一些驱动程序,那么这些自带的驱动程序怎么与实际的

24、硬件关联起来呢。 下面我们来看 USB 鼠标的驱动,在 windows 的设备管理器中我们可以发现,鼠标项,其中可以找到 HID 鼠标,这个是一个符合 USB 设备类 HID 类的串行设备,我们发现这个设备没有硬件资源,也就是说没有对应的 IO 地址和中断号。所以这个不是一个真实的独立的设备,它是一个 windows 的高层设备,也可以叫这个设备是一个虚拟的接口设备,我们可以采用 windows 的一般鼠标驱动程序来操作这个设备。而实际上对于它的操作,会被该设备关联的驱动 程序所接管,而其关联的驱动程序是什么能,是 windows 自带的 USB HID 类驱动程序,对于 USB 的 HID

25、类设备,其操作协议有固定的规范,所以可以直接驱动。那么USB HID 驱动程序又怎么驱动实际的硬件呢,我们可以在 windows 的设备管理器中找到该鼠标对应的 USB 控制器,而该控制器有 IO 地址 1840-185F 共 32 个字节空间以及中断号 18, 那么这个地址和中断号怎么来的呢,这个就是 BIOS 告诉操作系统的,地址和中断号是主板设计时就已经定了的。所以在不同的 PC 上装的 windows,其 IO 地址和中断也不同 。 bios 启动,可以访问 VGA,也可以设定从磁盘或 USB 设备启动,说明 BIOS 已经可以驱动所有设备,其实上 BIOS 已经构建起中断向量表,对于

26、挂接到中断总线的所有设备产生的硬件中断已经具有响应能力, BIOS 启动后,从 CDROM 或硬盘或 USB 设备装载引导程序,最开始没有安装操作系统时,引导程序是一个引导安装系统的程序,安装程序启动运行会根据 BIOS 的设置来配置操作系统,在 windows 中明显的就是改变注册表,注册表是系统能用的所有硬软件资源的描述。安装完成后,系统就进入正式的系统。在没有安装更多主板驱 动程序之前,所有的底层硬件驱动就是通过中断服务程序提供的,如 USB 的控制驱动程序,也可以说是总线驱动程序,响应硬件中断和软件中断,提供硬件访问服务,怎么在中断服务( USB 总线驱动)和操作系统的通用驱动程序接口

27、之间建立对应的关系呢,对于即插即用硬件来说,这个映射过程是动态的,当没有鼠标接入 USB 端口时,内存中就存在对于中断 18 响应的 USB 控制器驱动程序,但是什么也不做。当有鼠标插入 USB 端口,首先鼠标的 USB 芯片得电运行,同时 USB 的数据线会拉底主机的 USB 控制器接口的数据线接口的电平,硬件就会知道有设备接入 ,直接发送 USB 控制数据包,读取设备的配置信息,知道了设备的描述信息后进一步配置设备信息,同时通过挂接在中断总线上的引脚产生中断信号 18, 中断服务程序进一步与鼠标芯片交流,确定为 HID 设备后,中断服务程序会搜索其成员对象中能处理 HID类别的驱动程序来与

28、这个设备通信。而这个 HID驱动程序在哪呢,什么时候又与中断服务关联了呢,这个就是 BIOS 与操作系统的交互过程,操作系统启动后,会将自己的三类 USB 驱动程序挂接到中断服务中,怎么挂接?操作系统直接调用 BIOS 的函数表中的函数将驱动程序的指针加到服务程序的驱动程序 列表,然后所有的来自鼠标的中断均被转发到 HID驱动来处理,而 HID做了什么, HID 会检查设备的类型和设备供应商及 ID,并从本驱动的附属驱动中找到最合适的驱动并交给它处理,如果没有找到驱动,则调用操作系统的硬件驱动程序的安装流程,驱动程序安装好后,驱动程序初始化会向 HID 驱动登记自己,并在操作系统中注册一个鼠标

29、类别的设备,并将标准的鼠标驱动放到本驱动中 , 当鼠标移动,首先鼠标的移动数据被保存到鼠标的 USB 芯片的寄存器中,并产生 USB 传输数据申请, USB 控制器读取寄存器的数据到主机的 USB 寄存器中,如 0x1850 处,然后申请中断处理,中断程序获取到寄存器数据,并传递给 USB 鼠标器驱动程序, USB 鼠标驱动程序调用操作系统的标准鼠标处理程序(标准驱动程序)来处理命令,一般就是鼠标驱动会通知windows 的窗口管理进程重画整个界面(鼠标位置数据已变更)。 当我们要访问 USB 端口时,我们不能直接读写 USB 端口,因为 USB 端口是由控制器管理的,当没有挂接设备的时候,

30、windows 中也没有对应的设备项目,因此也就没法通过readFile/writeFile 来操作没有对象的设备了。 当有一个可以读写的 USB 设备别挂接时,如 USB 转串口芯片,系统开始找不到驱动就安装,安装好后,驱动程序会向系统注册一个 COM 端口,而该设备的驱动程序指向芯片特有的驱动程序,芯片驱动程序会调用 USB 总线驱动将数据传输到芯片端,而这个数据格式是驱动程序根据芯片定制的,当收到数据时,芯片驱动程序会将接收到得数据传递给通用COM 驱动给其处理。 对于 U 盘操作,那些通用的磁盘驱动程序, Scsi 的函数都只是在准备一些缓冲区、数据结构等,并没有对硬件进行操作,真正要

31、操作硬件设备的还是由驱动程序来完成的,可见,设备驱动程序是有着很强层次结构的,下层是专门针对物理设备的, 上层是针对操作系统的抽象设备的,下层是 U 盘等物理实体,上层是文件夹,二者通过一定的通信或调用机制完成了设备在操作系统下的正常工作。 U 盘插入,系统调用安装设备驱动程序, U 盘驱动初始化设备, 当第一次加入内存, U 盘驱动程序修改了总线驱动的设备驱动程序列表,将自己挂接在总线上进行监控,同时修改了系统的设备清单,应用程序读写这个磁盘时不是通常的ReadFile 和 writeFile,而是通过 DeviceIOControl 来传递命令控制设备的,首先调用的 U 盘驱动程序,然后由设备驱动程序调用通用的 DISK 处理程序来处理, 处理完成后,最后调用设备驱动程序的实际硬件操作。 总线驱动: CPU 与主板的配合 外设接口原理

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 建筑建材

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。