首页 > 编程语言 >《程序是怎样跑起来的》·第十一章 硬件控制方法

《程序是怎样跑起来的》·第十一章 硬件控制方法

时间:2023-02-19 22:35:26浏览次数:40  
标签:蜂鸣器 第十一章 程序 硬件 指令 端口 外围设备 端口号

阅读正文前,让我们先回答下面的问题来热热身吧。

  1. 在汇编语言中,是用什么指令来同外围设备进行输入输出操作的?
  2. I/O是什么的缩写?
  3. 用来识别外围设备的编号称为什么?
  4. IRQ 是什么的缩写?
  5. DMA 是什么的缩写?
  6. 用来识别具有 DMA 功能的外围设备的编号称为什么?

答案:

  1. 我N 指令和 OUT 指令
  2. 输入/输出
  3. I/O地址或 I/O 端口号
  4. 中断请求
  5. 直接内存访问
  6. DMA 通道

解析:1.在x86系列中央处理器用的汇编语言中,通过在指令来实现I/O输入,外指令来实现I/O输出。2.用来实现计算机主机和外围设备输入输出交互的集成电路称为I/O控制器或简称为I/O。3.所有连接到计算机的外围设备都会分配一个I/O地址编号。4.IRQ指的是用来执行硬件中断请求的编号。5.二甲基亚胺指的是,不经过中央处理器中介处理,外围设备直接同计算机的主内存进行数据传输。6.像磁盘这样用来处理大量数据的外围设备都具有二甲基亚胺功能。

1、应用和硬件无关?

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

不过,Windows提供了通过应用来间接控制硬件的方法。 利用操作系统提供的系统调 用功能就可以实现对硬件的控制。在Windows中,系统调用称为API(图11-1)。各API就 是应用调用的函数。这些函数的实体被存储在DLL文件中。下面让我们来看一个利用系统调用来间接控制硬件的示例。例如,假设要在窗口中显示字符串,就可以使用视窗接口中的文本输出函数一个。文本输出的语法如代码清单11-1所示。在这段代码中,确实没有能让大家意识到硬件的参数。带有"设备描述表的句柄"这一注释的参数氢氧化碳,是用来指定字符串及图形等绘制对象的识别值,表示的也不是直接硬件设备。

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

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

窗控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是在和外。这些指令也是汇编语言的助记符。在指令和外指令的语法如图11-2所示。这是奔腾等x86系列中央处理器用的在指令和外指令的语法。我N 指令通过指定端口号的端口输入数据,并将其存储在中央处理器内部的寄存器中。OUT 指令则是把中央处理器寄存器中存储的数据,输出到指定端口号的端口。

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

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

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

通过窗户的控制面板,我们可以查看外围设备所连接的I/O控制器的端口号。图11-4是通过窗户控制面板来查看软盘驱动控制器的属性时的情况B。"I/O的范围"右侧的数值就是端口号。通过指定该端口号,并利用输入/输出命令,就可以直接控制软驱这个硬件设备,实现输入输出处理了。

3 编写测试用的输入输出程序

首先让我们利用在指令和外指令,来进行一个直接控制硬件的试验。假设该试验的目的是让计算机内配置的蜂鸣器(小喇叭)发音。虽然蜂鸣器内置在计算机内部,但其本身也是外围设备的一种。因为就算是把蜂鸣器取出,对计算机主机也不会有什么影响。

由于用汇编语言编写程序比较麻烦,因此这里我们采取在C语言源代码中插入助记符的方式来实现。在大部分C语言的处理(编译器的种类)中,只要使用_asm{和}括起来,就可以在其中记述助记符。也就是说,这样就可以编写C语言和汇编语言混合的源代码。这里,我们使用微软的视觉C++一个来作成应用。

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

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

 接下来就让我们对代码清单11-2进行详细说明。main是位于C语言程序运行起始位置的函数。在该函数中,有两个用_asm和)围起来的部分,它们中间有一个使用for语法的空循环(不做任何处理的循环)。

