问一个很弱智的问题,线程如何跟TLB对应的
最近在看虚拟地址映射,说每个用户线程都对应一个tlb表,每次线程切换都会刷对应的tlb表,我的问题是,系统如何知道哪个线程和哪个tlb表是对应的,
查了很多资料没有找到,都是讲tlb如何转换的.
各位大侠给个资料看看也行,谢谢了. 个人理解:
线程的内存肯定都是内核分配的吧,PA和VA都是由内核决定的,自然VA-》PA的映射关系 内核是知道的吧;
这个映射关系也就是页表都会保存每个任务自己的task struck中吧,每次切换的时候只需要加载这个页表就ok了 本帖最后由 lamp_lighter 于 2014-08-22 14:16 编辑
TLB应该是一种硬件设备吧?它与Cache没有本质的区别,只是用法不一样。一个是用于地址转换,另一个用于缓存物理空间。
之所以每一次线程切换要刷新TLB(意思是除了保留部分,其他的页表项全部标为失效),是为了防止新的线程由于使用旧的页表而出现访存错误。
每个线程都对应一个TLB的意思也就相当于每个线程都有自己的页表项,自己的线性空间。TLB只是一种缓存机制 TLB是一种硬件,类似于cache,页表这个东西每个任务有一个,是存放在内存上面的;
而TLB就是缓存页表的一种硬件cache,如果在TLB里面能找到的话,就不用去访问内存上的页表了;速度能快很多
当任务发生切换时,VA->PA的映射关系发生了改变,所以需要更换页表,那么就需要让TLB上缓冲页表失效,否则
比如Task A的页表转换关系:0xF0000000-》0x30000000的;
task b的页表转换关系式 0xF0000000 -》 0x40000000;
由task a切到task b后,task b要访问0xF0000000这个虚拟地址,如果不让TLB失效的话,那么会访问到0x30000000这个物理地址,其实真正需要访问的是0x40000000这个物理地址; 页目录表作为tlb内容载入. 不知道你说的tlb表是啥,页表还是硬件tlb条目。如果是前者,楼上已经回答了;如果是后者,有些cpu体系,tlb条目里有个asid字段,由内核在进程切换时更新(加载),以区分tlb是属于哪个进程(组)空间。 不好意思,我说的不准确,其实我说的是页表,不是tlb.回复 4# wLiu2007
页表是放在内存里的,那么多页表怎么查找到正确的那一个,我的疑惑在这里..回复 6# chenyu105
回复 8# hwa_super
也许可以这样理解:
每个进程对应了一份页表,页表的基地址保存在进程的task struct中,进程切换时,每次都会把下一个进程task struct的页表基地址加载进来,作为“当前”进程页表。 寻址时,只会参考“当前”页表。
mm_struct里的pgd指向的地址就是进程页表首地址(虚拟地址),然后把这个虚拟地址对应的物理地址告诉MMU,然后MMU就会从这个新的地址中去查找VA PA的转换关系,就实现了页表切换
页:
[1]
2