# 1. anon_vma_chain 在 fork 时父→子的 VMA 链接与子 anon_vma 副本的工程价值? A 子进程复用父进程的同一个 anon_vma,从而避免任何额外开销 B fork 时完全不建立反向映射,待到缺页才临时创建 C 子进程创建独立 anon_vma 副本,并通过 parent 指针与父 anon_vma 形成树形结构,使 rmap 遍历避免重复 ✓ 正确答案 D anon_vma_chain 只是用于记录文件映射,与匿名页无关
# 2. rmap walk 在 unmap 页与 swap out 的开销来源及 rmap_walk_control(rwc)回调与 TLB 批量失效(TTU_BATCH_FLUSH)的优化? A 它缓存物理页的数据内容,避免重复读磁盘 B 它只用于 KSM 合并,与 unmap 无关 C 它缓存页的 refcount,用于快速判断页是否可回收 D 它通过 rmap_walk_control 的 trylock/提前终止回调避免无效遍历,并用 TTU_BATCH_FLUSH 批量推迟 TLB 失效 ✓ 正确答案
# 3. Folio 替代 compound page(head/tail)对 page cache 14 个 caller 的工程影响? A folio 只是把 page 结构换个名字,逻辑完全不变 B folio 只在 HugeTLB 中生效,page cache 不受影响 C folio 将 head/tail 分裂抽象为统一对象,简化了 page cache 调用者的 head 判断与批量操作 ✓ 正确答案 D folio 会引入额外的 head/tail 跳转,增加开销
# 4. KSM 的 madvise(MADV_MERGEABLE) 与 madvise(MADV_UNMERGEABLE) 接口? A 它让 KSM 立即合并指定的匿名页 B 它清除 VM_MERGEABLE 并撤销已合并页,使这些页恢复为独立页 ✓ 正确答案 C 它仅仅是一个提示,内核总是忽略它 D 它只对文件映射生效
# 5. Linux 6.10+ mseal() 系统调用将 mmap 区域标记为"sealed"、禁止 munmap 与 mprotect 的安全语义? A 它把内存区域的内容加密,防止被读取 B 它允许对被 seal 的区域执行任意 mprotect C 它只影响新分配的内存,旧区域不受影响 D 它把区域标记为 VM_SEALED,此后禁止 munmap/mprotect 等布局变更 ✓ 正确答案
# 6. mseal() 在防御 SROP、ROPgadget 与 VDSO 修补的工程价值? A mseal 只用于提升性能,与安全无关 B mseal 通过防止关键页被 mprotect 改权限或 munmap,堵住 ROP gadget 植入与 VDSO 修补等攻击路径 ✓ 正确答案 C mseal 会把所有代码页都变成可执行但不可读 D mseal 只能防御用户态堆溢出,无法防御内核攻击
# 7. mseal() 与 vm_flags 的 VM_SEALED 字段及 userfaultfd 在 sealing region 的边界? A VM_SEALED 会阻止 userfaultfd 对该区域的一切缺页服务 B userfaultfd 可以绕过 VM_SEALED 重新映射区域 C VM_SEALED 阻止 munmap/mprotect 等布局变更,但 userfaultfd 的缺页补页仍可进行 ✓ 正确答案 D VM_SEALED 只存在于进程的页表里,与 VMA 无关
# 8. rmap 遍历时 anon_vma 的双链表与红黑树结构如何避免重复遍历同一 VMA,fork 后父子进程共享匿名页时如何组织? A 子 anon_vma 通过 rb 树挂到父 anon_vma 下,rmap 遍历时每个 VMA 只被处理一次 ✓ 正确答案 B fork 后父子共享同一个 anon_vma,导致遍历必然重复 C anon_vma 只用链表,不用红黑树 D rmap 遍历时总是遍历整个 mm 的所有 VMA
# 9. mseal() 在 Android Bionic、glibc malloc meta 的工程应用? A mseal 用于加速 malloc 的分配 B mseal 只影响内核虚拟内存,用户态无法使用 C mseal 使得堆上的所有对象都不可读写 D Bionic 与 glibc 用 mseal 保护关键代码段与 malloc 元数据,防止被篡改改权限 ✓ 正确答案
# 10. Linux kernel 反向映射(rmap)将 anon_vma 与 page→mapping 反向链表的工程动机? A 它实现从物理页反查所有映射它的 VMA/PTE,使 swap、写保护、迁移等按页操作高效 ✓ 正确答案 B 它让页表能够映射多个物理页 C 它用来加速页表查找虚拟地址 D 它只在多核 CPU 上存在
# 11. rmap 在 KSM(page merging)与 NUMA 迁移的工程价值? A rmap 只用于 KVM 虚拟机,与页迁移无关 B rmap 让 KSM 直接读页内容而无需遍历 C rmap 遍历页的所有映射,使 KSM 能写保护全部映射、NUMA 迁移能更新全部 PTE ✓ 正确答案 D NUMA 迁移不需要更新页表
# 12. KSM 通过写保护(write protect)发现相同页面并 merge 为 COW page 的工程价值? A KSM 只会合并脏页,不影响未被写的页 B KSM 合并后所有进程共享同一份可写数据,互相可见 C KSM 把相同页合并为只读共享页,写时触发 COW 分裂,保证写者独立 ✓ 正确答案 D KSM 合并依赖页表锁定,无法 COW
# 13. KSM 在 KVM(Kernel Samepage Merging for VMs)减少内存压力的工程应用? A KSM 用于加速虚拟机的 CPU 计算 B KSM 会阻止虚拟机使用交换 C KSM 只对宿主机的内核页生效 D KSM 合并多个 guest 内容相同的匿名页,降低物理内存占用,支持内存超卖 ✓ 正确答案
# 14. KSM 的 full-scans(全量扫描)与扫描开销控制(checksum 过滤、pages_to_scan 限速、advisor)? A KSM 通过 checksum 过滤未变页、pages_to_scan 限速与 pages_sharing 统计反馈(advisor)控制扫描开销 ✓ 正确答案 B KSM 的扫描开销不可控,每轮必须全量比较所有页 C 所有候选页每轮都必须参与内容比较,无任何过滤机制 D KSM 会扫描比候选页更多的页
# 15. try_to_unmap 与 try_to_unmap_one 在是否写 PTE 的差异? A try_to_unmap_one 负责遍历所有 VMA,try_to_unmap 处理单个 PTE B try_to_unmap_one 从不触发 TLB 失效 C 两者都不写页表,只更新 refcount D try_to_unmap 遍历映射并对每个 PTE 调用 try_to_unmap_one,后者实际写 PTE ✓ 正确答案
# 16. KSM 与 THP(Transparent Hugepage)在 merge 策略的差异? A 两者都按内容合并页以节省内存 B THP 只合并内容相同的页 C KSM 按内容去重合并物理页,THP 按地址连续性合并为 2MB 大页以提高 TLB 命中 ✓ 正确答案 D KSM 与 THP 不能同时存在
# 17. mseal() 与 mprotect 的 PROT_READ 页面卸载语义差异? A 两者都可逆,均可反复修改权限 B mseal 只影响磁盘上的文件,不影响内存 C mprotect 只改权限且可逆,mseal 将区域永久锁定,禁止之后 munmap/mprotect 变更 ✓ 正确答案 D mprotect 会永久禁止 munmap,mseal 不会
# 18. NUMA balancing 如何使用 rmap 找到页面的所有 PTE 来设置 hint 位,page_referenced 扫描的开销如何控制? A 它对每个页每周期都做全量扫描,保证不遗漏 B 它只在进程退出时扫描一次 C 它完全不扫描页面,只靠硬件计数器 D 它通过 rmap 设置 hint 位并按 scan_rate 抽样、事件驱动触发采样,控制扫描开销 ✓ 正确答案
# 19. THP 大页在部分映射时如何利用 rmap 找到每个 PTE,拆分(split)大页时反向映射如何更新? A split 大页时把 pmd 拆成多个 pte 并重建子页的反向映射,rmap 能按子页找到对应 PTE ✓ 正确答案 B THP 拆分后 rmap 无需更新,仍按 pmd 遍历 C THP 从不支持部分映射,因此不需要 rmap D rmap 只能处理 4KB 页,无法处理 THP
# 20. Linux 5.16 引入 folio 统一"page_head + tail page"、6.18 起内存描述符(memdesc)重构继续演进页描述符的工程价值? A 它只影响 4KB 页,大页不受影响 B 它只是把 struct page 改名,不改变任何结构 C 它让 tail page 更加独立,不再需要 head D folio(5.16)统一 head/tail 抽象,memdesc(6.18+)继续拆分 struct page,消除 head 判断并简化大页操作 ✓ 正确答案
# 21. folio_add/folio_put 的 refcount 是否双计数在 testfolio 和生产 folio 的工程边界? A folio 以整体为单位计数一次,testfolio 复用同一语义,不产生 head/tail 双计数 ✓ 正确答案 B folio 的 head 与 tail 各持一份 refcount,必然双计数 C testfolio 与生产 folio 的 refcount 完全无关 D folio_add 从不增加 refcount
# 22. folio 在 bio / splice / mmap 的 page descriptor 简化代码? A folio 让这些路径以 folio 为单位处理,简化 head/tail 判断并提升批量处理效率 ✓ 正确答案 B folio 使 bio 必须在页与 folio 之间来回转换,增加复杂度 C folio 只影响 mmap,不影响 bio 与 splice D folio 会禁止这些路径处理大页
# 23. memdesc 重构与 GUP(get_user_pages)的协同? A GUP 必须逐页 pin,无法使用 folio B GUP 基于 folio 做一次性 pin,统一管理 refcount,避免 tail 计数歧义 ✓ 正确答案 C memdesc 重构使 GUP 不再增加 refcount D GUP 与 memdesc 完全无关