计算机基础- -应用和硬件的关系

计算机基础- -应用和硬件的关系

一、应用和硬件的关系

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

虽然程序员没法直接控制硬件, 并且Windows屏蔽了控制硬件的细节, 但是Windows却为你开放了系统调用功能来实现对硬件的控制。

  • 在Windows中, 系统调用称为API, API就是应用调用的函数,这些函数的实体被存放在 DLL 文件中
    在这里插入图片描述

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

假如要在窗口中显示字符串, 就可以使用Windows API中的Text Out函数;Text Out函数的语法(C语言)如下:
在这里插入图片描述

  • 那么, 在处理Text Out函数的内容时, Windows做了些什么呢?
  • 从结果来看, Windows直接控制了作为硬件的显示器。但Windows本身也是软件, 由此可见, Windows应该向CPU传递了某种指令, 从而通过软件控制了硬件。
  • Windows提供的Text Out函数API可以向窗口和打印机输出字符。
  • C语言提供的printf函数,是用来在命令提示符中显示字符串的函数。使用printf函数是无法向打印机输出字符的。

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

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

可以通过IN和OUT指令来实现对数据的读入和输出, 如下图所示:
在这里插入图片描述

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

那么这个端口号和端口是什么呢?你感觉它像不像港口一样?通过标注哪个港口然后进行货物的运送和运出?

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

  • 还记得计算机组成原理中计算机的五大组成部分吗,再来回顾一下:运算器、控制器、存储器、输入设 备和输出设备
  • 那么问题来了,IO设备如何实现输入和输出的呢?计算机主机中,附带了用来连接显示器以及键盘等外 围设备的连接器。
  • 而连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的IC,这些IC统称为 IO控制器。
  • lO是Input/Output的缩写。显示器、键盘等外围设备都有各自专用的I/O控制器I/O控制器中有用于临时保存输入输出数据的内存。这个内存就是端口(port) 。端口你就可以把它理解为我们上述说 的港口。
  • IO控制器内部的内存,也被称为寄存器,不要慌,这个寄存器和内存中的寄存器不一样。
  • CPU内存的寄存器是用于进行数据运算处理的, 而IO中的寄存器是用于临时存储数据的
  • 在I/O设备内部的IC中,有多个端口。由于计算机中连接着很多外围设备,因此也就有很多I/O控制器。当然也会有多个端口,一个I/O控制器可以控制多个设备,不仅仅只能控制一个。各端口之间通过 端口号 进行区分。
  • 端口号也被称为I/O地址。IN指令和OUT指令在端口号指定的端口和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为二进制来表示的话是00000011。由于即便高6位存在着具 体意义。和0进行OR运算后也不会发生变化,因而就和03H进行OR运算。

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

在这里插入图片描述

  • 我们对上面的代码进行说明, main是C语言程序起始位置的函数。在该函数中, 有两个用_asm{}围起来的部分, 它们中间有一个使用for循环的空循环
  • 首先是 蜂鸣器发声 的部分, 通过IN EAX, 61H(助记符不区分大小写) 指令, 把端口61H的数据存储到CPU的EAX寄存器中。
  • 接下来, 通过OR EAX, 03H指令, 把EAX寄存器的低2位设定成ON。
  • 最后, 通过OUT61H, EAX指令, 把EAX寄存器的内容输出到61端口。使蜂鸣器开始发音。
  • 虽然EAX寄存器的长度是32位, 不过由于蜂鸣器端口是8位, 所以只需对下8位进行OR运算和AND运算就可以正常工作了。
  • 其次是一个重复100次的空循环,主要是为了在蜂鸣器开始发音和停止发音之间稍微加上一些时间间隔。因为现在计算机器的运行速度非常快,哪怕是100万次循环,也几乎是瞬时间完成的。
  • 然后是用来控制器 蜂鸣器停止发声 的部分。首先, 通过IN EAX, 61H指令, 把端口61H的数据存储到CPU的EAX寄存器中。
  • 接下来, 通过AND EAX, OF CH指令, 把EAX寄存器的低2位设定为OFF。
  • 最后, 通过OUT61H, EAX指令, 把寄存器的EAX内容输出到61号端口, 使蜂鸣器停止发音。

