应用和硬件

程序员通常通过高级语言和系统调用来间接控制硬件,WindowsAPI提供了这样的功能。硬件控制涉及到IN和OUT指令,用于与I/O控制器通信。中断请求(IRQ)允许CPU处理来自外围设备的紧急请求,而DMA则加速了大量数据传输。VRAM在显示文字和图片中起关键作用,存储待显示的信息。
摘要由CSDN通过智能技术生成

我们作为程序员一般很少直接操控硬件,我们一般通过C、java等高级语言编写的程序起到间接控制硬件的作用。所以大家很少直接接触到硬件的指令,硬件的控制是由Windows操作系统全权负责的。

但是,任何事情没有绝对性,环境的不同会造成结果的偏差。虽然程序员没法直接控制硬件,并且Windows屏蔽了控制硬件的细节,但是Windows却为你开放了系统调用功能来实现对硬件的控制。在Windows中,系统调用称为API,API就是应用调用的函数,这些函数的实体被存放在DLL文件中。

应用通过API间接控制硬件:

 下面我们来看一个通过系统调用来间接控制硬件的实例:

加入要在窗口中显示字符串,就可以使用Windows API中的 TextOut 函数。TextOut 函数的语法(C语言)如下:

那么,在处理TextOut函数的内容时,Windows做了些什么?从结果来看,Windows直接控制了作为硬件的显示器。但Windows本身也是软件,由此可见,Windows应该向CPU传递了某种指令,从而通过软件控制了硬件。

1,支持硬件输入输出的IN指令和OUT指令

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

可以通过IN和OUT指令来实现对数据的读入和输出,如下图所示:

也就是说,IN指令通过指定的端口号输入数据,OUT指令则是把CPU寄存器中存储的数据输出到指定端口号的端口。

我们先看一下官方是如何定义端口号和端口的:

 计算机组成原理中计算机的五大组成部分:运算器、控制器、存储器、输入设备输出设备。这次说一下输入设备和输出设备。

计算机主机中,附带了用来连接显示器以及键盘等外围设备的连接器。而连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的IC。这些IC统称我IO控制器。

I/O是Input/Output的缩写。显示器、键盘等外围设备都有各自专用的I/O控制器。I/O控制器中有用于临时保存输入输出数据的内存。这个内存就是端口(port)。I/O控制器内部的内存,也被称为寄存器,不要慌,这个寄存器和内存中的寄存器不一样。CPU内存的寄存器是用于进行数据运算处理的,而IO中的寄存器是用于临时存储数据的。

在I/O设备内部的IC中,有多个端口。由于计算机中连接着很多外围设备,因此也就有很多I/O控制器。当然也会有多个端口,一个I/O控制器可以控制多个设备,不仅仅只能控制一个。各端口之间通过端口号进行区分。

端口号也被称为I/O地址。IN指令和OUT指令在端口号指定的端口和CPU之间进行数据的输入和输出。这跟通过内存地址来对内存进行读写是一样的道理。

以端口为桥梁实现CPU和外围设备的数据传递:

2,测试输入和输出程序

首先让我们利用IN指令和OUT指令,来进行一个直接控制硬件的实验。假如试验的目的是让一个计算机内置的喇叭(蜂鸣器)发出声音。蜂鸣器封装在计算机内部,但它也是外围设备的一种。

用汇编语言比较繁琐,这次我们用C语言来实现。在大部分C语言的处理(编译器的种类)中,只要使用_asm{  } 括起来,就可以在其中记述助记符。也就是说,采用这种方式就能够使用C语言和汇编语言混合的源代码。

在AT兼容机中,蜂鸣器的默认端口号是61H,末尾的H表示的是十六进制的意思。用IN指令通过该端口号输入数据,并将数据的低2位设定为 ON,然后再通过该端口号用OUT指令输出数据,这时蜂鸣器就会发出声音。同样的方法,将数据的低2位设定为OFF并输出,蜂鸣器就停止工作。

位设定为ON指的是将该位设定为1,位设定为OFF指的是将该位设定为0。把位设定为ON,只需要把想要设定为ON的位设定为1,其他位设定为0后进行OR运算即可。由于这里需要把低2位置为1,因此就是和03H进行OR运算。03H用8位二进制来表示的话是0000 0011。由于即便高6位存储着具体意义。和0进行OR运算后也不会发生变化,因而就和 03H 进行OR运算。把位设定为 OFF,只需要把想要置为OFF的位设定为0,其他位设定为1后进行AND运算即可。由于这里需要把低2位设定为0,因此就要和FCH进行AND运算。在源代码中,FCH是用0FCH来记述的。在前面加0是汇编语言的规定,表示的是以A-F这些字符开头的十六进制数的数值的意思。0FCH用8位二进制来表示的话是 1111 1100。由于即便6位存在着具体意义,和1进行AND运算后也不会产生变化,因而就是同 0FCH 进行 OR 运算。

对于上面的代码,main是C语言程序起始位置的函数。在该函数中,有两个用_asm{} 围起来的部分,它们中间有一个使用for循环的空循环

