语言如何与硬件对话?

时间:2013-09-17 12:18:17

标签: c++ assembly hardware

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

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

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

4 个答案:

答案 0 :(得分:6)

  

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

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

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

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

答案 1 :(得分:2)

关于这个主题有完整的书籍。但简单地说:

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

答案 2 :(得分:2)

你应该阅读Tracy Kidder撰写的The soul of new machine。这是一个1981年的普利策尔价格,并且用很长的时间来解释一个计算机如何工作以及人类必须如何思考创造它的外行。此外,这是一个真实的故事,是为数不多的传达硬件和软件的快感之一。 总而言之,这是一个很好的介绍。

答案 3 :(得分:1)

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

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