【问题标题】:How is the I/O Address Space mapped to devices?I/O 地址空间如何映射到设备?
【发布时间】:2012-03-02 14:18:08
【问题描述】:

我希望这个问题的措辞足够好,让人们能够理解。

我了解主存储器 (RAM) 和端口 I/O 驱动的 I/O,它有自己的地址空间供 IN、OUT 等指令使用。

如果要编写实模式汇编程序,开发人员是否需要提供必要的文档来显示主板上特定插槽的地址范围?假设 PCIe 插槽是地址 X,打印机 Y。

地址是否为标准地址范围,具体取决于总线类型?

我可以阅读什么来更好地理解这一点?希望有人可以提供帮助。谢谢。

~编辑

指 PC 系统。

【问题讨论】:

  • 您有什么特别的平台吗?
  • 与软件只需要支持固定配置的嵌入式 PC 相比,商用 PC 的答案完全不同。你需要缩小你的问题范围。
  • 对不起。我指的是个人电脑。

标签: assembly architecture io cpu memory-address


【解决方案1】:

在 x86 pc 上,BIOS 通常管理平面/物理地址空间的分配,并且所有内容都使用该空间中的某个位置。因此,BIOS 将通过在每个 pcie 插槽上输出来“枚举”pcie 设备,以查看是否有人在那里。 pcie 设备必须具有标准配置寄存器,其中一些指示地址空间的大小和类型(基于 I/O 或内存映射)。 BIOS 试图让每个人都开心并给他们想要的东西。 Windows 或 linux 不会重新映射这些设备或地址,它们会采用 bios 给它们的东西。并非每个 pcie 系统都这样工作,但不幸的是 PC 就是这样工作的。

因此,如果您想深入了解具体细节,请购买这本书 http://www.mindshare.com/shop/?c=b&section=0A6B150A 如果你谷歌“pci系统架构”,我认为有一个下载链接

如果您运行 linux,然后找到 lspci 的源代码,您可以拆分一些库和示例并自己创建以检查系统中的设备以及它们的基地址和内存范围。很可能您只想做其他操作系统所做的事情并读取 pcie 主机控制器以查看已分配的内容,并将该信息提供给在该系统上运行的软件。您可能会启动一次,打印机获得地址 0xE0000000,下一次获得地址 0xDB000000,为您的环境提供一种机制来提供这些地址,或者将这些地址抽象到您的环境地址空间中的某个固定地址,并让您的代码管理到物理的转换/设备的真实地址。

我假设您使用术语“实模式”是在谈论 x86 系统的某种风格,那可能是某种风格的 PC。也许是一个mac。不确定mac是如何做到的,对他们的枚举了解不够。硬件可能仍然是一个带有南北桥的英特尔处理器,后跟多个 pcie 桥或其他英特尔 pcie 芯片,最终形成许多焊接到板上(视频芯片等)或 pcie 插槽的 pcie 设备用于插卡。如果您运行 linux 并使用 lspci 并查看供应商和部件号,您可以在 intel 网站上找到大多数 intel(供应商 ID 8086)设备的手册/数据表,您可以使用 lspci 及其兄弟程序来检查控件和那些 pcie 控制器中的状态寄存器,同样,如果您有兴趣深入研究,我不确定您的真正兴趣是什么。

地址不是标准的,也不是固定的,每个 BIOS 都是针对该主板型号半定制的,pcie 空间的地址范围通常是整个处理器空间的一个 gig 或更少,但是该窗口会随着移动到 64 位并需要更多空间(缓慢移动)。该 pcie 窗口的位置取决于硬件(请参阅我提到的各种英特尔设备的数据表,或者通过或 nvidia 或任何人,如果它是一个 amd 系统),如果 bios 配置为在 32 位模式下运行该 pcie 窗口对于所有 pcie 设备,可能介于 2 gig 之间,但当然低于 4 gig 标记,但这并不意味着所有这些系统都使用 3 gig 标记。对于 64 位,我认为它们也往往接近顶部,但从主板到主板它会发生变化。然后在枚举总线时,它既是特定于主板的,也是特定于个人计算机的,有些设备被螺栓/焊接到主板上,并且每次都以相同的顺序进行枚举,但是插入插槽的卡必须响应主机,有时会根据谁先回答进行枚举,您可能会启动 20 次并看到相同的布局,再启动一次,两张卡可能会交换位置,因为它们被枚举的顺序发生了变化。因此,即使您的视频卡看起来总是在同一个地方,也不要在任何地方对该号码进行硬编码,始终扫描 pcie 总线或桌子或拨打图书馆电话以找出在哪里。一旦您找到某些东西,它可能不会移动,直到您重新启动并重试,这样您就不必在每次想要访问它时继续重新扫描以查找某些东西的位置。

是的,如果您升级或降级您的 bios,bios 只是软件,有时 bios 更改与 pcie 枚举有关(并不少见,比如说流行的视频卡在他们放入 mod 的主板上无法正常工作BIOS 软件来更改重置或其他任何东西以使该卡有更好的工作机会),这可能会更改整个系统的枚举。

【讨论】:

  • 谢谢!这对我们有很大帮助。
  • 这个答案很好,但它没有包含一个关键细节:BIOS 究竟如何将 I/O 端口映射传递给 CPU?
【解决方案2】:

如果要写一个实模式汇编程序

ISR 是您可能追求的目标 (中断服务程序)。
;

这是存储在第一段内存中的中断处理程序地址列表。 (段 0000)。每个中断号都有一个 4 字节的处理程序地址、段和偏移量,以 调用该中断时程序将分支。

可以通过将中断号乘以 4 来找到地址,即存储处理程序地址的偏移量。

ISR 的位置可以定义为 0000:ax*4,DOS 中断的通用编号为 21h。所以只需用那个(或 al)加载 ax

这里有一个 DOS 中断列表...它相当大...

http://www.ctyme.com/intr/int-21.htm

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2012-03-25
    • 2017-11-18
    • 2019-02-19
    • 1970-01-01
    • 2023-03-03
    • 2016-05-27
    • 2017-05-17
    相关资源
    最近更新 更多