MLIR的Virtual Memory(虚拟内存)与地址转换从一个半夜的段错误说起凌晨两点,我盯着屏幕上的core dump发呆。一个自定义的MLIR dialect,在lowering到LLVM IR之后,跑在RISC-V模拟器上,每次访问某个特定地址范围就崩。gdb进去看,地址0x8000_0000,物理地址没错,但MMU报page fault。更诡异的是,同样的MLIR IR,在x86上跑得好好的。折腾了三个小时,最后发现是MLIR的虚拟内存抽象层在地址转换时,把一段本该映射到设备内存的区域,当成了普通DRAM处理。这个坑让我意识到:MLIR的Virtual Memory机制,远不是“加个地址偏移”那么简单。MLIR为什么需要自己的虚拟内存传统编译器里,地址空间是LLVM或者GCC后端管的。但MLIR的野心更大——它要在多级IR之间保持地址语义的一致性。比如你写一个自定义的NPU算子,在TOSA IR里访问的是逻辑地址,到Linalg IR里可能变成多维索引,再到LLVM IR里又变成线性地址。每一层转换都可能引入地址映射错误。MLIR的Virtual Memory抽象,本质上是一套与目标架构无关的地址空间描述。它允许你在IR层面定义:地址空间编号(比如0是全局内存,1是共享内存,2是寄存器文件)地址转换规则(比如从逻辑地址到物理地址的映射函数)内存属性(是否可缓存、是否对齐、是否volatile)
