CPU在訪問記憶體期間,它在幹什麼事?

時間 2021-06-02 04:59:46

1樓:

以8086為例,如下圖

CPU是不知道它使用的RAM或者外設是會在幾個時鐘週期內返回資料的,所以8086晶元上有乙個稱之為READY的引腳,當CPU發出讀/寫請求之後,之後每次時鐘上公升沿都去檢測一下這個READY引腳是否為高電壓,如果不是的話,就需要讓內部暫存器停止隨時鐘進行更新,具體的停止方式,其實就相當於讓暫存器的使能訊號為0,不允許寫入即可(也就是說READY訊號為0時,內部暫存器,包括程式計數器的使能訊號就為0,這個還是很好實現的)。

可是問題是8086的READY訊號本身也是乙個輸入訊號,它是如何產生的呢?它依靠另一塊稱之為8284的晶元產生的READY輸出訊號,這個8284的晶元產生的READY輸出訊號又是依賴自己的RDY輸入訊號產生的,如上圖所示,8284的RDY輸入訊號是連線到乙個稱之為Wait State Generator的裝置上。

接下來的問題就是這個Wait State Generator是個神馬玩意兒,它可以長這樣:

看著有點兒複雜喔,其實核心裝置就是乙個74LS164移位暫存器,上圖中的移位暫存器有QA~QH8個輸出,我們可以認為的調節乙個稱之為「Jumper」的東西,如上圖所示,Jumper指的就是QE和J4連線的那條線,針對裝置的延遲時間不同,我們可以人為的調節Jumper的位置(這裡需要注意,RAM自己是不會直接給8086或者8284反饋說自己讀取/寫入完畢的,只是我們使用這個RAM的人知道這個RAM的延遲時間是幾個時鐘週期,然後再去人為的調節Jumper的位置),比方說我們知道目前的RAM延遲是4個時鐘週期,就講Jumper放置到J4的位置。

初始情況下,74LS164移位暫存器的CLR清零訊號是1,導致各個輸出也就是QA~QH都是0,這樣8284接收到的RDY訊號就是0。然後CPU執行了讀/寫RAM的指令,也就是圖中的RD或者WR(當然圖中都是有上劃線的,我不知道咋打出來)訊號就發生了變動,導致移位暫存器的CLR清零訊號不為0,這樣每個時鐘週期的上公升沿到來後,QA,QB,QC。。。這些輸出依次為1,直到4個時鐘週期過後,QE為1,而QE是與8284的RDY相連的,就導致RDY為1,RDY為1後,8284又會讓它的READY輸出為1,它的READY輸出又連線到了8086的READY輸入,這樣8086就知道了可以讀取RAM中的資料了,並且不再冰封內部的各個暫存器,一切繼續執行。

(注意:上邊的表述省略了很多東西,有一些小地方可能會有錯誤,不過大致的原理就是這樣的,CPU不知道RAM何時會返回資料,我們使用不同的RAM,就可以根據它們自身的延遲時間來調節Wait State Generator的值,從而讓CPU知道該等幾個時鐘週期。)

2樓:

暫存器資料的更新依賴時鐘沒錯,但是由於指令的執行需要從外部儲存模組讀取指令執行需要的資料,這個時間會比較久。cpu在這段時間啥也不幹,雖然時鐘仍然在跑,但是暫存器的資料會hold住。即使時鐘在翻轉,暫存器的資料也不會發生改變,直到從外部儲存器讀回指令執行所需要的值之後cpu才會繼續執行。

為了解決這個問題,我們發明了一種叫cache的東西來加快這個流程,這個流程比較複雜,你暫時不用管。

還有,多思考,不要逮著別人問。人家好心給你解釋cache的工作流程,你問他從哪看到。我覺得這種常識性的東西,你這麼反問人家有點不尊重人家了哈

你看人家朱同學都不想搭理你了。

CPU和GPU記憶體訪問會衝突嗎?

孫林 不會衝突。CPU和GPU都通過記憶體控制器 MCU 訪問記憶體。他們可以同時訪問記憶體控制器,然後再到記憶體。對於記憶體控制器來說是CPU還是GPU來訪問他沒有區別。就好比是多個CPU核心在訪問MCU一樣,並不會有什麼衝突。至於速度,按照我的理解,CPU到記憶體頻寬一般不是瓶頸 CPU本身的速...

組合語言訪問的是虛擬記憶體還是物理記憶體?

喜歡烘焙的灰大叔 虛擬記憶體還是物理記憶體訪問不僅是組合語言的問題,只要涉及指標或記憶體位址訪問的語言都會有,比如C語言也會有。這個問題本質上是晶元 x86也好,arm也好 的MMU 記憶體管理單元 引起的,沒有MMU的晶元 比如STM32 的記憶體訪問總是物理記憶體,或者MMU被關閉的晶元,記憶體...

CPU是否會直接訪問L2 cache?

取決於CPU微架構的設計。有的CPU設計要求L1 miss,從L2返回line fill之後,訪存指令必須再訪問一次L1拿資料。有的CPU可以在收到line fill的同時把資料也發給MSHR 或者類似的結構 而不需要相關指令再次訪存。ARM還有乙個Write Streaming Mode,發現特定...