驱动里看到的是内核虚拟地址,用户程序看到的是用户虚拟地址,DMA设备又可能使用总线地址。面试官问虚拟内存时,重点不是背地址范围,而是理解CPU通过页表完成地址翻译,以及“页当前不存在”时为什么会触发Page Fault。
虚拟地址 → MMU/TLB → 页表 → 物理页;映射不存在或权限不满足时进入异常处理。

三个概念要连起来讲
页表做什么
虚拟地址被拆成页号和页内偏移,页表把虚拟页映射到物理页。现代CPU通常还有TLB缓存常用映射。
Page Fault不等于程序崩溃
访问一个合法但尚未建立物理映射的页面时,也可能触发缺页异常,由内核分配/装入页面后继续执行。非法访问则可能最终形成SIGSEGV。
mmap在驱动里的意义
驱动可以把设备内存或特定物理页映射到用户空间,但必须控制范围、缓存属性、权限和生命周期。
面试参考回答
我会先说明进程使用的是虚拟地址,CPU的MMU通过页表把它翻译成物理地址,TLB用来缓存常用转换。Page Fault本身只是地址翻译遇到异常条件,不一定是程序错误;匿名内存首次访问、按需加载文件都可能合法触发缺页。驱动做mmap时,则需要把指定物理页面建立到用户进程的虚拟地址空间,并正确设置页保护和缓存属性。对于DMA地址,我不会简单等同于CPU物理地址,还要看平台的DMA/IOMMU模型。
追问方向
Page Fault和Segmentation Fault是什么关系?
TLB为什么能提高地址翻译效率?
驱动mmap设备寄存器时为什么要注意缓存属性?
DMA地址为什么不一定等于CPU物理地址?
把虚拟地址理解成“假的地址”,但说不出页表怎么映射。
认为出现Page Fault就一定是崩溃。
把virt_to_phys、DMA地址和用户态地址随意互换。
凡亿电子工程师面试平台 · 面试回答建议结合本人真实项目经历和具体器件/规范展开。

扫码关注






