首先是蜂鸣器发声的部分,通过IN EAX,61H(助记符不区分大小写)指令,把端口61H的数据存储到CPU的EAX寄存器中。接下来,通过OR EAX,03H 指令,把EAX寄存器的低2位设定成ON。最后,通过OUT 61H,EAX 指令,把EAX寄存器的内容输出到61端口。使蜂鸣器开始发音。虽然EAX寄存器的长度是32位,不过由于蜂鸣器端口是8位,所以只需对下8位进行OR运算和AND运算就可以正常工作了。

其次是一个重复100次的空循环,主要是为了在蜂鸣器开始发音和停止发音之间稍微加上一些时间间隔。因为现在计算机器的运行速度非常快,哪怕是100万次循环,也几乎是瞬时间完成的。

然后是用来控制蜂鸣器停止发声的部分。首先,通过IN EAX,61H指令,把端口61H的数据存储到CPU的EAX寄存器中。接下来,通过AND EAX,0FCH指令,把EAX寄存器的低2位设定为OFF。最后,通过 OUT 61H,EAX 指令,把寄存器的EAX 内容输出到 61端口,使蜂鸣器停止发音。

3,外围设备的中断请求

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

从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。这种情况就类似于在处理文档的过程中有电话打进来,电话就相当于是中断处理。加入没有中断处理的发声,就必须等到文档处理完成才能够接听电话。由此可见,中断处理有着巨大的价值,就像是接听完电话后会返回原来的文档作业一样,中断程序处理完成后,也会返回到主程序中继续。

中断请求示意图:

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

假如有多个外围设备进行中断请求的话,CPU需要做出选择进行处理,为此,我们可以在I/O控制器和CPU中间加入名为中断控制器的IC来进行缓冲。中断控制器会把从多个外围设备发出的中断请求有序的传递给CPU。中断控制器的功能相当于就是缓冲。下面是中断控制器功能的示意图:

 

CPU在接受到中断请求后,会把当前正在运行的任务中断,并切换到中断处理程序。中断处理程序的第一步处理,就是把CPU所有寄存器的数值保存到内存的栈中。在中断处理程序中完成外围设备的输入和输出后,把栈中保存的数值还原到CPU寄存器中,然后再继续进行最主程序的处理。

假如CPU寄存器数值还没有还原的话,就会影响到主程序的运行,甚至还有可能会使程序意外停止或发生运行时异常。 这是因为主程序在运行过程中,会用到CPU寄存器进行处理,这时候如果突然插入其他程序的运行结果,此时CPU必然会收到影响。所以,在处理完中断请求后,各个寄存器的值必须要还原。只要寄存器的值保持不变,主程序就可以像没有发生过任何事情一样继续处理。

请求中断的处理:

 

4,用中断来实现实时处理

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

在程序的运行过程中,几乎无时无刻都会发生中断,其原因就是为了实时处理外部输入的数据,虽然程序也可以在不会中断的基础上处理外部数据,但是那种情况下,主程序就会频繁的检查外围设备是否会有数据输入。由于外围设备会有很多歌=个,因此有必要按照顺序来调查。按照顺序检查多个外围设备的状态称为轮询。对于计算机来说,这种采用轮询的方式不是很合理,如果你正在检查是否有鼠标输入,这时候发生了键盘输入该如何处理?结果必定会导致文字的实时处理效率。所以即时的中断能够提高程序的运行效率。

上面只是中断的一种好处,下面汇总一下利用中断能够带来的正面影响

1,提高计算机系统的效率。计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调他们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。

2,维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有很多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发声,由存储管理部件进行检测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。

3,满足实时处理要求。在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。

4,提供故障现场处理手段。处理机中设有这种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。

5,利用DMA实现短时间内大量数据传输

 上面我们介绍了I/O处理和中断的关系,下面我们来介绍另外一个机制,这个机制就是DMA(Direct Memory Access)。DMA是指在不通过CPU的情况下,外围设备直接和主存进行数据传输。磁盘等硬件设备都用到了DMA机制,通过DMA,大量数据可以在短时间内实现传输,之所以这么快,是因为CPU作为中介的时间被节省了,下面是DMA的传输过程。

使用DMA的外围设备和不使用DMA的外部设备:

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

6,文字和图片的显示机制

文字和图片是怎么显示的?事实上,如果用一句话来简单的概括一下该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。在程序中,只要往VRAM中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或者BIOS提供,并借助中断来进行处理。

在MS-DOS 时代,对于大部分计算机来说,VRAM 都是主内存的一部分。在现在计算机中,显卡等专用硬件中一般都配置有与主内存相对独立的VRAM和GPU(Graphics Processing Unit),也叫做图形处理器或者图形芯片。这是因为,对经常描绘图形的windows来说,数百兆的VRAM都是必需的。

VRAM中写入的数据被显示在显示器上:

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

虽然计算机领域新技术在不断涌现,但是计算机所能处理的事情,始终只是对输入的数据进行运算,并把结果输出,这一点是永远不会发生变化的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值