当我们将一块硬件插入计算机系统时会发生什么?

当我们将一块硬件插入计算机系统时,比方说一个网卡(网卡)或一个声卡,机箱底下会发生什么事情,以便我们使用那块硬件?

我可以想到以下两种情况,纠正我,如果我错了。

  • 如果硬件有自己的内存芯片, 有人会安排一系列地址空间来映射这些内存芯片。

  • 如果硬件没有自己的存储芯片, 有人会在计算机系统的主存储器中分配一定范围的地址来容纳该硬件。

我不确定前面提到的操作系统还是CPU。

还有一个问题:硬件总是需要一些内存来工作吗?

我对吗?

非常感谢。

Solutions Collecting From Web of "当我们将一块硬件插入计算机系统时会发生什么?"

这个世界并不那么容易定义。

首先看看硬件和它做什么。 以鼠标为例,它试图传递x和y坐标变化和按钮状态,可以少至几个字节,甚至一个字节两位定义了其他6个意思是什么,更新x,更新y,更新按钮,那种事情。 内存要求足以容纳这些字节。 拿串行鼠标来说,串口中已经有至少一个字节的存储空间了,那么你还需要什么? usb,另一个只是来回地说usb的故事需要记忆的信息,但是这个记忆可以在usb逻辑中,所以你需要更多的这样的小信息。

NIC和声卡是另一类,更有趣。 对于nics,你有数据包来往,你需要一些缓冲区空间,环,fifo等,以允许多个数据包在两个方向上飞行效率和中断等待时间等。 你也需要寄存器,这些寄存器在硬件/逻辑本身存储,不需要主存。 在声卡的情况下和在nic的情况下,你都可以在硬件板上有内存,或者使用它可以直接访问的系统内存(dma等)。 声卡是相似但不同的,你可以把数据包看作是固定大小和连续的。 基本上你需要以一定的速度向卡中或从卡中缓冲乒乓缓冲区,44100khz每个采样立体声的16位是44100 * 2 * 2 = 176400字节每秒,例如,驱动器/软件正在准备下一个8192字节当硬件正在播放的时候,乒乓缓冲区软件正在填充乒乓缓冲区,当硬件消耗乒乓缓冲区时,它会向软件指出这一点,开始排空乒乓缓冲区,软件将填充乒缓冲区。

所有有趣的东西,但要达到的重点。 使用nic或声卡,您可以只有两个寄存器,一个地址/命令寄存器和一个数据寄存器。 相当痛苦,但往往在限制系统中使用,仍然使用。 或者你可以走到另一个极端,希望将设备上的所有内存映射到系统内存的地址空间,以及每个寄存器都有自己独特的地址。 随着音频,你不需要随机访问内存,所以你不需要真的需要这个,你做的图形,你可以争论的网卡,你离开数据包的NIC或你在系统内存中复制,你可以有一个很多更大的软件缓冲区/环释放硬件有限的缓冲区/环。 如果在网上,那么你会想要随机访问,如果不是,那么你不会。

对于x86系统上的isa / pci / pcie等,硬件通常直接映射到处理器内存空间。 因此,对于32位系统,您最多可以处理4GB的内存,即使您拥有4GB的内存,但由于视频卡,硬件寄存器,PCI等消耗了一些地址空间(寄存器或内存或无论是硬件设计使用)。 尽管可能出现这样的情况,但这也是为什么x86系统上的I / O映射I / O和内存映射I / O之间存在一种距离的原因,如果您愿意的话,也可以使用另一个地址位。 你可以把所有的寄存器都放在I / O空间中,不会丢失内存空间,并且将内存映射成很好的整齐对齐的块,这就要求你的内存很少被硬件所取代。 无论如何,isa基本上都有供应商特定的映射到isa总线可用的内存空间的方式,跳线,带有可编程地址解码器的有趣的检测方案等.PCI及其后继者提出了更标准的东西。 当计算机启动时(现在一般说x86机器),BIOS在pcie总线上熄灭,通过在已知位置通过配置每个卡映射的空间来查看谁在那里。 使用已知的协议,卡片指示他们需要的期望的存储量,然后BIOS分配出每个设备的存储器的处理器块的平坦存储器空间,并且告知设备什么地址以及分配了多少。 操作系统肯定有可能重新做或覆盖这个,但通常BIOS会为系统做这个发现,而操作系统只是读取包含厂商ID和设备ID的每个设备上的配置空间,然后知道如何和在哪里与设备交谈。 对于这个内存空间,我相信硬件包含内存/寄存器。 对于一般的系统内存到DMA来说,我相信操作系统和设备驱动程序必须提供分配该系统内存的机制,然后告诉硬件dma的地址是从哪里来的。

