首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语言如何与硬件对话?

语言如何与硬件对话?
EN

Stack Overflow用户
提问于 2013-09-17 12:18:17
回答 3查看 5.5K关注 0票数 7

好吧,所以我很困惑一个硬件怎么能理解代码。我在某个地方读到,它与电压有关,但是硬件到底是如何知道软件指令的含义的呢?我知道驱动程序是软件和硬件之间的桥梁,但驱动程序仍然是软件:S。

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

我想我真正想问的是,操作系统或BIOS如何知道一块硬件在哪里,以及如何与其对话?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-17 12:24:40

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

有些硬件有指针之类的地址,有些则没有(在这种情况下,它很可能使用所谓的I/O端口,这需要特殊的输入和输出指令,而不是常规的内存操作)。但是很多现代硬件都有一个内存地址,如果您将正确的值写入正确的地址,硬件将按您的要求执行。这包括非常简单的方法--比如将一个字节写入“输出寄存器”的串行端口,该字节沿着串行行发送,另一个地址保存在串口上接收的输入数据,再到具有自己的机器语言并可以运行数百个或数千个线程的显卡。

正常情况下,通过驱动程序访问硬件是操作系统的责任。

这是非常简单的,而且编程、操作系统和硬件的整个主题已经足够写一本相当厚的书了(一般来说,如果你想真正了解特定的硬件,那么串行端口很容易就会有几十个页面,而图形芯片只需要几百或数千页)。

票数 6
EN

Stack Overflow用户

发布于 2013-09-17 12:24:46

关于这个题目有整本书。但简单地说:

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

Stack Overflow用户

发布于 2013-09-17 13:31:52

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18849655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档