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下沒有指導,只有討論,呵呵,共同進步
我多想有一位這樣的朋友
我多想有一位這樣的朋友 在對方痛苦得無法自拔時 可以放下平日的瀟灑,尊嚴和好強 在對方面前放聲痛哭 我多想有一位這樣的朋友 在傷心落淚時,能真正安撫對方受傷的心靈 我多想有一位這樣的朋友 彼此會因為對方的鼓勵找回自信 而積極的生活,努力的工作 讓彼此看到對方是乙個有陽光,有魅力的人 我多想有一位這樣...
php blog 感謝一位朋友
去年的某個時候 yangfan 給了我乙個他的blog鏈結,看到blog介面的時候,有種清馨的感覺。這個blog做得不錯。後來一次吃飯的時候,他說是自己花了乙個星期寫的。很好很強大 就一直追問著向他要乙份源 不過後來大家都很忙,慢慢的就把這個事情給淡忘了。到最近看到自己的網域名稱上只是空空的幾個簡單...
原碼一位乘法和補碼一位乘法
原碼乘法遵循的規則如下 比如 a 0.1101,b 0.1011,求a b的積?詳細計算過程如下圖 符號位與符號進行計算.a的符號位為 1,b的符號位為 1.兩個符號進行異或運算最後的符號仍然是 1.數值位乘以數值位.a 0.1101,b 0.1011.我們採用雙符號位來進行計算.a 00.1101...