RJS*_*h92 6 bios memory pci computer-architecture
快速提问,我正在阅读有关 PCI 的 OSDev Wiki 页面,它说:
基地址寄存器(或 BAR)可用于保存设备使用的内存地址或端口地址的偏移量。通常,内存地址 BAR 需要位于物理内存中,而 I/O 空间 BAR 可以驻留在任何内存地址(甚至超出物理内存)。
我不明白它说的地方memory address BARs need to be located in physical ram
。MMIO 的全部意义在于它被分配了一个内存地址,以便它将被路由到设备而不是物理 RAM。它需要位于物理 RAM 中是什么意思?
不管安装了多少物理内存,它不会只是一个介于 3GB - 4GB 地址空间之间的地址吗?
这是 OSDev 站点上的错误还是我误解了?
链接 -大约一半,在标题基地址寄存器下
我相信这里存在一些混淆,因为 I/O 和非 I/O 设备之间存在差异。
\n来自维基百科内存映射 I/O (MMIO):
\n\n\n内存映射 I/O\n 使用相同的地址总线来寻址内存和 I/O 设备 \xe2\x80\x93 I/O 设备的内存和寄存器被映射到(关联)地址价值观。因此,当 CPU 访问某个地址时,它可能指的是物理 RAM 的一部分,但也可能指的是 I/O 设备的内存。因此,用于访问存储器的CPU指令也可以用于访问设备。每个 I/O 设备都会监视 CPU 的地址总线,并响应分配给该设备的地址的任何 CPU 访问,从而将数据总线连接到所需设备的硬件寄存器。为了容纳 I/O 设备,CPU 使用的地址区域必须保留用于 I/O,并且不能用于普通物理内存。
\n
从你的文章中:
\n\n\n\n\n基地址寄存器(或 BAR)可用于保存设备使用的内存地址或端口地址的偏移量。通常,内存地址 BAR 需要位于物理 RAM 中,而 I/O 空间 BAR 可以驻留在任何内存地址(甚至超出物理内存)。
\n\n\n\n
内存空间条布局的类型字段指定基址寄存器的大小以及它可以映射到内存中的位置。如果其值为 0x00,则基址寄存器为 32 位宽,并且可以映射到32 位内存空间中的任何位置。值 0x02 表示基址寄存器为 64 位宽,可以映射到 64 位内存空间中的任何位置(64 位基址寄存器消耗 2 个可用的基址寄存器)。
\n
因此,两者之间不存在冲突,因为这完全取决于设备。\n如果设备拦截总线上的内存引用,则该地址是虚拟的。\n如果没有,则它是真实的物理地址用于与设备通信的地址\n(例如 NVRAM)。
\n\n但是,在所有情况下,真实物理地址都用于 I/O 设备,因为引用它的计算机指令只能使用真实地址。\n如果设备拦截对它的引用,则可能会浪费该内存。\n为了避免这种浪费,操作系统通常会在实际物理内存之外分配它(这不会导致错误的内存访问错误,因为设备将拦截所有引用)。
\n\n这就是 32 位 Windows 计算机\n似乎无法使用整个 4 GB 内存的众所周知问题的原因。\n原因是 Windows 作为 32 位,使用真实地址分配设备内存,\然后对于这两种情况都变得不可用:\n所寻址的内存是否确实已使用,\n或因被设备拦截而未使用。
\n\n另一篇有用的维基百科文章是:PCI 配置空间。
\n 归档时间: |
|
查看次数: |
12189 次 |
最近记录: |