硬件控制方法

应用和硬件

在用C 语言等高级编程语言开发的Windows 应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由Windows 全权负责的。

不过,Windows 提供了通过应用来间接控制硬件的方法。利用操作系统提供的 系统调用功能就可以实现对硬件的控制。在Windows 中,系统调用称为 API。各API 就是应用调用的函数。这些函数的实体被存储在DLL 文件中。

支撑硬件输入输出的IN 指令和OUT 指令

Window 控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN 和OUT。这些指令也是汇编语言的助记符。

IN 指令通过指定端口号的端口输入数据,并将其存储在CPU 内部的寄存器中。 OUT 指令则是把CPU 寄存器中存储的数据,输出到指定端口号的端口。

下面让我们来看一下端口号和端口到底是什么。计算机主机中,附带了用来连接显示器及键盘等外围设备的连接器。而各连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的IC。这些IC,统称为 I/O 控制器。由于电压不同,数字信号及模拟信号的电流特性也不同,计算机主机和外围设备是无法直接连接的。为了解决这个问题,I/O 控制器就很有必要了。

I/O 是Input/Output 的缩写。
显示器、键盘等外围设备都有各自专用的I/O 控制器。I/O 控制器中有用于临时保存输入输出数据的内存。这个内存就是端口。端口(port)的字面意思是“港口”。由于端口就像是在计算机主机和外围设备之间进行货物(数据)装卸的港口,所以因此得名。I/O 控制器内部的内存,也称为寄存器。虽然都是寄存器,但它和CPU 内部的寄存器在功能上是不同的。CPU 内部的寄存器是用来进行数据运算处理的,而I/O 寄存器则主要是用来临时存储数据的。

在实现I/O 控制器功能的IC 中,会有多个端口。由于计算机中连接着很多外围设备,所以就会有多个I/O 控制器,当然也会有多个端口。一个I/O 控制器既可以控制一个外围设备,也可以控制多个外围设备。各端口之间通过 端口号进行区分。端口号也称为 I/O 地址。IN 指令和OUT 指令在端口号指定的端口和CPU 之间进行数据的输入输出。这和通过内存地址来进行主内存的读写是一样的道理。

I/O 装置,有的直接附带在计算机主机的主板(用来放置CPU 的基板)上,有的则是各自独立的扩张板卡。键盘、鼠标、打印机等常用的I/O,一般都在主板上,而显示高速图形的显示器及网卡等特殊的I/O,通常是独立的扩张板卡。

在这里插入图片描述
通过Windows 的控制面板,我们可以查看外围设备所连接的I/O控制器的端口号。近年来软驱已经不是标配了,Win7 后的版本中,可以通过控制面板→系统安全 →系统→设备管理查看。

“I/O 的范围”右侧的数值就是端口号。通过指定该端口号,并利用IN/OUT 命令,就可以直接控制软驱这个硬件设备,实现输入输出处理了。

外围设备的中断请求

在“I/O 范围”下面有一个“IRQ”项目,对应的值是0x00000006(06)。IRQ(Interrupt Request)是 中断请求的意思。

IRQ 是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为 中断处理。中断处理在硬件控制中担当着重要角色。因为如果没有中断处理,就有可能出现处理无法顺畅进行的情况。

从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。

实施中断请求的是连接外围设备的I/O 控制器,负责实施中断处理程序的是CPU。为了进行区分,外围设备的中断请求会使用不同于I/O端口的其他编号,该编号称为 中断编号。在控制面板中查看软盘驱动器的属性时,IRQ 处显示的数值06,表示的就是用06 号来识别软盘驱动器发出的中断请求。另一方面,操作系统及BIOSA 则会提供响应中断编号的中断处理程序。

假如同时有多个外围设备进行中断请求的话,CPU 也会为难。为此,我们可以在I/O 控制器和CPU 中间加入名为 中断控制器的IC 来进行缓冲。中断控制器会把从多个外围设备发出的中断请求有序地传递给CPU。

