对TLB的理解
- 格式:docx
- 大小:45.47 KB
- 文档页数:3
宏定义和tlb
宏定义,别名宏代换,是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。
格式:#define标识符字符串,其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。
掌握"宏"概念的关键是“换”。
一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:#define PI 3.1415926,把程序中出现的PI全部换成
3.1415926。
TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。
TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。
如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。
TLB的作⽤及⼯作过程下⾯内容摘⾃《步步惊芯——软核处理器内部设计分析》⼀书页表⼀般都⾮常⼤,⽽且存放在内存中,所以处理器引⼊MMU后,读取指令、数据须要訪问两次内存:⾸先通过查询页表得到物理地址,然后訪问该物理地址读取指令、数据。
为了降低由于MMU导致的处理器性能下降。
引⼊了TLB,TLB是Translation Lookaside Buffer的简称,可翻译为“地址转换后援缓冲器”,也可简称为“快表”。
简单地说,TLB就是页表的Cache,当中存储了当前最可能被訪问到的页表项。
其内容是部分页表项的⼀个副本。
仅仅有在TLB⽆法完毕地址翻译任务时,才会到内存中查询页表,这样就降低了页表查询导致的处理器性能下降。
TLB中的项由两部分组成:标识和数据。
标识中存放的是虚地址的⼀部分,⽽数据部分中存放物理页号、存储保护信息以及其它⼀些辅助信息。
虚地址与TLB中项的映射⽅式有三种:全关联⽅式、直接映射⽅式、分组关联⽅式。
OR1200处理器中实现的是直接映射⽅式。
所以本书仅仅对直接映射⽅式作介绍。
直接映射⽅式是指每个虚拟地址仅仅能映射到TLB中唯⼀的⼀个表项。
如果内存页⼤⼩是8KB,TLB中有64项。
採⽤直接映射⽅式时的TLB变换原理如图10.4所看到的。
由于页⼤⼩是8KB,所以虚拟地址的0-12bit作为页内地址偏移。
TLB表有64项,所以虚拟地址的13-18bit作为TLB表项的索引。
假如虚拟地址的13-18bit是1,那么就会查询TLB的第1项,从中取出标识,与虚拟地址的19-31位作⽐較,如果相等。
表⽰TLB命中,反之,表⽰TLB失靶。
TLB失靶时,能够由硬件将须要的页表项载⼊⼊TLB,也可由软件载⼊,详细取决于处理器设计。
OR1200没有提供硬件载⼊页表项的功能,仅仅能由软件实现。
TLB命中时,此时翻译得到的物理地址就是TLB第1项中的标识(即物理地址13-31位)与虚拟地址0-12bit的结合。
tlb的组相联映射组相联映射(group associative mapping)是一种在TLB (Translation Lookaside Buffer)中用于实现虚拟地址到物理地址转换的技术。
在组相联映射中,TLB被划分为多个组,每个组包含多个条目(entry),每个条目存储了一个虚拟地址到物理地址的映射。
下面是一个详细的组相联映射的工作流程:1. TLB被划分为多个组,每个组包含多个条目。
组的数量和每个组的条目数量可以根据系统的需求进行设置。
2. 当CPU访问一个虚拟地址时,首先检查TLB中是否存在对应的映射。
TLB是一个高速缓存,存储了最近被访问的虚拟地址到物理地址的映射。
3. 如果TLB中存在对应的映射,则称为TLB命中(TLB hit),TLB会直接将物理地址返回给CPU,从而加快地址转换的速度。
4. 如果TLB中不存在对应的映射,则称为TLB未命中(TLB miss)。
此时,CPU需要从页表(Page Table)中获取对应的映射。
5. CPU首先从虚拟地址中提取页号(Page Number),然后使用页号去访问页表。
页表是一个存储在内存中的数据结构,用于记录虚拟地址到物理地址的映射关系。
6. 在组相联映射中,CPU在访问页表时,会根据页号的一部分(通常是低位)选择一个特定的组。
7. 在选定的组中,CPU会逐个比较每个条目的页号部分与所需的页号是否匹配。
如果找到匹配的条目,则称为组相联命中(group associative hit)。
8. 在组相联命中的情况下,CPU会将对应的物理地址返回给TLB,并将该映射添加到TLB中,以便下次快速访问。
9. 如果在选定的组中没有找到匹配的条目,则称为组相联未命中(group associative miss)。
此时,CPU需要从内存中获取对应的页表条目,并将其添加到选定的组中。
10. 组相联映射的优势在于可以提高TLB的查找效率。
通过将TLB划分为多个组,可以减少每次查找的范围,从而加快地址转换的速度。
tlb的组相联映射TLB(Translation Lookaside Buffer)是一种硬件缓存,用于加速虚拟地址到物理地址的转换过程。
TLB采用组相联映射的方式来存储虚拟地址到物理地址的映射关系。
组相联映射是一种将TLB划分为多个组的方式,每个组中包含多个条目(entry)。
每个条目由两部分组成:标记(tag)和数据(data)。
标记用于存储虚拟地址的高位,而数据则存储对应的物理地址和其他相关信息。
具体的组相联映射过程如下:1. 将虚拟地址分为三个部分:页号(page number)、页内偏移(page offset)和标记(tag)。
2. 使用页号作为索引,从TLB的组索引部分中找到对应的组。
3. 在该组中,将标记与TLB中的标记进行比较,以确定是否命中。
4. 如果命中,表示TLB中已经存储了该虚拟地址到物理地址的映射关系,可以直接从TLB中获取对应的物理地址。
5. 如果未命中,表示TLB中没有存储该虚拟地址到物理地址的映射关系,需要进行TLB miss操作。
6. TLB miss操作会触发一次内存访问,将虚拟地址转换为物理地址,并将转换结果存储到TLB中,同时替换掉一个旧的条目。
7. 下次再访问相同的虚拟地址时,就可以直接从TLB中获取到物理地址,不再需要进行TLB miss操作。
总结起来,组相联映射将TLB划分为多个组,每个组中包含多个条目。
通过比较标记,可以确定是否命中TLB。
如果命中,则可以直接获取物理地址;如果未命中,则需要进行TLB miss操作,将虚拟地址转换为物理地址并存储到TLB中。
这样可以加速虚拟地址到物理地址的转换过程,提高系统的性能。
计算机组成原理tlb
TLB是翻译后备缓冲器的缩写,是一种硬件缓存,用于存储最近使用的页表项。
它的作用是通过减少对主存储器的访问次数,提高程序的执行效率。
当CPU需要访问某个虚拟地址时,它首先在TLB中查找对应的物理地址,如果查找成功,则直接访问物理地址,否则CPU 将从主存储器中取出页表项,并将其存储到TLB中。
这个过程称为TLB缺失,会导致额外的访问延迟。
实现TLB的方式有两种,一种是直接映射,另一种是关联映射。
直接映射将虚拟地址的一部分作为标记,用于标识不同的页面,而物理地址的一部分则与标记相同。
这种方式简单易实现,但容易导致TLB缺失率较高。
关联映射则使用哈希表或其他数据结构,将虚拟地址与物理地址进行映射。
这种方式可以有效降低TLB缺失率,但需要更复杂的硬件支持。
总之,TLB是计算机组成原理中的重要概念之一,它在提高计算机性能方面起着至关重要的作用。
了解TLB的实现方式和使用方法,可以帮助我们更好地理解计算机系统的工作原理。
- 1 -。
TLB的基本概念:TLB:Translation lookaside buffer,即旁路转换缓冲,或称为页表缓冲;里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。
X86保护模式下的寻址方式:段式逻辑地址—〉线形地址—〉页式地址;页式地址=页面起始地址+页内偏移地址;对应于虚拟地址:叫page(页面);对应于物理地址:叫frame(页框);X86体系的系统内存里存放了两级页表,第一级页表称为页目录,第二级称为页表。
TLB和CPU里的一级、二级缓存之间不存在本质的区别,只不过前者缓存页表数据,而后两个缓存实际数据。
二:内部组成:1:TLB在X86体系的CPU里的实际应用最早是从Intel的486CPU开始的,在X86体系的CPU里边,一般都设有如下4组TLB:第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Data-TLB);2:TLB命中和TLB失败果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit);如果TLB中没有所需的页表,则称为TLB失败(TLB Miss)。
3:TLB条目数即页表条目数,Entry!4:TLB的联合方式1〉全联合方式:Athlon XP2〉4路联合方式:P4当CPU执行机构收到应用程序发来的虚拟地址后,首先到TLB中查找相应的页表数据,如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit),接下来CPU再依次看TLB 中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。
既然说TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(Entry),同样地,在TLB里边也缓存了同样大小的页表条目(Entry)。
详细解释下述术语的概念、功能及相互关系:虚拟地址、物理地址、MMU、页表、TLB、页框作业一1、详细解释下述术语的概念、功能及相互关系:虚拟地址、物理地址、MMU、页表、TLB、页框。
答:物理地址也叫实地址、二进制地址,它是在地址总线上,以电子形式存在的,使得数据总线可以访问主存的某个特定存储单元的内存地址。
虚拟地址也叫逻辑地址。
在和虚拟内存的计算机中,物理地址这个术语多用于区分虚拟地址。
尤其是在使用内存管理单元(MMU)转换内存地址的计算机中,虚拟和物理地址分别指在经MMU转换之前和之后的地址。
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
页表是系统为保证进程的正确运行而建立的页面映像表。
分页转换功能由驻留在内存中的表来描述,该表称为页表(page table),存放在物理地址空间中。
页表实现从页号到物理块号的地址映射。
TLB:Translation lookaside buffer,即旁路转换缓冲,或称为页表缓冲。
页表存储在主存储器中,查询页表所付出的代价很大,TLB的使用就是为了减小由于使用页表而付出的访存代价。
CPU中添加了能自动把虚拟内存(即逻辑地址)地址转化为物理内存地址的电路,为了简化这种电路,就把RAM划分为长度为4KB或8KB的块,这种块就叫页框。
联系:为了实现多道程序的并发处理以及充分利用内存,将内存划分长度为4KB或8KB的页框,页表记录了页框到物理地址的映射,为了加快CPU通过查询页表访问内存速度,使用了TLB;MMU负责虚拟地址和物理地址的映射。
作业二1、嵌入式系统开发中为何有重定向程序?作用?答:嵌入式系统需要在交叉环境中开发,在嵌入式系统实际应用中,往往嵌入式系统和主机调试环境是独立的,嵌入式系统的输入输出与主机的调试环境的输入输出不同,而嵌入式系统又想使用标准输入输出中的库函数,这时就要使用重定向技术,将标准的输入输出重定向为嵌入式系统的输入输出。
名词解释:(1)静态流水线——同一时间内,流水线的各段只能按同一种功能的连接方式工作。
(2)分段开采——当向量的长度大于向量寄存器的长度时,必须把长向量分成长度固定的段,然后循环分段处理,每一次循环只处理一个向量段。
(3)计算机体系结构——程序员所看到的计算机的属性,即概念性结构与功能特性(4)时间重叠——在并行性中引入时间因素,即多个处理过程在时间上相互错开,轮流重叠地使用同一套硬件设备的各个部分,以加快硬件周转而赢得速度。
(5)TLB——个专用高速存储器,用于存放近期经常使用的页表项,其内容是页表部分内容的一个副本(6)结构冲突——指某种指令组合因为资源冲突而不能正常执行(7)程序的局部性原理——程序在执行时所访问的地址不是随机的,而是相对簇聚;这种簇聚包括指令和数据两部分。
(8)2:1Cache经验规则——大小为N的直接映象Cache的失效率约等于大小为N /2的两路组相联Cache的实效率。
(9)组相联映象——主存中的每一块可以放置到Cache中唯一的一组中任何一个地方(10)数据相关——当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作的顺序,使得读/写操作顺序不同于它们非流水实现时的顺序,将导致数据相关。
(1)动态流水线——同一时间内,当某些段正在实现某种运算时,另一些段却在实现另一种运算。
(2)透明性——指在计算机技术中,把本来存在的事物或属性,但从某种角度看又好像不存在的特性。
(3)层次结构——计算机系统可以按语言的功能划分为多级层次结构,每一层以不同的语言为特征。
(4)资源共享——是一种软件方法,它使多个任务按一定的时间顺序轮流使用同一套硬件设备。
(5)快表——个专用高速存储器,用于存放近期经常使用的页表项,其内容是页表部分内容的一个副本。
(6)控制相关——指由分支指令引起的相关,它需要根据分支指令的执行结果来确定后续指令是否执行。
(7)存储层次——采用不同的技术实现的存储器,处在离CPU 不同距离的层次上,目标是达到离CPU最近的存储器的速度,最远的存储器的容量。
tlb的描述
tlb是一种高速缓存,用于在程序的局部性原理基础上,将虚拟地址页框与物理地址页框的映射关系进行缓存。
它通常被称为程序的局部性原理,即程序中经常访问的部分称为热点。
这种原理就是将tlb设计为只缓存经常访问的部分,以提高程序的运行效率。
tlb中存储的条目是虚拟地址的高20位到物理地址高20位的映射结果,实际就是从虚拟页框到物理页框的映射。
处理器不负责TLB的有效性,而是将维护工作交给操作系统开发人员。
当程序访问某一段地址时,它首先将虚拟地址转换成物理地址,然后通过tlb查找对应的映射结果。
如果在TLB中找不到对应的条目,则会发生TLB未命中,此时处理器会使用更慢的全局缓存来获取该地址的映射结果,然后将该结果存储在TLB中,以提高后续访问该地址的速度。
此外,TLB中的数据只是当前任务的部分页表,容量一般很小,需要定期刷新。
处理器提供了指令invlpg(invalidatepage)用于更新TLB中的某个虚拟地址对应的条目。
总的来说,tlb是程序运行过程中提高运行效率的重要工具,它基于程序的局部性原理,通过缓存映射关系,优化程序访问内存的速度,提高程序的性能。
1.For timing, you’ll need to use a timer such as that made available by gettimeofday(). How
precise is such a timer? How long does an operation have to take in order for you to time it precisely? (this will help determine how many times, in a loop, you’ll have to repeat a page access in order to time it successfully)
答:gettimeofday()的精度是微秒。
一个操作至少要耗费微秒以上才能被精确测量。
2.Write the program,called tlb.c, that can roughlymeasurethe cost of accessing each page.
Inputs to the program should be: the num- ber of pages to touch and the number of trials.
代码如下,测量时修改宏定义NUMPAGES(页数)和NUM_OF_MEASURE()(想要的测量次数)。
#include <stdio.h>
#include <sched.h>
#include <sys/time.h>
#define PAGESIZE 4096
#define NUMPAGES 1000//页数
#define NUM_OF_MEASURE 900//测量次数
#define jump 1024//jump=PAGESIZE/sizeof(int)//一页包含的int个数
static int a[NUMPAGES*jump];//大数组声明为全局变量
int main()
{
unsigned long mask=1;//将进程绑定到指定CPU上代码,但对我的单核虚拟机似乎没什么
必要
if(sched_setaffinity(0,sizeof(mask),&mask)<0)
{
perror("sched_setaffinity");
}
int i,j;
int long result;
struct timeval begin,end;
for(i=0;i<NUMPAGES*jump;i+=jump)//测量前的初始化
a[i]=0;
gettimeofday(&begin,NULL);//开始测量
for(j=0;j<NUM_OF_MEASURE;j++)//外层是测量次数
for(i=0;i<NUMPAGES*jump;i+=jump)//内层是页数
a[i]+=1;
gettimeofday(&end,NULL);//结束测量
result=__usec;
printf("Total Time Cost:%ld\n",result);
printf("Time Cost of Every Access:%lf\n",(double)result/NUM_OF_MEASURE/NUMPAGES);
printf("Number of Pages:%d\n",i/jump);
for(i=0;i<NUMPAGES*jump;i+=jump)//避免编译器过于聪明的解决方案
a[i]=0;
return 0;
}
3.Now writea scriptin yourfavorite scriptinglanguage (csh, python, etc.) to run this program,
while varying the number of pages ac- cessed from 1 up to a few thousand, perhaps incrementing by a factor of two per iteration. Run the script on different machines and gather some data. How many trials are needed to get reliable measurements?
答:我用了二重循环来进行测量,外层循环表示测量次数,内层是对每页中的一个数组项的访问。
经过多次测试,我觉得进行1000左右的测量是比较合理的。
4.Next, graph the results, making a graph that looks similar to the one above. Use a good tool
like ploticus. Visualization usually makes the data much easier to digest; why do you think
that is?
5.One thing to
watch out for is
compiler optimzation. Compilers do all sorts of clever things, including removing loops which incre- ment values that no other part of the program subsequently uses. How can you ensure the compiler does not remove the main loop above from your TLB size estimator?
答:在测量结束后写一部分代码去使用那个大数组中的项,我的实现就是在测量结束后对测量时访问过的那些项进行赋值操作。
6.Another thing to watch out for is the fact that most systems today ship with multiple CPUs,
and each CPU, of course, has its own TLB hierarchy. To really get good measurements, you have to run your code on just one CPU, instead of letting the scheduler bounce it from one CPU to the next. How can you do that? (hint: look up “pinning a thread” on Google for some clues) What will happen if you don’t do this, and the code moves from one CPU to the other?答:我是在虚拟机上编写的这个测试程序,虚拟机配置是只有一个CPU,所以本无需用特殊的代码就能避免CPU均衡负载而导致的调度。
但我也查找了一种把进程(不是线程)绑定到指定CPU上的方法,如下:unsigned long mask=1;
if(sched_setaffinity(0,sizeof(mask),&mask)<0)
{
perror("sched_setaffinity");
}
如果让测试程序跑在多个CPU上,我们知道,每个CPU有他自己的TLB,这样一来,当页数很大时,若这些页被分配到不同的CPU,则相当于他们有了更大的TLB,这样就无法准确的找出TLB大小的界限。
7.Another issue that might arise relates to initialization. If you don’t initialize the array a above
before accessing it, the first time you access it will be very expensive, due to initial access costs such as demand zeroing. Will this affect your code and its timing? What can you do to counterbalance these potential costs?
答:会影响。
第一次访问是肯定会导致TLB miss的,我们在测量时其实可以不用把它考虑在访问时间范围内。
所以我的做法是在测量前先进行初始化,这样对大家都公平。