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下没有指导,只有讨论,呵呵,共同进步