(1)部分是控制蜂鸣器发音的部分。首先,通过IN EAX,61H(助记符不区分大小写)指令,把端口61H的数据存储到CPU的EAX寄存器中。接下来,通过OREAX,03H指令,把EAX寄存器的低2位设定成ON。最后,通过OUT61H,EAX指令,把EAX寄存器的内容输出到61号端口,使蜂鸣器开始发音。虽然EAX寄存器的长度是32位,不过由于蜂鸣器端口是8位,所以只需对下8位进行OR运算和AND运算就可以正常运行了。
(2)部分是一个重复100万次的空循环,主要是为了在蜂鸣器开始发音和停止发音之间稍微加上一些时间间隔。因为现在计算机的CPU运行速度非常快,哪怕是100万次的循环,也几乎是瞬间完成的。
(3)部分是用来控制蜂鸣器发音停止的部分。首先,通过INEAX,61H指令,把端口61H的数据存储到CPU的EAX寄存器中。接下来,通过AND EAX,0FCH指令,把EAX寄存器的低2位设定成OFF。最后,通过OUT 61H,EAX指令,把寄存器EAX的内容输出到61号端口,使蜂鸣器停止发音。大家可以把61H端口的低2位认为是蜂鸣器的开关。

4 外围设备的中断请求

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

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

5 用中断来实现实时处理

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

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

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

 

 资源是计算机具备的有限资源的统称。端口号、IRQ、DMA等可以指定的数值范围都是有限的,因此它们也是资源的一种。

 7 文字及图片的显示机制

如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。在程序中,只要往VRAM中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或BIOS提供,并借助中断来进行处理的。
在MS-DOS时代,对大部分计算机来说,VRAM都是主内存的一部分。例如PC-9801这种机型的计算机,主内存地址A0000地址以后是VRAM区域。如果用程序往VRAM内存地址中写入数据,文字及图形就可以显示出来。不过,文字和图形的颜色最多只能有16种。这是因为VRAM的内存空间太小了(图11-11(a))。
在现在的计算机中,显卡等专用硬件中一般都配置有与主内存相独立的VRAM和GPU (Graphics Processing Unit,图形处理器,也称为图形芯片)。这是因为,对经常需要描绘图形的Windows来说,数百兆的VRAM是必需的。而为了提升图形的描绘速度,有时还需要专用的图形处理器(图11-11(b))。但不管怎样,内存VRAM中存储的数据就是显示器上显示的信息,这一机制是不变的。

标签:蜂鸣器,第十一章,程序,硬件,指令,端口,外围设备,端口号
From: https://www.cnblogs.com/Chenyaxuan/p/17135807.html

相关文章

  • 《程序是怎样跑起来的》第五章
        这章讲了内存与磁盘的紧密关系,计算机采用存储程序方式,而计算机中的主要存储部件就是内存与磁盘。在磁盘中存储的程序必须要加载到内存中才能运行,在磁盘中的原始......
  • 微信小程序点击按钮绘制定制转发分享图
    1.说明先上代码片断分享链接:https://developers.weixin.qq.com/s/vl3ws9mA72GG[x]使用painter画图[x]按钮传递定制化信息效果如下:2.关键代码说明文件列表......
  • #yyds干货盘点# LeetCode程序员面试金典:峰与谷
    题目:在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5,8,4,2,3,4,6}中,{8,6}是峰,{5,2}是谷。现在给定一个......
  • 利民AK120 SE CPU散热器 - 我的硬件配置
    最近过手了一台入门的办公电脑,完整的部分,随后再跟大家分享,但是最近新试了试利民AK120SE,感觉是个亮点,所以先测测散热器。利民这一代的好多型号的散热器的散热片本身,从造型......
  • 硬件、软件和固件
    说来惭愧,浅尝辄止的习惯让我忽略了太多东西。学习的成效如何,关键要看对各个知识点的融会贯通程度。如果浅尝辄止变成了一种思维习惯,那对于学习真的是贻害无穷。比如一段......
  • 利民HR-09 2280 m.2固态散热器 - 我的硬件配置
    ......
  • 第七章程序是在何种环境中运行的
    在这一章中我了解到应用程序必须在一定的环境当中才可以运行运行环境=操作系统+硬件。同一类型的硬件可以选择安装多种操作系统。根据应用的具体情况,有时只有在特定版本的......
  • 微信小程序更新机制
    微信小程序更新机制的说明官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/update-mechanism.html更新小程序版本有三种机制:1.启动......
  • 运行python程序时显示killed
    这是由于内存不足导致,以下命令可以拓展内存:sudoswapoff/swapfilesudoddif=/dev/zeroof=/swapfilebs=1Mcount=30720oflag=appendconv=notruncsudomkswap/sw......
  • 61-CICD持续集成工具-Jenkins自动化部署JAVA程序
    BlueOcean插件实现可视化注意:安装完插件,需要重启Jenkins才能生效参数化构建执行命令脚本[root@jenkinsscript]#catwheel-deploy-rollback.sh#!/bin/bash##*********......