用x86处理丑陋的细节和系统内存地址空间和pci地址空间是相同的地址空间的x86方式有其优缺点。 一个职业是硬件可以很容易地出入系统内存,因为它不必知道如何从pcie地址空间到系统地址空间。 否定的情况是32位系统,其中pcie通常消耗高达1GB的地址空间,并且您为该洞购买的dram不可用。 从32位到64位的转换是缓慢且痛苦的,即使芯片组具有64位模式,bios和pcie芯片仍然限制为较低的4gig,并且对于所有pcie设备限制为1gb,并且这是64位处理器和超过4GB的内存。 mmu允许零碎的内存,这不是一个问题。 芯片组和生物体正慢慢地迎头赶上,但这需要时间。

USB。 这些串行主要是主/从协议。 就像一个串口一样,但是更大,更快,更复杂,就像串口一样,主从硬件都需要内存来存储消息,非常像一个网卡。 就像一个网卡,理论上你可以注册为基础,并顺序拉存储器或将其映射到系统内存,并随机访问它等等。想想这样,USB接口可以坐在pcie上即使在主板上也是如此。 许多设备都是主板上的pcie设备,即使它们不是具有卡的实际pcie连接器。 他们陷入了如何设计你的界面或谁拥有什么内存的地方。

一些像显卡这样的设备在内存上有很多内存,比实际情况要多,或者至少让所有的内存空间一次就能映射到内存空间。 而这些想要使用滑动窗口类型的安排。 在视频卡地址空间告诉视频卡你想看地址0x0000,但是你的窗口在系统/ pcie空间中可能只有0x1000字节(例如)。 当你想在视频存储器空间看地址0x1000到0x1FFF时,你需要写一些寄存器来移动窗口,然后相同的内存空间访问视频卡上的不同存储器。

x86是占主导地位的架构有这个重叠的pcie和系统内存寻址的东西,但这不是整个世界的工作原理。 其他解决方案包括具有独立系统和pcie地址空间,滑动窗口,如上面的视频卡问题,让你有一个2GB的视频卡映射平面pcie空间,但限制窗口pcie空间东西不痛苦的主机系统。

硬件设计与软件设计一样多样化。 拿100名软件工程师,并给他们一个规范,你可能会得到多达100个不同的解决方案。 与硬件相同,给他们一个规范,你可能会得到100个不同的pcie设计。 一些标准是为了限制和/或克隆你想制作一个声卡兼容的卡,你不要改变接口,但是考虑到自由软件有硬件可以和将会变化,以及类型的数量设备(声音,硬盘控制器,视频,USB,网络等),你会得到许多不同的寄存器和可寻址内存的混合。

对不起,很抱歉,希望这有助于。 如果可以访问设备驱动程序和程序员参考手册,我将通过linux和/或bsd源代码进行挖掘,了解不同的硬件设计如何使用寄存器和内存空间,并查看哪些设计对软件人员是痛苦的,以及设计什么是优雅,做得好。

答案取决于硬件的接口是通过USB还是PCI-Express? (也可能有其他连接方法 – USB和PCI-Express是最常见的)

  • 使用USB
    主机通过读取描述符来学习新到的设备,并加载适当的设备驱动程序。 该设备将呈现用于即插即用的其ID。 设备也由主机分配一个地址。 一旦设备驱动程序启动,它将配置设备并使其可以进行数据传输。 使用IRP完成数据传输,传输技术以及IRP如何加载取决于传输是等时数据还是批量传输或其他模式。

所以要回答你的第二个问题 – 是的硬件需要一些内存工作。 驱动程序和USB主机控制器驱动程序一起为USB设备设置主机上的内存 – USB设备驱动程序则相应地通信/驱动设备。

  • 用PCI-Express

这是相似的 – 抱歉,我没有与PCI-Express的经验。