CPU 接收到来自中断控制器的中断请求后,会把当前正在运行的主程序中断,并切换到中断处理程序。中断处理程序的第一步处理,就是把CPU 所有寄存器的数值保存到内存的栈中。在中断处理程序中完成外围设备的输入输出后,把栈中保存的数值还原到CPU 寄存器中,然后再继续进行对主程序的处理。假如CPU 寄存器的数值没有还原的话,就会影响到主程序的运行,甚至还有可能会使程序意外停止或者发生运行异常。这是因为主程序在运行过程中,出于某些原因用到CPU 寄存器。而这时如果突然插入别的程序,主程序必然会受到影响。因此,在中断请求完毕后,各寄存器的数值必须要还原到中断前的状态。只要寄存器的值保持不变,主程序就可以像没有发生任何事情一样继续处理。

在这里插入图片描述

用中断来实现实时处理

在主程序运行的过程中,中断发生的频率有多大呢?实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输入的数据。虽然不利用中断也可从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输入。

由于外围设备有很多个,因此就有必要按照顺序来调查。按照顺序调查多个外围设备的状态称为 轮询。对几乎不产生中断的系统来说,轮询是比较合适的处理。不过,对计算机来说就不适合了。举例来说,假如主程序正在调查是否有鼠标输入,这时如果发生了键盘输入的话,该如何处理呢?结果势必会导致键盘输入的文字无法实时地显示在显示器上。而通过使用中断,就可以实现实时显示了。打印机等输出用的外围设备中,外围设备接收数据的状态,有时是需要用中断来通知的。由于外围设备的处理速度比计算机主机的处理速度要慢很多,因此,这种情况下就不需要对打印机的状态进行多次调查,只需在中断请求发生时输出数据即可,这样一来,其他时间CPU 就可以集中处理别的程序了。中断处理是不是很方便呢。

DMA 可以实现短时间内传送大量数据

在了解I/O 输入输出及中断处理的同时,还希望大家记住另外一个机制,这就是DMA(Direct Memory Access)。 DMA 是指在不通过CPU 的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个DMA机制。通过利用DMA,大量数据就可以在短时间内转送到主内存。之所以这么快速,是因为CPU 作为中介的时间被节省了。

I/O 端口号、IRQ、DMA 通道可以说是识别外围设备的3 点组合。不过,IRQ 和DMA 通道并不是所有的外围设备都必须具备的。计算机主机通过软件控制硬件时所需要的信息的最低限,是外围设备的I/O 端口号。IRQ 只对需要中断处理的外围设备来说是必需的,DMA 通道则只对需要DMA 机制的外围设备来说是必需的。假如多个外围设备都设定成同样的端口号、IRQ 及DMA 通道的话,计算机就无法正常工作了。这种情况下,就会出现“设备冲突”的提示。

文字及图片的显示机制

在本章的最后,让我们一起来看一下显示器显示文字及图形的机制。如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为 VRAM(Video RAM)。在程序中,只要往VRAM 中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或BIOS 提供,并借助中断来进行处理的。

在MS-DOS 时代,对大部分计算机来说,VRAM 都是主内存的一部分。例如PC-9801 这种机型的计算机,主内存地址A0000 地址以后是VRAM 区域。如果用程序往VRAM 内存地址中写入数据,文字及图形就可以显示出来。不过,文字和图形的颜色最多只能有16 种。这是因为VRAM 的内存空间太小了。

在现在的计算机中, 显卡等专用硬件中一般都配置有与主内存相独立的VRAM 和 GPU(Graphics Processing Unit,图形处理器,也称为图形芯片)。这是因为,对经常需要描绘图形的Windows 来说,数百兆的VRAM 是必需的。而为了提升图形的描绘速度,有时还需要专用的图形处理器。但不管怎样,内存VRAM 中存储的数据就是显示器上显示的信息,这一机制是不变的。

用软件来控制硬件听起来好像很难,但实际上只是利用输入输出指令同外围设备进行输入输出的处理而已。中断处理是根据需要来使用的选项功能,DMA 则直接交给对应的外围设备即可。由此可见,对程序员来说,其实并不困难。

虽然计算机领域的新技术在不断涌现,但计算机能处理的事情,始终只是对输入的数据进行运算,并把结果输出,这一点是不会发生任何变化的。不管程序内容是什么,最终都是数据的输入输出和运算。

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值