在系统内存映射(也称为 cpu 内存映射)中,地址范围被分配给 RAM 内存范围,MMIO 用于 PCI 设备等。
让我们举一个例子,其中 RAM 的地址范围从地址 0 开始到 512MB,其中包括 DOS 兼容内存空间,从 0 开始到 1MB。
现在当我们说这 512MB 的区域将被映射到内存中时,这是否意味着 CPU 地址空间中的地址 0 将被映射到物理 RAM 中的地址 0,并且同样高达 512MB?如果不是那么映射是如何完成的?
CPU地址空间中分配的内存地址范围是否与系统中安装的RAM大小完全相等?如果不是这种情况,那么在这种情况下如何进行映射?
另外,DOS 兼容区域的内存映射将如何完成?如果使用 DOS 以外的操作系统,该区域是否会在内存中未被使用?
内存映射是否意味着当 CPU 生成从 0 到 512 MB 的地址时,只会重定向到 RAM 中?CPU 生成的任何其他地址永远不会被 MMU 定向到 RAM 中?在这种情况下,所有应用程序的地址都在 0 到 512MB 之间,以便访问内存?
我在这里考虑使用 x86 系统。
我是 PCI Express 新手,我想通过 MMIO 地址读/写 PCI Express 配置空间。我知道如何通过 0xCFC 和 0xCF8 端口地址(在 x86 上)将端口映射 IO 读/写到 PCI Express 配置空间。我还编写了一个示例 Linux 内核模块来通过端口映射 io 读取 pci 配置空间,效果很好。我想通过 MMIO/MMCFG 访问执行相同的操作。
我也进行了搜索,但找不到令人信服的答案。我正在寻找详细信息以及一些代码示例以更好地理解它。
任何帮助表示赞赏。