risc(riduced instruction set computer)精簡指令集計算機
cisc(complex instruction set computer)複雜指令集計算機
所謂"體系結構",是指程式設計師在某cpu上進行程式設計時能夠使用的處理器資源,其中最重要的是處理器所提供的指令系統和暫存器組。注意體系結構 (architecture)和組成(structure)的區別:前者是處理器的邏輯抽象,是程式設計師關注的部分。後者是具體實現,一般為計算機系統設計人員關注。一般來說,arachitecture,structure是不同層次的概念,但兩者也有一定的聯絡。
以指令系統的設計為例:相同的指令系統可以通過「硬連線」或「微程式」的方法來實現。前者通過cpu的硬體電路來實現,後者通過"微程式"來實現。如果指令集以硬連線實現,那麼對於複雜指令來說,電路設計就非常困難;反之,若用微程式來實現指令集,可以實現複雜指令。現代cisc處理器一般都使用微碼來實現。
在使用微碼技術的處理器中,實際存在著兩套不同層次的指令:一套是面向程式設計師的,高層的指令;一套是面向硬體實現的,底層的微碼。在指令與微碼之間存在著乙個「直譯器」,它將指令翻譯成對應的微碼序列。由此可以想象,指令與微碼之間的關係實際上時「子程式呼叫」思想的推廣。
對於cisc和risc的實現而言, 它們所側重的複雜性不同: cisc處理器的實現複雜性更高, 而risc編譯器的複雜性更高.
微碼相對於指令的特點:
1,微碼代表的都是非常簡單的基本操作,而指令可能非常複雜。
2,微碼的取指操作很快:所有的微碼都位於rom中,而指令位於記憶體中。[note_1]
3,微碼的格式很規則,簡單。因此易於解碼。
4,微碼的執行速度很快,而指令相對較慢。
從處理器架構來看,可以將使用微碼技術的現代cisc的基本單元視為乙個快速的risc核心。這樣問題就出來了:如果不引入「直譯器」,而直接使用 risc微碼作為指令,那會怎樣呢?——這正是risc的思想。
下面我們來看看使用微碼實現的cisc指令集的優缺點:
cisc指令集又複雜化的傾向,即向高階語言看齊,處理器廠商紛紛提供一些功能強大的複雜指令,例如:intel針對x86處理器在move基礎上提供了 「成串」move指令,可以將記憶體中資料按位元組成塊複製,相當於:
while (n--) *dest++ = *src++;
這方便於複製資料結構。對於其他的複雜操作,也可以通過一條指令就實現。cisc複雜指令的定址方式也種類繁多,運算元可以直接來自記憶體。但複雜指令為現代處理器技術中廣泛使用的流水線技術引入了問題:在微處理器中指令的執行一般分為「預指」,「取運算元」,「運算」,「存放」等操作。對於cisc 複雜指令,他們的執行時間各不相同[note_2](有的可在4,5個時鐘週期內完成,有的卻需要幾十個,即便對於簡單指令,也會由於定址方式的不同造成不同的執行時間)。更糟糕的是,指令長度也不一致,同一指令的長度也會因不同的定址方式而變化。針對這些指令,如何設計流水線長度呢?若按最短指令設計流水線,當碰到複雜指令時流水線就會發生中斷;若按最長指令設計流水線,執行較短指令時就會跳過某些工位,使流水線不能完全充滿。
針對上述情況,以及20-80定律(80%的情況下執行的是佔指令集20%的常用指令)。多數複雜指令很少用到。當使用高階語言進行程式設計時,編譯器為了相容早期的cpu,一般不會生成特殊的複雜指令。如果捨棄這些不常用的複雜指令,就能簡化cpu的設計。這正是risc的出發點。
risc的特點
1,risc指令系統較小:種類的數量較少,只提供簡單指令。這些指令大多都能在4,5個時鐘週期內完成。
2,指令的運算元必須預存於暫存器中,這樣取指操作的時間也統一了。
3,指令長度,定址方式,格式都整齊劃一:這樣可以充分利用流水線,基本上可實現乙個時鐘脈衝執行一條指令的目標。
4,risc的子程式呼叫與cisc的不同:在cisc中,程式呼叫、返回時需將上下文儲存在堆疊中,需要記憶體操作。而risc將它們存放在暫存器中,而且引數也使用 暫存器傳遞。(若存在巢狀的子程式呼叫,中間呼叫過程中的上下文還是要從暫存器"濺出"(spill)到堆疊中,而"葉"子程式不需要。)
5,risc中斷可視為特殊的子程式鏈結:cisc中發生中斷時,所有的暫存器內容都被壓入堆疊,而risc對中斷進行區分對待,分為輕量級和重量級。對輕量級中斷 只儲存需要儲存的暫存器內容;對重量級中斷的處理如同常規中斷。
6,risc都採用流水線、快取記憶體、不使用微碼。
當然,risc也有它的缺點:**密度不高,可執行檔案體積較大,彙編**可讀性較差。**密度不高是個值得關注的問題:若不使用cache,會需要更大的指令儲存空間,取指時也占用更大的儲存器頻寬。若採用cache,又會降低cache的命中率。
risc vs arm
作為risc的新秀,arm有它自己的特點。下文介紹arm與risc的比較,並歸納一下人們對risc概念理解的誤區:
arm的獨特
1,arm可提供壓縮形式的指令集:thumb,它將arm指令集的乙個子集編碼為16位指令。處理器在執行時可以切換到執行thumb指令模式。
2,在算術指令中,可以將第二運算元在運算之前移位(如:ldreq r0,[r1,r2,lsr #16]!)。注意:移位通過組合電路完成,而不需時鐘脈衝的作用,所以不影響指令執行時間。
3,arm支援指令的條件執行。一般處理器都只支援指令的條件轉移。條件轉移會使已在流水線中的後續指令作廢,使流水線"斷流",而條件執行避免了此情況。(當乙個條件執行部分的大小超過3條指令時,還是使用條件轉移指令為好)。
4,指令的執行結果是否影響程式狀態暫存器中的標誌位由程式設計師決定:在操作碼後加上s(如:add - adds)就可以使運算結果改變標誌位。
對risc,cisc看法的誤區
1,risc指令都是簡單指令。
看看前面的ldreq r0,[r1,r2,lsr #16]!指令,它的強大使一般的cisc處理器也望塵莫及。risc的"簡單"之處,在於指令集的執行時間、指令長度、指令格式整齊劃一。
2,cisc的複雜指令速度慢、執行效率很低。
現代的cisc處理器具有非常長的流水線(piii採用了25級的流水線),對指令的執行作了充分的優化。但risc的優勢在於:不管是老的cpu,還是新的cpu,指令執行時間都是相同的,不需要在對指令執行作出優化。而同樣的複雜指令,在cpu時鐘頻率相同的情況下,在piii上的執行週期可能比在 386上的執行周期短很多。即cisc處理器通過對處理器的不斷優化來提公升指令提公升速率,同樣的指令,關注其執行速度時,就要考慮到採用何種cpu,而 risc則不然。
3,risc處理器比cisc處理器需要更多的暫存器.
這不是乙個需求問題,而是乙個實現問題:risc處理器設計比cisc簡單,處理器占用較少的空間,從而騰出了空間來放置暫存器。cisc也可以由很多暫存器(68000擁有和arm同樣多的暫存器)。當然,這個觀念也完全錯誤,就risc的程式設計來說,它需要比較多的暫存器。
4,risc都有流水線。
arm2就沒有採用流水線。
總之,risc處理器設計的簡單性使得risc處理器在體積、功耗、散熱、造價上都有優勢。
[note_1] 哈佛結構,馮.諾依曼結構介紹:
馮.諾依曼(von neumann)指出:程式只是一種(特殊)的資料,它可以像資料一樣被處理,因此可以和資料一起被儲存在同乙個儲存器中——這就是著名的馮.諾依曼原理。
現代的通過計算機都是基於馮.諾依曼結構:可執行程式映象位於磁碟中,執行時,os將它載入到記憶體中。
但在用於i/o比較頻繁,i/o資料量大的情況下(比如網路處理器),馮.諾依曼結構就引入了瓶頸:設想一下,當外設發起乙個dma請求並得到cpu的許可時,匯流排被外設所占用,cpu暫時放棄了對匯流排的控制,它無法訪問記憶體來取指。早期未實現流水線的cpu採用"週期挪用"技術,利用cpu訪問記憶體的空閒時鐘週期進行dma,解決了cpu與dma在匯流排上相互排斥的問題。但隨著流水線的採用,特別時在risc處理器中,cpu在取指的同時也執行指令,記憶體訪問已經沒有空閒的時鐘週期了。對於擁有較多暫存器的risc處理器來說,資料往往就位於暫存器中,在進行dma的時候,cpu可以執行指令。但當 cpu從記憶體中取指時,由於匯流排被外設占用,流水線被破壞。
針對上述問題,哈佛結構也許是個解決辦法:在嵌入式系統中,傾向於採用分別使用程式和資料兩個儲存器、兩條匯流排的"哈佛結構"。在哈佛結構下,即使資料匯流排被占用,cpu也能進行取指(當cpu需要訪問資料記憶體時,它不得不停下來)。
實際上,現代處理器都廣泛採用了快取技術,取指、取資料都通過cache來進行。對cache,也可分為哈佛結構和馮.諾依曼結構:是採用乙個統一的 cache,還是分成資料和程式兩個cache(這種情況被稱為改進的哈佛結構)?在採用了流水線的cpu中,理想情況下cpu在每個時鐘週期都需要取指,如果同時流水線中執行的指令需要訪問記憶體,那兩者就相互衝突了。要麼讓流水線暫停一拍,不取指;要麼採用哈佛結構的cache,取指和訪內井水不犯河水。
[note_2] 關於週期的概念:
執行一條指令所需要的時間稱為指令週期,指令週期常常用若干個時鐘週期來表示。
時鐘脈衝的重複週期稱為時鐘週期,時鐘週期是cpu的基本時間計量單位,它由計算機主頻決定。
乙個cpu同外部裝置和記憶體儲器之間進行資訊交換過程所需要的時間稱為匯流排週期。
RISC CISC 和 ARM處理器
risc riduced instruction set computer 精簡指令集計算機 cisc complex instruction set computer 複雜指令集計算機 所謂 體系結構 是指程式設計師在某cpu上進行程式設計時能夠使用的處理器資源,其中最重要的是處理器所提供的指令系...
arm處理器模式和arm處理器狀態的區別
arm處理器狀態 arm微處理器的工作狀態一般有兩種,並可在兩種狀態之間切換 第一種為arm狀態,此時處理器執行32位的字對齊的arm指令 第二種為thumb狀態,此時處理器執行16位的 半字對齊的thumb指令。在程式的執行過程中,微處理器可以隨時在兩種工作狀態之間切換,並且,處理器工作狀態的轉變...
ARM處理器模式
cpsr暫存器 arm v4的cpsr暫存器 和儲存它的spsr暫存器 中的位分配如下圖所示。處理器模式決定了哪些暫存器是活動的以及對cpsr訪問權。處理器模式要麼是特權模式,要麼是非特權模式。特權模式允許對cpsr的完全讀 寫訪問 與些相反,非特權模式只允許對cpsr的控制域進行讀訪問,但允許對條...