ARM64中的ASID地址空间标识符
1. 从ARM32到ARM64
从ARM32到ARM64不止将处理器从32位升级到了64位,还有许多性能的技术也得到了极大的提升,光是个头长了可不行啊!能耐也得跟着长啊!哈哈哈
1.1 ARM32的TLB机制

如上图所示,上一讲我们讲了TLB的每一条表项都有一个bit用来表示自己是全局的(内核空间)还是本地的(用户空间)。当进程发生切换是,操作系统必须将TLB中缓存用户空间转换关系的表项全部清空,以保证下一个进程不会使用上一个进程的地址转换关系。
这样,在ARM32中每切换一次进程就需要刷一次TLB表中的本地表项,如果进程切换的频繁,处理器损失的性能是比较大的。
1.2 ASID(地址空间标识符)
上一篇文章我们提到了鸡肋的FCSE技术,其实从ARMv6开始,ARM就反对使用任何FCSE机制。到了ARMv7时代,FCSE是可选的,直到ARMv7多处理架构才彻底淘汰了FCSE(起码从白皮书上搜这个关键字是找不到了),到了ARMv8,处理器迎来了64位的时代,ASID技术已经早已成熟。
ASID这项技术在ARMv7多处理器架构就开始使用了,只不过在ARMv7里,ASID是8位的,也就是256就溢出了,而在ARMv8架构中,ASID可以配置为16位,也就是计到65536才会溢出,ASID位数扩大的好处文章后面会讲。为每一个进程分配一个ASID的话,256个就溢出了,所以在Linux中ASID溢出后就要重新洗牌了。
说到ASID,还要从ARM的TTBR寄存器开始说起,前面文章我们讲过了MMU的TTBR寄存器,但是并没有给出TTBR寄存器的bit描述,这里列出ARM32和ARM64的TTBR寄存器格式描述
1.2.1 ARM32的TTBR0寄存器格式

1.2.2 ARM64的TTBR0寄存器格式

可以看出在ARM32的TTBR寄存器里是没有ASID这个属性的,粗暴点的说,操作系统切换进程其实就是切页表,切页表就是改写TTBR寄存器的值,那么很容易知道Linux会为每一个进程分配一个独用的ASID码,Linux为每个为进程分配的ASID值都不相同。
这么一来,MMU再做页表转换时也会把当前的ASID值缓存到TLB快表里,
ARM64的TLB机制

有了ASID后,TLB跟以前也不一样了,在进程切换的时候,操作系统也不需要去刷TLB了,因为MMU在做地址转换时会将TLB表项里的ASID和当前进程的ASID值做比较,只有ASID值相等,MMU才认为这条表项是我需要的。
所以和没有ASID技术的ARM32相比,ARM64在进程切换上提升了较大的性能。
ARM64中的ASID地址空间标识符的更多相关文章
- extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
- c中的关键字、标识符、注释
一. 学习语法之前的提醒 1) C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 2) 就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头, ...
- Java中关于注释、标识符、变量、常量、数据类型、类型转换、转移字符以及数值型的表现形式的详解
Java文件的注意事项 在同一个Java文件中,可以定义多个类,但是被public修饰的类只能够有一个,并且此类名要与文件名一致. 在同一个类中,可以定义多个方法,但是名字叫做main的方法只能有一个 ...
- strcasecmp在VS2010中提示未定义标识符
分析: strcasecmp(*,*)是用来比较字符串,定义在string.h头文件中,但是在windows下即使添加string.h头文件,依然会报错. 解决: 添加 #if defined(_MS ...
- OS之内存管理 ---基本的内存管理策略(二)
分段 基本方法 分段就是基于用户视图的内存管理方案.逻辑地址空间是由一组段构成的,每个段都有名称和长度.地址指定了段名称和段内偏移.因此用户通过两个量来指定地址:段名称和段偏移. 为了简单,进行对段的 ...
- ASID 与 MIPS 中 TLB 相关
ASID 为了提高TLB的性能,将TLB分成Global和process-specific.global 是指常驻在tlb中不会被刷出的,例如内核空间的翻译,process-specific 是指每个 ...
- java中的标识符、修饰符、关键字
关键字的特点:1.完全小写的字母,2,在增强版记事本中有特殊颜色 例如@是电子邮箱当中有特殊含义的.被保留的.不能随意使用的字符,关键字. 例如图中public.class.static.void是关 ...
- .NET平台系列17 .NET5中的ARM64性能
系列目录 [已更新最新开发文章,点击查看详细] .NET团队使.NET 5大大提高了常规性能和ARM64性能.在<.NET5中的性能改进>博客中可以查看总体改进情况.在这篇文章中, ...
- 《APUE》中的函数整理
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. ...
- 从编译器角度理解C++中的引用和指针
欲分析指针和引用,则要分析变量名和地址之间的关系(不管你理解还是不理解,无论你是从老师那里听到的,还是网上看到的,应该都知道两句话:1. 指针就是地址,2.引用就是给变量起个别名) 所以我们就要来分析 ...
随机推荐
- Gartner web3 的未来市场前景
内行人叫web3 外行人叫元宇宙 元宇宙(Metaverse) Gartner将元宇宙定义为一个由通过虚拟技术增强的物理和数字现实融合而成的集体虚拟共享空间.这个空间具有持久性,能够提供增强沉浸式体验 ...
- 【RabbitMQ】14 集群搭建
多服务器单实例 -- 参考博客: https://www.cnblogs.com/lixioayi/articles/9993658.html 首先要找到cookie文件,所有实例要保持cookie一 ...
- 【MySQL】JSON相关
一些概念 MySQL里的json分为json array和json object. $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json object, ...
- mpi4py 官方使用手册
一直好奇mpi4py的使用手册在哪,找了好久最后在anaconda上发现了线索: https://anaconda.org/conda-forge/mpi4py Home: https://mpi4p ...
- Redis中的Hash类型常用命令
一.hset命令作用:设置hash类型值:格式:hset key field value案例:192.168.0.111:0>hset product name 苹果"1" ...
- js 实现俄罗斯方块(三)
我又来啦!上一篇有点水,本篇我们来干货! 嘿嘿,首先我们先搭建游戏世界------网格 所有的操作包括左移右移下移旋转都是在这个网格中 既然是使用js来写当然跑不了html啦,实现网格最简单的 方法就 ...
- 代码随想录Day9
KMP算法 主要用来进行字符串匹配 KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了. 所以如何记录已经匹配的文本内容,是KMP的重点 ...
- Meissel_Lehmer模板
复杂度 \(O(n^\frac 23)\),计算 \(1\sim n\) 的素数个数 #define div(a, b) (1.0 * (a) / (b)) #define half(x) (((x) ...
- LeetCode40.组合总和II
LeetCode40.组合总和II 力扣题目链接(opens new window) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...
- linux中级——libcurl库访问百度
libcurl简介: libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持H ...