TLB与内存寻址,内存读取,虚拟内存的相关原理

TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。

TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。

关于TLB与cache-CPU缓存的关系,TLB介于CPU与cache之间,是内存的管理单元,用于程序从逻辑地址访问实际内存地址的页表缓存。

当程序或cpu要读取数据,CPU会根据程序提供的逻辑地址的前20位映射码到TLB中查询,TLB中保存所有已运行程序的前20位逻辑地址的映射码,查到(命中)根据前20位映射码直接访问实际内存地址。查不到(不命中)CPU会到CPU缓存(cache)中查询,没有CPU会重新加载(实际内存)所有逻辑地址的映射码(一些程序停止响应后过一会又响应),后直接读取硬盘上数据,同时将逻辑地址映射信息保存回TLB(刷新TLB)。TLB归系统(OS)在内存中创建、管理,也算是一种缓存,软缓存。CPU cache是加快CPU与内存之间数据交换的缓存,归CPU管理,是一种硬件缓存。

当CPU访问程序时,内存读取速度很快,将CPU需要的数据块(实际内存地址)读取保存在内存中,内存空间有限,符合软件编写规则的程序都只能保存很小的数据块在内存中,并且内存中这些数据块只有被CPU全部处理完,内存才会加载下一个数据块。CPU要一点一点的处理这些内存中的数据块,当CPU处理完这个数据块需等待内存加载下一个数据块。(也可以说内存停止慢慢等CPU处理完。)这就造成了数据处理的停顿(虽然这点时间可能就是几毫秒),为了保持数据处理的连贯性、持续性,CPU
cache应运而生。内存中要处理或优先处理的数据块先被CPU cache加载,不再影响内存的运作,CPU优先从CPU
cache中加载处理数据。CPU
cache起了缓冲、缓存作用。(这只是CPU运行的大方向的理论,实际IU与AU对缓存还有不同的处理,并且像IU酷睿与新的I系列CPU在缓存、内置内存控制器等多有改进,但无论怎样这大方向的理论没变!同频率不同价的CPU多是砍CPU
cache大小或指令来区分,资金不是太紧张的同学还是选同频大缓存的CPU为好。同类型相比I3与I3,别拿I3与I5比。。。。)

如上,CPU、CPU
cache或内存都会分优先级来加载处理数据,一些暂时不用的数据,内存会自动卸载数据到虚拟内存中,同时映射地址供以后直接调用。没有启用虚拟内存,内存会直接卸载暂时不用的数据,用时再从硬盘上读取。大家注意到,直接以后从硬盘上读取还是卸载数据到虚拟内存中,好像都一样,都要从硬盘上读取。实际使用时是不一样的,调用虚拟内存,实际内存只要通过映射码直接读取。调用硬盘上数据有一个加载、选择需要数据块的时间(虽然这点时间可能还是几毫秒)。到此其实虚拟内存更像实际内存的缓存(但不是必须的),虚拟内存的作用更像TLB。所以偶一直建议大家启用虚拟内存。对于一些大容量内存的同学,也要尽量启用虚拟内存。不是关闭虚拟内存,系统就会运行更快。这是一个网路上流传甚广的歧义解读。

关闭虚拟内存让程序在实际内存中运行,需要几个前提条件,需要x64系统,只有x64系统才能更有效的管理、分配更多的内存地址。像一些x86系统开启或支持4G以上内存都是障眼法的过眼瘾,x86系统本身的内核出于稳定性的要求已经屏蔽了内存地址的扩展。(无论微软还是Linux都一样,不要听一些神人的通灵神释,如果Linux等x86内核本身支持Linux还出什么x64系统。)x86伺服器系统也是如此,只能看到更多的内存存在,(针对x86伺服器系统以前有几个专门优化的程序可以使用3g内存,现在基本已经绝种了)如我们都知道银行有许多毛爷爷,但你能把银行的钱拿来就用吗!第二个先决条件就是软件本身要支持、启用内存地址扩展,也就是x64位程序并编译到了可以启用更多的内存地址扩展,有些程序(偶就不说软件名了)只是包了x64皮的x86程序。。。。。

x86程序以Windows系统下为例为了最大兼容性先天就限制了内存地址的调用(“符合软件编写规则的程序都只能保存很小的数据块在内存中”),如xxx不能读、xxx不能写的报错就是内存地址不能供软件调用,x64程序内存地址还是有限制但通过内存地址扩展可使用更多内存,如PS
x64版软件可以使用128G以上内存容量。

内存无论有多大,都会在开机时被系统初始化,分配好数据空间(实际内存地址)。内存像一栋楼,楼中有许多房间,x86程序无论怎样只能住小房间,x64程序可以住大房间,像PS等x64程序可以包下整个单元。无论x86还是x64程序房间住满了可以将一些暂时不用的放到下房(或叫小仓房)虚拟内存中,如没有多出的只能先丢掉了

