X86_64 CR3详解
从CPU的视角来看,是没有进程概念的,那么底层是如何区分进程的呢?因为不同的进程的虚拟地址是可以相同的。
应该是通过TLB来区分的,TLB通过flush的操作,将TLB刷新了,每次切换进程就flush TLB。CPU根本不需要区分进程,只需要从TLB中得到物理地址就行了。
flush TLB是通过cr3寄存器来决定何时flush的。cr3寄存器一旦改变,就会flush TLB。改变cr3的操作应该是操作系统来做的,Linux源码中有改变cr3的函数。
flush TLB的相关内容请看转载的文章:
X86_64 CR3控制寄存器详解_SweeNeil的博客-CSDN博客_cr3寄存器
转载内容如下:
CR3寄存器目前博客主要能查找到的内容都比较简单,例如
《控制寄存器 cr0,cr2,cr3 - chingliuyu - 博客园》等博客,只对CR3寄存器进行了简单的介绍:
状态和控制寄存器组除了EFLAGS、EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。其中CR1没有使用。
CR3含有存放页目录表页面的物理地址,因此CR3也被称为PDBR。因为页目录表页面是页对齐的,所以该寄存器只有高20位是有效的。而低12位保留供更高级处理器使用,因此在往CR3中加载一个新值时低12位必须设置为0。
使用MOV指令加载CR3时具有让页高速缓冲无效的副作用。为了减少地址转换所要求的总线周期数量,最近访问的页目录和页表会被存放在处理器的页高速缓冲器件中,该缓冲器件被称为转换查找缓冲区(Translation Lookaside Buffer,TLB)。只有当TLB中不包含要求的页表项时才会使用额外的总线周期从内存中读取页表项。
即使CR0中的PG位处于复位状态(PG=0),我们也能先加载CR3。以允许对分页机制进行初始化。当切换任务时,CR3的内容也会随之改变。但是如果新任务的CR3值与原任务的一样,处理器就无需刷新页高速缓冲。这样共享页表的任务可以执行得更快。
本文深入挖掘一下CR3寄存器的相关信息,了解MMU、TLB、操作系统与CR3寄存器的交互。
一、CR3寄存器
对于64位机,CR3寄存器也从32位变成了64位,它的主要功能还是用来存放页目录表物理内存基地址,每当进程切换时,Linux就会把下一个将要运行进程的页目录表物理内存基地址等信息存放到CR3寄存器中。
)
二、CR3寄存器与TLB
关于CR3寄存器与TLB找到了两个大佬的博文,对于TLB里面的信息描述得很清楚,可以直接移步~
1、《TLB原理》
地址:https://zhuanlan.zhihu.com/p/108425561?utm_source=wechat_timeline
这个文章对于TLB的原理描述地很清晰,TLB只能使用虚拟地址来做tag,那么是否会出现TLB别名问题以及TLB歧义问题都进行了分析。文中指出了TLB不存在别名问题,但是存在TLB歧义,解决TLB歧义最简单的方法就是进程切换之后使整个TLB无效,这会导致性能损失,所以文中提出了尽可能避免TLB flush的方法,例如在TLB中添加一项ASID(Address Space ID)的匹配之类的。这篇文章很有参考价值,内容也比较新~
2、《进程切换分析(2):TLB处理》
地址:http://www.wowotech.net/process_management/context-switch-tlb.html
这个文章也提出了《TLB原理》这个文章中的一些问题,但是没有上一篇文章那么细致,它重点关注了进程切换的时候,TLB的一些处理。
在《深入理解LINUX内核》一书中指出,Intel微处理器只提供了两种使TLB无效的技术:
在向CR3寄存器写入值时所有Pentium处理器自动刷新相对于非全局页的TLB表项;
在Pentium Pro及之后的处理器中,invlpg汇编语言指令使映射指定虚拟地址的单个TLB表项无效。
深入理解LINUX内核基于2.6版本内核,本文将基于4.15版本内核对相关内容进行探究,所以上面的说法可能有些已经过时,需要我们自己看内核代码来分析。对于本节给出的文章2《进程切换分析(2):TLB处理》,它指出x86平台上,在进程切换的时候,软件不需要显示的调用tlb flush函数,在switch_mm函数中会用next task中的mm->pgd加载CR3寄存器,这时候load cr3的动作会导致本cpu中的local tlb entry被全部flush掉。在x86支持PCID(X86术语,相当与ARM的ASID)的情况下会怎样呢?也会在load cr3的时候flush掉所有的本地CPU上的 local tlb entry吗?其实在linux中,由于TLB shootdown,普通的linux并不支持PCID,因此,对于x86的进程地址空间切换,它就是会有flush local tlb entry这样的side effect。
但是对于切换到内核线程时,不需要进行TLB flush,这里涉及到enter_lazy_tlb函数。
三、CR3寄存器与操作系统
CR3寄存器的改变与操作系统的关联主要是由于进程切换,每当进程切换时,CR3的内容需要被操作系统修改。
先了解一下进程切换的具体内容,从本质上说,每个进程切换由两部分组成:
1、切换页全局目录以安装一个新的地址空间
2、切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息,包括CPU寄存器。
原作者还有Linux源码分析,我没有看过源码,就不在此转载源码部分了,有需要请看原文章。
X86_64 CR3详解相关推荐
- Linux mem 2.2 内核地址空间布局详解
文章目录 1. 简介 2. 内核页表初始化 2.0 decompress阶段 2.1 `head_64.S`和`head64.c` 2.2 start_kernel() 2.2.1 物理内存(e820 ...
- linux卸载hadoop版本,centos6.5 安装hadoop1.2.1的教程详解【亲测版】
本篇只简单介绍安装步骤 1. 角色分配 10.11.84.4 web-crawler--1.novalocal master/slave 10.11.84.5 web-crawler--2.noval ...
- ceph-dencoder工具使用详解
文章目录 简介 使用 decode命令用法 encode 简介 ceph-dencoder工具是一个序列化编码.解码并且打印ceph数据结构的工具.它主要用来调试和测试ceph不同版本之间的兼容性问题 ...
- LNMP架构详解(2)——Mysql、PHP、Nginx源码编译过程
前言 本文将介绍LNMP架构中Mysql.PHP.Nginx的源码编译过程:这时有人不仅会问:在我们使用的Linux系统中,可以从yum源中获得mysql.php,为什么要进行如此漫长复杂的过程进行编 ...
- 运维企业专题(10)RHCS集群工具——FENCE搭建、高可用服务配置详解
前言:FENCE工具的原理及作用 FENCE设备是RHCS集群中必不可少的一个组成部分,通过FENCE设备可以避免因出现不可预知的情况而造成的"脑裂"现象,FENCE设备的出现,就 ...
- 运维企业专题(5)LVS高可用与负载均衡中篇——VS/DR模式配置详解
实验准备 1.下面的实验使用的是rhel6系列(rhel6.5)的虚拟机,因此你需要有对应的镜像和yum源 2.准备三台虚拟机,为了区分主机名与IP分别为 server1 172.25.6.1 ser ...
- ansible 详解
文章目录 一.ansible 简介 1.1 ansible 是什么? 1.2 ansible 特点 1.3 ansible 架构图 二.ansible 任务执行 2.1 ansible 任务执行模式 ...
- Linux 高可用(HA)集群之keepalived详解
大纲 一.前言 二.Keepalived 详解 三.环境准备 四.LVS+Keepalived 实现高可用的前端负载均衡器 一.前言 这篇文章是前几篇文章的总结,我们先简单的总结一下我们前面讲解的内容 ...
- 高可用集群技术之heartbeat应用详解(一)
一.高可用集群基本概念 什么是高可用技术呢?在生产环境中我既要保证服务不间断的服务又要保证服务器稳定不down机,但是异常还是会发生,比如说:服务器硬件损坏...导致服务器down机,我该如何保证 ...
最新文章
- Mybatis-Plus 支持分库分表了?-官方神器发布!
- 奥比中光Astra深度传感器工作原理
- NOI 2013 矩阵游戏
- 洛谷 - P6292 区间本质不同子串个数(SAM+LCT+线段树)
- JavaScript读取本地图片到浏览器
- 十大最常见的Java性能问题
- 对bmp文件内存压缩 与 解压缩
- Android TTS实现简单阅读器
- 智能电话机器人中的语音识别技术是什么?
- JAVA开源协同过滤算法,推荐算法:协同过滤算法的介绍
- 阿里月薪6W招程序员,看到要求我傻眼了!
- 格力空调售后服务管理系统
- JDBC+MySQL入门增删改查案例
- “无边框”引发口水大战 供应链考验手机硬件创新
- 将简体字转换成繁体字
- python自动化接口_Python接口自动化——Web接口
- Java系统线上生产问题排查一把梭,华为高级java面试题
- Excel.Application组件使用方法,适合应用于使用EXCEL组件做WEB应用开发。
- zigbee中的CSMA-CA载波检测多路访问-碰撞避免和信标(Beacon)VS非信标(Nonbeacon)网络
- python运用turtle绘制大众车标
热门文章
- 【深度学习实践】如何降低电力行业的运维成本,提高巡检智能水平
- 颓废了将近一年的总结
- coreldraw课表设计作品_CorelDRAW强大的平面设计 亿万人都在用
- 用java编写在界面中画圆_用java语言编写画随机的圆 十万火急 求大神帮忙!!!...
- 对话搜狗口语机器翻译团队:国际冠军的诞生
- sel system event log 情况分析
- python代码画小猪佩奇动画片全集_使用python画个小猪佩奇的示例代码
- mysql存储过程 limit_mysql存储过程 limit
- 2021年3月份报告合辑 附下载地址
- 《事半功倍读书法》读书笔记