3.外围设备的中断请求

  • IRQ(Interrupt Request) 代表的就是中断请求。IRQ用来暂停当前正在运行的程序, 并跳转到其他程序运行的必要机制。该机制被称为处理中断。
  • 中断处理在硬件控制中担当着重要的角色。因为如果没有中断处理,就有可能无法顺畅进行处理的情况。
  • 从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。
  • 这种情况就类似于在处理文档的过程中有电话打进来,电话就相当于是中断处理。
  • 假如没有中断处 理的发生,就必须等到文档处理完成后才能够接听电话。
  • 由此可见,中断处理有着巨大的价值,就像是接听完电话后会返回原来的文档作业一样,中断程序处理完成后,也会返回到主程序中继续。

在这里插入图片描述

  • 实施中断请求的是连接外围设备的I/O控制器, 负责实施中断处理的是CPU, 外围设备的中断请求会 使用不同于I/O端口的其他编号,该编号称为中断编号。

  • 在控制面板中查看软盘驱动器的属性时, IRQ处现实的数值是06,表示的就是用06号来识别软盘驱动器发出的请求。还有就是操作系统以及BIOS则会提供响应中断编号的中断处理程序。

BIOS(Basic Input Output System) :位于计算机主板或者扩张卡上内置的ROM中, 里面记录了用来控制外围设备的程序和数据。

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

下面是中断控制器功能的示意图:

在这里插入图片描述

  • CPU在接受到中断请求后, 会把当前正在运行的任务中断, 并切换到中断处理程序。
  • 中断处理程序的第一步处理, 就是把CPU所有寄存器的数值保存到内存的栈中。在中断处理程序中完成外围设备的输入和输出后, 把栈中保存的数值还原到CPU寄存器中, 然后再继续进行对主程序的处理。
  • 假如CPU寄存器数值还没有还原的话, 就会影响到主程序的运行, 甚至还有可能会使程序意外停止或发生运行时异常。
  • 这是因为主程序在运行过程中, 会用到CPU寄存器进行处理, 这时候如果突然插入其他程序的运行结果, 此时CPU必然会受到影响。
  • 所以, 在处理完中断请求后, 各个寄存器的值必须要还原。只要寄存器的值保持不变,主程序就可以像没有发生过任何事情一样继续处理。
    在这里插入图片描述

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

  • 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
  • 在程序的运行过程中,几乎无时无刻都会发生中断,其原因就是为了实时处理外部输入的数据,虽然程序也可以在不会中断的基础上处理外部数据,但是那种情况下,主程序就会频繁的检查外围设备是否会 有数据输入。
  • 由于外围设备会有很多个,因此有必要按照顺序来调查。按照顺序检查多个外围设备的状态称为轮询
  • 对于计算机来说,这种采用轮询的方式不是很合理,如果你正在检查是否有鼠标输入,这时候发生了键盘输入该如何处理呢?结果必定会导致文字的实时处理效率。所以即时的中断能够提高程序的运行效率。

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

  • 提高计算机系统效率。计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。
  • 维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施
  • 满足实时处理要求。在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理
  • 提供故障现场处理手段。处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。

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

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

下面是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) , 也叫做图 形处理器或者图形芯片

在这里插入图片描述

  • 用软件来控制硬件听起来好像很难,但实际上只是利用输入输出指令同外围设备进行输入输出而已。中断处理是根据需要来使用的功能选项。DMA则直接交给对应的外围设备即可。
  • 虽然计算机领域新技术在不断涌现,但是计算机所能处理的事情,始终只是对输入的数据进行运算,并把结果输出,这一点是永远不会发生变化的。

猜你喜欢

转载自blog.csdn.net/wolfGuiDao/article/details/107677068
今日推荐