Other说:呵呵 我刚想了会 又有点糊涂了
我说:哪个地方糊涂?
Other:还是预取的地方 假如内核线程不主动访问用户空间
Other:既使有预取 也不能绕过进程切换啊
我说:是的,一般都不会主动访问用户空间,可是Intel的cpu就是这么弄巧成拙
Other:不会吧 要去访问用户空间肯定是切换到另一个进程了
Other:它能绕过这个切换去访问用户空间?
我说:可以绕过的,比如cpu预取一个地址,但是地址不在tlb,那么预取逻辑等待该地址进入tlb,此时该地址的页面被释放然后分配到别的cpu并且写入了数据,此时预取逻辑等到了这个地址,可是已经不是它想要的了
我说:预取逻辑和执行逻辑不是一回事
我说:最最关键的是,那个cpu将这个地址的作为页表理解的Global位写为1,此时终于flush tlb了,但是由于预取逻辑等到的那个pte的global为1,因此就逃过了flush,直到非法指令出错
Other:为什么会把global位写1?
我说:不一定啊,但是一旦写为1就会出错,不为1的话,在接下来迟到的flush中就刷掉了,不会出错
Other:哦 明白迟到的flash就比如执行逻辑的进程切换 只能刷global不为1的我说:正确
我说:举个例子吧,cpu的pc寄存器指示着下一条指令,那么这个下一条指令从哪里来呢?实际上是从预取队列里来的,预取逻辑这个时候跑到了哪里是由预取队列的长度决定的,说不定已经跑到了内核线程调度完毕后的用户进程中,预取,顾名思义就是预先获取,肯定比当前的执行序跑得远,而且是基于分支预测的预取,并不能保证正确
我说:有些cpu就比intel的好,比如在特权模式下就不再预取,这样就省去了内核线程刷新tlb的麻烦
Other:那要保证预取前就flush一下 即所有改变页表必须马上
Other:如果载入的是init的pgd那预取逻辑 会怎么样?
Other:这时tlb没什么对应的地址载入
我说:就不再预取用户指令了,因为它的页目录前768不存在有效数据
我说:cpu的预取非常复杂,不是linux内核代码可以解释的,必须看cpu的手册或者着microcode,每个cpu都有分支预测机制,非常繁杂的一套体系,intel的五卷本手册上有详述
Other:哦 那就等于预取挂在那里了? 难怪你说别的CPU在这种情况下不预取
我说:intel总是弄巧成拙的,就比如它的HT技术一样
Other:这种机制不是很好?
Other:叫smt?
我说:可能是挂在那里,但是也不一定,和cpu内部的逻辑连线有关的
我说:intel的机制我不是很喜欢,smt机制真的不好,至于超长预取队列不是很好,超长流水线,估计没有几个人说好的吧,呵呵
Other:恩 明白了 总之不会往里面填错误的指令就是
我说:是的
Other:但这种内部多硬件线程不是发展趋势么? sun的t2据说就很好
我说:CMP是趋势,可是smt共享运算逻辑,共享缓存,会造成大量的冲突和锁
Other:cmp现在基本都很成熟了 现在大都每个核里面都还有硬件线程或逻辑cpu,据说就是为了解决共享冲突才引入的
Other:具体原理我还不懂
我说:Intel的HT是硬件多线程吗?我没有看出它能带来性能提高,不过众口难调啊,呵呵
Other:好像是一种 intel不是发行了新cpu嘛 好像又把HT加回去了
Other:本来core 2中好像去掉了的
Other:呵呵 我快到家了
我说:新的cpu不是netburst的架构的,是Core架构的,其实我觉得就是P5,这样的HT已经不是Netburst的HT了
Other:哦 我分不清楚
我说:我也该走了,呵呵,有时间继续讨论
Other:呵呵 没什么讨论的 我很菜的 都一直你指导我了
我说:linux下没有指导,只有讨论,呵呵,共同进步