7

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

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

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

4

4 回答 4

6

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

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

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

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

于 2013-09-17T12:24:40.027 回答
2

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

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

您应该阅读Tracy Kidder的《新机器之魂》 。这是 1981 年 Pullitzer 的价格,它用外行人的语言详细解释了计算机的工作原理以及人类必须如何思考才能创造它。此外,这是一个真实的故事,也是为数不多的能够传达硬件和软件刺激的故事之一。总而言之,很好地介绍了这个主题。

于 2013-09-17T12:31:26.403 回答
1

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

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

于 2013-09-17T13:31:52.757 回答