讀書筆記 計算機系統--系統架構與作業系統的高度整合 第二章處理器體系結構
處理器設計所圍繞的兩個問題:
指令集設計(軟體)
機器結構設計(硬體)
第二章為指令集設計,第三章為機器結構設計。
指令集設計所受影響:
程式語言(精度,定址模式,跳轉指令)
應用(科學計算 -> 應用)
作業系統(記憶體管理,程式的不連續性)
指令集如何設計:
早期,硬體可否實現 -> 如今, 是否實際有用。
*能否有利於高階語言編寫高效而緊湊的程式。-----------一
*要優雅,體系結構---------------------------------------------二
一:指令集與高階語言
高階語言的功能集:
表示式和賦值語句-------------------------------------------(一)
高階資料抽象-------------------------------------------------(二)
條件語句和迴圈----------------------------------------------(三)
過程呼叫-------------------------------------------------------(四)
(一)表示式和賦值語句
a = b + c;
add a, b, c;高階語言(上)都可以對映為指令(下),稱為雙運算元指令(兩個運算元產生一個結果),也稱為三運算元指令(兩個源運算元和一個目的運算元)
所有的 算數/邏輯運算 來說,運算元都在處理器的暫存器中:
1、算數/邏輯運算用的ALU在處理器中,位置更接近。
2、運算元的可定址性,如果運算元在記憶體中,隨著記憶體大小的增加,記憶體的唯一定址的地址大小也增加,指令大小也會增加。
暫存器數量必須較小,以限制定址的位數,並引入定址模式,暫存器定址。
將運算元從記憶體搬到暫存器需要兩條指令:
載入:ld r2, b; r2 <- b
儲存:st r1, a; a <- r1
將運算元搬到暫存器而不是直接使用記憶體運算元的好處:重用速度快(d=a*b+a*c+b*c;)
為了防止在從記憶體搬運的地址運算元的長度不受運算元可定址性的影響,引入基址加偏移量定址模式。
ld r2, offset(rb); r2 <- MEM[rb + offset]
約定,一個字32位,半字16位,位元組8位
運算元寬度與其精度有關:
精度越低記憶體中佔用空間就越小,在算數/邏輯運算時還有一定的時間優勢。
運算元精度最好恰好滿足型別需求。
指令集應該包含不同精度運算元:
ld r1, offset(rb); 從地址offset+rb處裝一個字到r1中
ldb r1, offset(rb); 從地址offset+rb處裝一個位元組到r1中
可定址性:與前面的不同,這裡的可定址性指的是記憶體中能被定址的最小精度,因為不可能一位一位定址。
位元組序,一個字中的各個位元組排列的順序:
0x11223344
大端模式,高位在小地址
小端模式,高位在大地址
宣告某種資料型別,不要用別的精度訪問,因為位元組序。在網路有關程式碼需要在不同機器上使用格式轉換來回切換。
程式在記憶體中佔據的空間被稱為記憶體印記。
如果資料結構中有多種不同精度的變數,打包很有意義,保證沒有空間浪費。
例:struct {char a;char b[3];}可能為這種佈局
浪費了50%的儲存空間,有效的編譯器會將這種情況打包為
上面除了節省空間外,還能減少處理器和記憶體之間的訪問次數,非常高效。
但打包並非總是正確的途徑:
struct {char a; int b;} char一個位元組,int四個位元組,可能為
lsb為低位,msb為高位
上面這種非常低效,為了讀取int,需要訪問兩次,所以往往要求運算元從可定址地址開始。這就是對齊限制。
所以編譯器會使用
儘管浪費了37.5%空間,但變得更加高效了。
明天繼續寫。。。