本章主要介紹了處理器硬件的設計。函數
1.Y86-64 有8個程序寄存器:%rax,%rcx,%rdx,%rbx,%rsi,%rdi,%rsp,%rbp 和 %r8 到 %r14(少了 %r15)。%rsp 被入棧、出棧、調用和返回指令做爲棧指針,其它寄存器沒有固定的含義或固定值。
2.每條指令的第一個字代表指令的類型,高4位是代碼部分,低4位是功能部分。
3.rmmovq %rsp,0x123456789abcd(%rdx)中偏移量要放在8字節的常數字中,因此得先填充0變成8字節,而後再按反序輸出,最後字節編碼爲 4042cdab896745230100。學習
1.要實現一個數字系統須要三個主要組成部分:
1)計算對位進行操做的函數的組合邏輯
2)存儲位的存儲器單元
3)控制存儲器單元更新的時鐘信號
2.邏輯門是數字電路的基本計算單元,只對單個位的數字進行操做,而不是整個字。
3.將不少的邏輯門組合成一個網,就能構建計算塊,稱爲組合電路。構建這些網時,兩個或多個邏輯門的輸出不能連在一塊兒且這個網必須是無環的。
4.爲了產生時序電路,必須引入按位存儲信息的設備。一類是時鐘寄存器(簡稱寄存器),儲存單個位或字。另外一類是隨機訪問儲存器(簡稱儲存器):儲存多個字,用地址選擇該讀/寫哪一個字,例子包括處理器的虛擬內存系統和寄存器文件。
5.每當每一個時鐘到達上升沿時,值纔會從寄存器的輸入傳送到輸出。
6.若是咱們試圖同時讀和寫同一個寄存器會發生什麼?咱們會看到一個從舊值到新值的變化。編碼
1.處理一條指令包含不少操做,將它們組織成某個特殊的階段序列。分爲如下幾個階段:
1)取指:取指階段從存儲器讀取指令字節,地址爲程序計數器(PC)的值
2)譯碼:譯碼階段從寄存器文件讀入最多兩個操做數,獲得val A 和 / 或 val B
3)執行:執行階段,算術/邏輯單元要麼執行指令明確的操做(根據ifun的值),計算存儲器引用的有效地址,要麼增長或減小棧指針。獲得的值爲valE
4)訪存:訪存階段可將數據寫入存儲器或從存儲器讀出數據
5)寫回:最多可寫兩個結果到寄存器文件
6)更新PC:將PC設置成下一指令的地址
2.要控制處理器中活動的時序,只須要寄存器和內存的時鐘控制。經過時鐘週期來控制元素的更新,經過組合邏輯來傳播,每次時鐘週期由低到高時,處理器開始執行一條新指令。處理器歷來不須要爲了完成一條指令的執行而去讀該指令更新了的狀態。設計
1.流水線階段之間的指令轉移是由時鐘信號來控制的。每隔120ps信號從0上升至1,開始下一組流水線階段的計算。
2.流水線的侷限性:
1)不一致的劃分:因爲階段的延遲並不同,這樣空閒的空間就增長了延遲
2)流水線過深,收益反而降低指針
1.對SEQ中五個階段的順序進行調整,使得更新PC階段在一個時鐘週期開始時執行,而不是在結束時才執行。
2.數據相關和控制相關可能會致使流水線產生計算錯誤,成爲冒險。首先關心數據冒險,而後再考慮控制冒險。
3.避免數據冒險的方法:
1)暫停:將指令阻滯在譯碼階段,至關於加入一條nop指令,直到產生它的源操做數指令經過了寫會階段。
2)轉發:將結果值直接從一個流水線階段傳到較早階段。
4.異常處理方法:
1)由流水線最深的指令引發的異常,優先級最高
2)多條分支中有異常,取消預測指令
3)根據狀態碼stat發現異常,禁止其餘指令更新程序狀態內存