我和一位朋友的討論

2021-08-25 01:27:17 字數 1877 閱讀 7975

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...