当前位置:网站首页>linux内核源码分析之页表缓存
linux内核源码分析之页表缓存
2022-07-25 16:17:00 【为了维护世界和平_】
处理器的内存单元(MMU)负责把虚拟地址转换成物理地址。为了改进虚拟地址到物理地址的转换速度,引入TLB的高速缓存。即页表缓存
页表缓存用来缓存最近使用过的页表项,有些处理器使用两级页表缓存:第一级TLB分为指令TLB和数据TLB,第二级TLB是统一TLB,即指令和数据公用TLB
TLB管理
如果内核修改了缓存在TLB中的数据,那么旧的数据必须废除,内核如何保证一致性?
| 函数 | |
| flush_tlb_all | 使所有TLB失效 |
| flush_tlb_mm | 使指定用户地址空间的所有TLB失效 |
| flush_tlb_range | 使指定的地址空间范围的TLB失效 |
| flush_tlb_page | 使指定用户地址空间里面的指定虚拟地址页的TLB表项失效 |
| flush_tlb_kernel_range | 使内核虚拟地址范围的TLB表项失效 |
| update_mmu_cache | 修改页表项后把页表项设置到页表缓存,由软件管理页表缓存的处理器必须实现此函数。 |
| tlb_migrate_finish | 内核把进程从一个处理器迁移到另外一个处理器后,调用此函数以更新页表缓存或上下文特定信息。 |
当TLB没有命中的时候,ARM64处理器的内存管理单元自动遍历内存中的页表,把页表项复制到TLB,不需要软件把页表写到TLB,所以ARM64架构没有提供写TLB的指令。
#define isb() asm volatile("isb" : : : "memory")
#define dmb(opt) asm volatile("dmb " #opt : : : "memory")
#define dsb(opt) asm volatile("dsb " #opt : : : "memory")
#define __TLBI_1(op, arg) asm ("tlbi " #op ", %0\n" \
ALTERNATIVE("nop\n nop", \
"dsb ish\n tlbi " #op ", %0", \
ARM64_WORKAROUND_REPEAT_TLBI, \
CONFIG_ARM64_WORKAROUND_REPEAT_TLBI) \
: : "r" (arg))
#define __TLBI_N(op, arg, n, ...) __TLBI_##n(op, arg)
#define __tlbi(op, ...) __TLBI_N(op, ##__VA_ARGS__, 1, 0)static inline void flush_tlb_all(void)
{
dsb(ishst);
__tlbi(vmalle1is);
dsb(ish);
isb();
}
展开后的程序为
static inline void flush_tlb_all(void)
{
//确保屏障前面的存储指令执行完,dsb是数据同步,ish表示共享域是内部共享,st表示存储
asm volatile("dsb ishst" : : : "memory");
//使所有核匹配当前VMID,阶段1和异常级别1的所有TLB表项失效
asm ("tlbi vmallelis" : :);
//确保TLB前面指令执行完毕
asm volatile("dsb ish" : : : "memory");
//指令同步屏障,指令冲刷处理器的流水线,重新读取屏障指令后面的所有指令
asm volatile("isb" : : : "memory")
}
local_flush_tlb_all用来使当前核的所有TLB表项失效
static inline void local_flush_tlb_all(void)
{
dsb(nshst);
__tlbi(vmalle1);
dsb(nsh);
isb();
}
和函数flush_tlb_all的区别如下
1)指令dsb中的ish换成了nsh,nsh是非共享,表示数据同步屏障指令仅在当前核起作用
2)指令tlbi没有携带is,表示仅仅使当前核的TLB表项失效。
地址空间标识
为了减少在进程切换时清空页表缓存的需要,ARM64处理器的页表缓存使用非全局位区分内核和进程的页表项。使用地址空间标识符ASID(Address Space Identifier)区分不同进程的页表项。
虚拟机标识符
虚拟机里面运行的客户操作系统的虚拟地址换成物理地址分两个阶段:第1阶段把虚拟 地址转换成中间物理地址,第2阶段把中间物理地址转换成物理地址。第1阶段转换由客户操作 系统的内存控制,和非虚拟化的转换过程相同。第2阶段转换由虚拟机监控器控制,虚拟机监 控器为每个虚拟机维护一个转换表,分配一个虚拟机标识符(Virtual Machine Identifier,VMID),寄存器VTTBR_EL2(虚拟化转换表基准寄存器,Virtualization Translation Table Base Register)存放当前虚拟机的阶段2转换表的物理地址。
参考链接
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0
边栏推荐
- MySQL tutorial 68-as setting alias
- Google Earth Engine——全球建筑物GlobalMLBuildingFootprints矢量集合下载
- 进程之间的通信(管道详解)
- I interviewed 8 companies and got 5 offers in a week. Share my experience
- Win11桌面切换快捷键是什么?Win11快速切换桌面的方法
- Promise期约
- 递归菜单查询(递归:自己查自己)
- tkinter模块高级操作(一)—— 透明按钮、透明文本框、自定义按钮及自定义文本框
- Gap Locks(间隙锁)
- What is a physical firewall? What's the effect?
猜你喜欢

如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?

Food safety - do you really understand the ubiquitous frozen food?

fastadmin tp 安装使用百度富文本编辑器UEditor

TypeError: Unrecognized value type: <class ‘str‘> ParserError: Unknown string format

食品安全丨无处不在的冷冻食品,你真的了解吗?

Analysis and solution of data and clock mismatch delay in SPI transmission

聊聊如何用 Redis 实现分布式锁?

leetcode:528. 按权重随机选择【普通随机失效 + 要用前缀和二分】

2W word detailed data Lake: concept, characteristics, architecture and cases

Paper notes: highly accurate protein structure prediction with alphafold (alphafold 2 & appendix)
随机推荐
解决Win10磁盘占用100%
MySQL显式锁
Differences between cookies, cookies and sessions
如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?
What is a physical firewall? What's the effect?
Lazy loading of pictures
The annualized interest rate of treasury bonds is too low. Is there a financial product with a higher annualized interest rate than the reverse repurchase of treasury bonds?
狂神redis笔记12
mysql 隔离级别事务
C # simulation lottery
邮件的收发的展现逻辑之收件箱发件箱以及回复断链的问题
只有1000元能买什么理财产品赚钱?
R语言使用gt包和gtExtras包漂亮地显示表格数据:gt_bar_plot函数和gt_plt_bar_pct函数可视化百分比条形图、原始数据的百分比条形、缩放后的数据的百分比条形、指定数据对齐宽度
Talk about how to use redis to realize distributed locks?
如何构建面向海量数据、高实时要求的企业级OLAP数据引擎?
Win11动态磁贴没了?Win11中恢复动态磁贴的方法
Boomi荣获“多元化最佳首席执行官奖”和“职业成长最佳公司奖”,在大型公司类别中跻身50强
Upgrade esxi6.7.0 to 7.0u3f (updated on July 12, 2022)
Win11自带画图软件怎么显示标尺?
How to build an enterprise level OLAP data engine for massive data and high real-time requirements?