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

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

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

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

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

我对吗?

非常感谢。

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

首先看看硬件和它做什么。 以鼠标为例,它试图传递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的经验。