语言如何与硬件通信

How does a language talk to hardware?

本文关键字:硬件 通信 语言      更新时间:2023-10-16

好的,所以我非常非常困惑一个硬件如何理解代码。我在某处读到它与电压有关,但是硬件究竟如何知道软件中的指令的含义?我知道驱动程序是软件和硬件之间的桥梁,但驱动程序仍然是软件:S。

例如,在C++我们有指针,它们可以指向内存中的某个地址。我们是否可以有一个指向某个硬件地址的指针,然后写入该地址,这会影响硬件?还是硬件没有地址?

我想我真正要问的是操作系统或BIOS如何知道硬件在哪里以及如何与之通信?

例如,在C++我们有指针,它们可以指向一些 内存中的地址..我们可以有一个指向某些硬件的指针吗 地址,然后写入该地址,这将影响 硬件?还是硬件没有地址?

有些

硬件有像指针这样的地址,有些没有(在这种情况下,它很可能使用称为 I/O 端口的东西,这需要特殊的 IN 和 OUT 指令,而不是常规的内存操作)。但是大多数现代硬件在某处都有一个内存地址,如果你将正确的值写入正确的地址,硬件将执行你要求它做的事情。这与真正简单的方法不同 - 比如说一个串行端口,您将一个字节写入"输出寄存器",该字节沿串行线发送,另一个地址保存串行端口上接收的输入数据,到具有自己的机器语言并且可以运行数百或数千个线程的图形卡。

通常,操作系统有责任通过驱动程序访问硬件。

这是非常简化的,编程,操作系统和硬件的整个主题足以写一本相当厚的书(这只是一般而言,如果你想真正了解特定的硬件,串行端口很容易几十页,图形芯片很容易成百上千页)。

有关于这个主题的整本书。但简而言之:

  • SW 以多种方式与硬件通信。给定的硬件可以响应写入非常特定地址的值("内存映射")或通过 I/O 端口和 CPU 支持的指令(例如,x86 指令inout指令)。当访问存储器映射端口(地址)时,硬件设计为识别特定地址或小范围的地址,并将信号路由到外围硬件,而不是在这种情况下的存储器。或者在 I/O 指令的情况下,CPU 有一组专门用于此目的的单独信号。
  • 操作系统(最低级别 - 板级支持包)和 BIOS 内置了有关执行各种可用硬件功能所需的硬件地址和/或 I/O 端口的"知识"。也就是说,在某种程度上,他们已经准确地编码了不同功能所需的地址。

你应该读一读特雷西·基德(Tracy Kidder)的《新机器的灵魂》(The Soul of New machine)。这是1981年的Pullitzer价格,它用通俗的语言解释了计算机是如何工作的,以及人类必须如何思考才能创造它。此外,这是一个真实的故事,也是为数不多的传达硬件和软件快感的故事之一。总而言之,对这个主题的一个很好的介绍。

硬件工程师知道内存和外设位于处理器地址空间中的位置。 因此,这是众所周知的,因为这些地址是由某人选择并记录下来的,以便其他人可以编写驱动程序。

处理器不知道内存中的外围设备。 指令只是使用最终由编写处理器正在运行的软件的程序员确定的地址。 因此,正确地暗示外设和ram(和rom)都只是地址。 如果您正在编写视频驱动程序并更改屏幕分辨率,则需要写入一些地址。 在处理器内核和外围设备(视频卡)之间的某个点,会有硬件检查地址并将其路由到正确的位置。 这就是硬件的设计方式,它检查地址,一些地址范围是 ram 并发送到要处理的内存,有些是外围设备并发送到那里进行处理。 有时内存范围是自己可编程的,以便您可以出于任何原因组织内存空间。 就像你从现在住的地方搬到其他地方一样,新房子里仍然是你和你的东西,但它有一个不同的地址,投递邮件的邮政人员知道如何找到你的新地址。 然后是MMU增加了一层保护和其他功能。 MMU(内存管理单元)还可以虚拟化地址,因此处理器可以编程为写入地址0x100000但 mmu 在正常总线上发出之前将其转换为0x2300000,以便作为内存或外设最终找到目的地进行分类。 你为什么要做这样的事情,嗯,有两个主要原因。 一种是,例如,当您编译应用程序以在操作系统中运行时,该操作系统的所有程序都可以编译为在同一地址上运行,例如地址0x8000。 但是只有一个物理地址0x8000(让我们假设)发生的事情是操作系统为您的程序配置了 mmu,以便您的程序在该地址运行,操作系统也可以,如果它选择并且 mmu 具有该功能,可以添加保护,以便如果您的程序尝试访问其分配的内存空间之外的内容,则会发生错误并且您的程序是阻止这样做。 防止入侵或破坏其他程序内存空间。 同样,如果操作系统支持,它也可以选择使用该错误将一些数据从 ram 换到磁盘,然后给你更多的 ram,虚拟内存,让程序认为内存比实际更多。 mmu 不是完成所有这些操作的唯一方法,但它是流行的方法。 因此,当您在某个操作系统上运行C++该指针时,很可能这是一个虚拟地址而不是物理地址,mmu 会将已提供给程序的地址转换为实际内存地址。 当操作系统选择将你的程序切换到另一个程序时,相对容易告诉 mmu 让另一个任务认为0x8000编号较低的地址空间现在属于另一个程序。 并且您的程序会进入睡眠状态(未执行)一段时间。