hwa_super 发表于 2014-08-22 11:46

问一个很弱智的问题,线程如何跟TLB对应的

最近在看虚拟地址映射,说每个用户线程都对应一个tlb表,每次线程切换都会刷对应的tlb表,

我的问题是,系统如何知道哪个线程和哪个tlb表是对应的,

查了很多资料没有找到,都是讲tlb如何转换的.

各位大侠给个资料看看也行,谢谢了.

Huntsmen 发表于 2014-08-22 14:02

个人理解:
线程的内存肯定都是内核分配的吧,PA和VA都是由内核决定的,自然VA-》PA的映射关系 内核是知道的吧;
这个映射关系也就是页表都会保存每个任务自己的task struck中吧,每次切换的时候只需要加载这个页表就ok了

lamp_lighter 发表于 2014-08-22 14:14

本帖最后由 lamp_lighter 于 2014-08-22 14:16 编辑

TLB应该是一种硬件设备吧?它与Cache没有本质的区别,只是用法不一样。一个是用于地址转换,另一个用于缓存物理空间。
之所以每一次线程切换要刷新TLB(意思是除了保留部分,其他的页表项全部标为失效),是为了防止新的线程由于使用旧的页表而出现访存错误。

每个线程都对应一个TLB的意思也就相当于每个线程都有自己的页表项,自己的线性空间。TLB只是一种缓存机制

wLiu2007 发表于 2014-08-22 14:39

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这个物理地址;

smalloc 发表于 2014-08-22 14:41

页目录表作为tlb内容载入.

chenyu105 发表于 2014-08-22 14:50

不知道你说的tlb表是啥,页表还是硬件tlb条目。如果是前者,楼上已经回答了;如果是后者,有些cpu体系,tlb条目里有个asid字段,由内核在进程切换时更新(加载),以区分tlb是属于哪个进程(组)空间。

hwa_super 发表于 2014-08-22 15:39

不好意思,我说的不准确,其实我说的是页表,不是tlb.回复 4# wLiu2007


   

hwa_super 发表于 2014-08-22 15:51

页表是放在内存里的,那么多页表怎么查找到正确的那一个,我的疑惑在这里..回复 6# chenyu105


   

chenyu105 发表于 2014-08-22 16:04

回复 8# hwa_super
也许可以这样理解:
每个进程对应了一份页表,页表的基地址保存在进程的task struct中,进程切换时,每次都会把下一个进程task struct的页表基地址加载进来,作为“当前”进程页表。 寻址时,只会参考“当前”页表。

   

arm-linux-gcc 发表于 2014-08-22 16:10

mm_struct里的pgd指向的地址就是进程页表首地址(虚拟地址),然后把这个虚拟地址对应的物理地址告诉MMU,然后MMU就会从这个新的地址中去查找VA PA的转换关系,就实现了页表切换

页: [1] 2
查看完整版本: 问一个很弱智的问题,线程如何跟TLB对应的