程序员需要了解的硬核知识之控制硬件(一)

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

应用和硬件的关系

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

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

15.png

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

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

BOOL TextOut{
  HDC hdc,          // 设备描述表的句柄
  int nXStart,          // 显示字符串的 x 坐标
  int nYStart,                // 显示字符串的 y 坐标
  LPCTSTR lpString,     // 指向字符串的指针
  int cbString          // 字符串的文字数
}

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

Windows 提供的 TextOut 函数 API 可以向窗口和打印机输出字符。C 语言提供的 printf 函数,是用来在命令提示符中显示字符串的函数。使用 printf 函数是无法向打印机输出字符的。

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

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

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

16.jpg


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

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

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

还记得计算机组成原理中计算机的五大组成部分吗,再来回顾一下:运算器、控制器、存储器、输入设备和输出设备我们今天不谈前三个,就说说后面两个输入设备和输出设备,这两个与我们本节主题息息相关。

那么问题来了,IO设备如何实现输入和输出的呢?计算机主机中,附带了用来连接显示器以及键盘等外围设备的连接器而连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的 IC。如果 IC 你不明白是什么的话,可以参考作者的文章 程序员需要了解的硬核知识之内存 进行了解。这些 IC 统称为 IO 控制器

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

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

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

17.jpg


相关文章
|
6月前
|
安全 芯片
关于做硬件的一些经验
关于做硬件的一些经验
45 2
|
6月前
|
算法 搜索推荐 开发工具
探索代码的奥秘:技术感悟与实践探索操作系统的心脏:内核
【5月更文挑战第31天】在数字世界的编织中,每一行代码都承载着创造者的智慧和汗水。本文将带你深入编程的核心,揭示那些隐藏在日常开发实践中的技术真谛。从算法的精妙到系统的架构,我们将一同探讨如何通过技术提升效率,解决问题,并在这个过程中获得个人成长。 【5月更文挑战第31天】本文深入剖析了操作系统的核心组件——内核,探讨了其设计哲学、功能职责以及在现代计算环境中的重要性。通过分析内核的工作原理和它如何与硬件、软件交互,我们将揭示这个隐藏在用户界面背后的力量之源。
|
3月前
|
算法 程序员 C语言
【深度揭秘】汇编语言:现代编程中不可或缺的秘密武器!它如何在幕后操控一切?
【8月更文挑战第31天】随着计算机科学的进步,尽管高级编程语言因易读和可维护而流行,汇编语言在特定领域仍不可或缺。本文介绍汇编语言基础及其在现代编程中的应用。汇编语言通过助记符表示机器码,便于编写和理解。例如,在x86架构下,加法指令可表示为 `add eax, ebx`。尽管高级语言提供更高抽象,但在优化性能瓶颈(如矩阵乘法)和嵌入式系统中精确控制硬件方面,汇编语言依然发挥重要作用。例如,通过AVX-2指令集优化矩阵乘法,或在实时系统中实现精确时间延迟。这些示例展示了汇编语言在现代编程中的独特价值。
60 3
|
5月前
|
传感器 NoSQL 物联网
嵌入式开发系统学习——干货分享(一)
嵌入式开发系统学习——干货分享(一)
130 0
|
JavaScript 芯片
聊聊身边的嵌入式,2年质保期刚过就翘辫子,这是什么骚设计?
聊聊身边的嵌入式,2年质保期刚过就翘辫子,这是什么骚设计?
|
6月前
|
存储 人工智能 缓存
计算机架构:漫游CPU的奥秘世界(一)
计算机架构:漫游CPU的奥秘世界
146 0
|
6月前
|
存储 人工智能 并行计算
计算机架构:漫游CPU的奥秘世界(二)
计算机架构:漫游CPU的奥秘世界
158 0
|
11月前
|
程序员 Linux
不愧是华为内部的“操作系统学习笔记”,一篇说细节,一篇讲哲学
当然重要,身为程序员的我们,那更应该深刻理解和掌握操作系统,虽然我们日常 CURD 的工作中,即使不熟悉它们,也不妨碍我们写代码,但是当出现问题时,没有这些基础知识,你是无厘头的,根本没有思路下手,这时候和别人差距就显现出来了,可以说是程序员之间的分水岭。
|
异构计算
FPGA硬件工程师Verilog面试题(基础篇一)
FPGA硬件工程师Verilog面试题(基础篇一)
294 0
FPGA硬件工程师Verilog面试题(基础篇一)
|
芯片 异构计算
FPGA硬件工程师Verilog面试题(基础篇二)
FPGA硬件工程师Verilog面试题(基础篇二)
436 1
FPGA硬件工程师Verilog面试题(基础篇二)