原文地址:https://www.cnblogs.com/l1pe1/p/8335043.html

时间: 2024-10-10 09:08:57

TLB与内存寻址,内存读取,虚拟内存的相关原理的相关文章

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

2.内存寻址

内存地址  三种内存地址:1)逻辑地址(机器指令中操作数或指令的地址) 分段单元 2)线性地址(虚拟地址)分页单元 3)物理地址(用于内存芯片级内存单元寻址 多CPU时,共享同一内存,RAM芯片由独立的CPU并发访问; 由内存仲裁器保证RAM的读写的串行执行      Linux中的分段  80X86才使用分段(把程序划分为逻辑相关的实体),Linux更喜欢使用分页(当所有进程使用相同的段Register值时,它们共享同样的一组线性地址,这样内存管理简单; RISC对分段的支持有限.). 两者都

内存寻址二(分页)

硬件中的分页 概念 分页单元(paging unit)把线性地址转换成物理地址.其中一个关键任务是把所请求的访问类型与线性地址的访问权限相比较,如果这次内存访问时无效的,就产生一个缺页异常. 为了效率起见,线性地址被分成以固定长度为单位的组,称为页(page).页内部连续的线性地址被映射到连续的物理地址中.这样,内核可以指定一个页的物理地址和其存取权限,而不用指定页所包含的全部线性地址的存取权限.通常使用术语"页"既指一组线性地址,又指包含在这组地址中的数据. 分页单元把所有的RAM分

内核基础 - 寄存器与内存寻址(by quqi99)

作者:张华  发表于:2016-03-01 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 汇编 汇编编译器assembler编译目标代码二进制文件(nasm -f elf -g -F stabs *.asm),连接器linker(ld -o bin_file *.o)除了把目标代码组合成一个单个的块,还要确保模块以外的函数调用能够指向正确的内存引用(连接器必须建立一个索引,也就是符号表,里面

内存寻址

当使用80x86微处理器时,我们必须区分三种地址: 1.逻辑地址(logical address) 包含在机器语言指令中用来指定一个操作数或者一条指令的地址.由一个段(segment)和偏移量(offset)组成. 2.线性地址(linear addres,也称虚拟地址 virtual address) 是一个32位无符号整型.是我们编程时接触到的都是这种. 3.物理地址(physical address) 用于内存芯片级内存单位元寻址. 内存控制单元(MMU)通过一种称为分段单元(segmen

Linux内存寻址

我会尽力以最简洁清晰的思路来写这篇文章. 所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程.因为操作系统要兼顾许多东西,所以也就变得复杂. 逻辑地址 → 线性地址 → 物理地址 逻辑地址 = 段 + 偏移量 因为:最开始cpu中的alu宽度只有16位,但地址总线宽度有20位.所以设置四个段寄存器:cs(指令),ds(数据),ss(堆栈),es(其它). 每个段寄存器16位,对应地址总线高16位.每条指令中的16位内部地址与某个段寄存器中内容相加,得到20位的实际地址. 上述的16位

Linux内存寻址之分段机制

http://blog.xiaohansong.com/2015/10/03/Linux内存寻址之分段机制/ .段的起始地址.段的长度等等,而在保护模式下则复杂一些.IA32将它们结合在一起用一个8字节的数表示,称为描述符 .IA32的一个通用的段描述符的结构从图可以看出,一个段描述符指出了段的32位基地址和20位段界限(即段长).这里我们只关注基地址和段界限,其他的属性略过. 段描述符表 各种各样的用户描述符和系统描述符,都放在对应的全局描述符表.局部描述符表和中断描述符表中.描述符表(即段表

Linux内存寻址之分页机制

http://blog.xiaohansong.com/2015/10/05/Linux内存寻址之分页机制/ 在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性-物理地址的转换过程.段机制把逻辑地址转换为线性地址,分页机制进一步把该线性地址再转换为物理地址. 硬件中的分页 分页机制由CR0中的PG位启用.如PG=1,启用分页机制,并使用本节要描述的机制,把线性地址转换为物

汇编第一节-寄存器与内存寻址

1. 内存寻址方式: 确定访问内存存储单元偏移地址方式,称为寻址方式. 名称 格式 直接寻址 [偏移量值] 寄存器简介寻址 [基址寄存器/变址寄存器] 寄存器相对寻址 [基址寄存器/变址寄存器+偏移量值] 基址变址寻址 [基址寄存器+变址寄存器] 相对基址变址寻址 [基址寄存器+变址寄存器+偏移量值] 2. 寄存器 普通寄存器:AX(AH,AL).BX(BH,BL).CX(CH,CL).DX(DH,DL).SP.BP.SI.DI 段寄存器:DS.SS.CS.ES 3.BX.SI.DI.BP寄存器