当前位置: 首页 > news >正文

硬件控制方法

目录

    • 应用和硬件
    • 支撑硬件输入输出的IN 指令和OUT 指令
    • 外围设备的中断请求
    • 用中断来实现实时处理
    • DMA 可以实现短时间内传送大量数据
    • 文字及图片的显示机制

应用和硬件

在用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 则直接交给对应的外围设备即可。由此可见,对程序员来说,其实并不困难。

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

在这里插入图片描述

相关文章:

  • 【单细胞高级绘图】08.细胞通讯_两组比较_气泡图
  • java计算机毕业设计基于安卓Android/微信小程序的校园报修管理APP
  • Mysql 的安装
  • 8.【外部排序】基本概念和方法 + 优化:【败者树】{减少关键字对比次数}、【置换-选择 排序】{减少初始归并段数量}、【最佳归并树】{谁先合并更快}
  • Python装饰器通俗理解
  • 1516. 移动 N 叉树的子树 DFS
  • 【计算机图形学】高级外观建模
  • 阿里云dataworks中业务流程中问题(odps2)
  • 数据库基础小练习
  • java计算机毕业设计基于安卓Android/微信小程序的汽车租赁小程序-app
  • 学习-Java类和对象之访问限制
  • MATLAB2016笔记(十一):基本粒子群优化算法(PSO)的MATLAB实现
  • MyBatisPlus总结
  • 14天刷爆LeetCode算法学习计划——Day02双指针(2)
  • 《数据结构》时间复杂度
  • JavaScript实现分页效果
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Promise面试题2实现异步串行执行
  • PV统计优化设计
  • Python十分钟制作属于你自己的个性logo
  • Web设计流程优化:网页效果图设计新思路
  • 阿里云前端周刊 - 第 26 期
  • 分布式熔断降级平台aegis
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 悄悄地说一个bug
  • 如何进阶一名有竞争力的程序员?
  • 微信支付JSAPI,实测!终极方案
  • 一份游戏开发学习路线
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # include “ “ 和 # include < >两者的区别
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1)(1.13) SiK无线电高级配置(五)
  • (4.10~4.16)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Linq学习笔记
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)从 Java 代码到 Java 堆
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **PHP分步表单提交思路(分页表单提交)
  • ./configure,make,make install的作用
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .sh 的运行
  • @31省区市高考时间表来了,祝考试成功
  • @Autowired多个相同类型bean装配问题
  • [.net]官方水晶报表的使用以演示下载
  • []指针
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [Android]Tool-Systrace
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++提高编程](三):STL初识