这个问题需要进一步澄清。
背景:我正在开发一个嵌入式系统(Xilinx zynq ultrascale+),它由 ARM 处理器 + FPGA 组成。内存映射(如果我将系统用作裸机)如下:
附加到 ARM(根据数据表):
Segment name | Start addresss | Size
HP0_DDR_HIGH | 0x0_0008_0000_0000 | 32G
HP0_DDR_LOW | 0x0_0000_0000_0000 | 2G
HP0_LPS_OCM | 0x0_0000_FF00_0000 | 16M
HP0_QSPI | 0x0_0000_C000_0000 | 512M
然后我有一些外部 RAM (4GB),我可以通过 FPGA 中的 DDR 控制器访问它们。这段记忆就在这里
Segment name | Start addresss | Size
C0_DDR4_ADDRESS_BLOCK | 0x0_0005_0000_0000 | 4G
当我构建 Linux 时,我使用 Xilinx Petalinux 工具链,它是 Yocto 的伪装。系统启动后,我可以0x5_0000_0000
使用该物理地址、通过命令devmem
或通过从用户空间映射物理地址来访问外部 DDR。
我认为linux通过在启动时解析设备树来发现这个额外的DDR。
更多细节:查看数据表(https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf)
该地址似乎没有进入任何 MMU 转换单元。
问题):
- 如何检查 linux 是否使用外部 ddr 作为其可能的内存池的一部分?我知道操作系统会跟踪内存中的所有页面,那么该内存会被分页吗?
- 操作系统是否能够使用该内存来创建和管理进程地址空间?
- 假设我将此物理地址映射到进程中的用户虚拟地址空间,内核是否会创建新的页面条目?