news 2026/4/13 6:42:13

linux Page Table 和 TLB 操作总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux Page Table 和 TLB 操作总结

以下是 Linux 内核中与页表和 TLB 操作对应的主要 API/函数列表,结合上述操作分类:


页表(Page Table)相关 API

1. 地址转换

操作内核 API/函数说明
虚拟地址→物理地址virt_to_phys()__pa()内核虚拟地址转物理地址
物理地址→虚拟地址phys_to_virt()__va()物理地址转内核虚拟地址
页表遍历pgd_offset()p4d_offset()pud_offset()pmd_offset()pte_offset_map()多级页表各级索引获取
获取页表项pte_t *pte = pte_offset_kernel(pmd, addr)获取内核地址的 PTE

2. 页表项管理

操作内核 API/函数说明
创建页表pgd_alloc()pud_alloc()pmd_alloc()pte_alloc()分配各级页表结构
设置映射set_pte_at()set_pmd()set_pud()设置页表项内容
建立映射remap_pfn_range()vm_insert_page()io_remap_pfn_range()建立虚拟到物理映射
删除映射pte_clear()pmd_clear()清除页表项
释放页表pgd_free()pte_free()释放页表内存

3. 权限与状态检查

操作内核 API/函数说明
检查有效位pte_present()检查页面是否在内存中
检查权限pte_write()pte_read()pte_exec()检查读写执行权限
设置权限pte_mkwrite()pte_wrprotect()pte_mkexec()修改 PTE 权限位
访问/修改位pte_young()pte_dirty()检查访问/修改位
标记访问/修改pte_mkyoung()pte_mkdirty()设置访问/修改位

4. 缺页处理

操作内核 API/函数说明
缺页异常入口handle_mm_fault()缺页异常主要处理函数
调页do_swap_page()do_anonymous_page()do_wp_page()不同类型缺页处理
页面分配alloc_page()__get_free_page()分配物理页面

5. 页表切换

操作内核 API/函数说明
切换页表switch_mm()进程上下文切换时切换页表
设置页表基址load_cr3()(x86)加载新页表基址到 CR3

TLB 相关 API

1. TLB 刷新(一致性维护)

操作内核 API/函数说明
单页刷新flush_tlb_page()flush_tlb_mm_range()使指定虚拟地址的 TLB 项无效
进程空间刷新flush_tlb_mm()使指定进程所有 TLB 项无效
全局刷新flush_tlb_all()使所有 TLB 项无效(全系统)
跨CPU刷新flush_tlb_kernel_range()刷新内核地址范围的 TLB(所有CPU)

2. TLB 刷新优化

操作内核 API/函数说明
延迟刷新tlb_gather_mmu()tlb_finish_mmu()批量 TLB 刷新优化
范围刷新flush_tlb_range()刷新指定地址范围的 TLB

3. 架构相关 TLB 操作

操作内核 API/函数说明
x86 TLB 刷新__flush_tlb_one()__flush_tlb_all()x86 架构特定 TLB 操作
ARM TLB 操作flush_tlb_all()local_flush_tlb_all()ARM 架构实现
TLB 射击smp_call_function()+ TLB 刷新多核间 TLB 一致性维护

内存映射相关 API(综合操作)

操作内核 API/函数说明
建立内存映射mmap()系统调用 →do_mmap()用户空间内存映射
取消映射munmap()do_munmap()解除内存映射
改变保护mprotect()do_mprotect_pkey()修改页面保护权限
同步映射msync()do_msync()同步内存与文件内容

关键数据结构

数据结构说明
struct mm_struct进程内存描述符,包含页表基址等信息
struct vm_area_struct虚拟内存区域描述符
pgd_tp4d_tpud_tpmd_tpte_t各级页表项类型
struct page物理页面描述符

使用示例

/* 建立页表映射示例 */pte_t*pte;spinlock_t*ptl;pte=pte_offset_map_lock(mm,pmd,addr,&ptl);if(pte_present(*pte)){/* 页面存在 */pte_mkdirty(*pte);/* 标记为脏 */pte_mkyoung(*pte);/* 标记为访问过 */}set_pte_at(mm,addr,pte,pte_mkwrite(pte_mkdirty(pte_mkyoung(*pte))));pte_unmap_unlock(pte,ptl);/* TLB 刷新示例 */flush_tlb_page(vma,addr);/* 刷新单个页面 */

总结表

操作类别页表 API 示例TLB API 示例
地址转换virt_to_phys()pte_offset_map()-
映射管理set_pte_at()pte_clear()-
权限检查pte_write()pte_present()-
缺页处理handle_mm_fault()do_swap_page()-
一致性维护-flush_tlb_page()flush_tlb_all()
批量优化-tlb_gather_mmu()tlb_finish_mmu()
上下文切换switch_mm()通常包含在switch_mm()

这些 API 主要位于以下内核文件中:

  • include/asm-generic/pgtable.h
  • arch/x86/include/asm/pgtable.h
  • arch/x86/mm/tlb.c
  • mm/memory.c
  • mm/mmap.c

实际使用中需注意架构差异和内核版本变化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 10:33:36

dssenh.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/12 18:36:57

DuCsps.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/13 12:09:41

计算机Java毕设实战-基于springboot的闲一品闲置品交易平台基于SpringBoot的闲置物品交易系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/13 9:29:30

【计算机毕业设计案例】基于Java Web的银饰饰品商城系统的设计与实现基于springboot的饰品商城系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/13 7:24:54

day165—递归—最长回文子序列(LeetCode-516)

题目描述给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s "bbbab" …

作者头像 李华