
文 / Edward
1 馮諾依曼架構和哈佛架構
如果你學習過X86微機原理和匯編語言,你可能會依稀地記得,我們在用匯編語言開發X86代碼時,需要定義數據段,代碼段,堆棧段和擴展段,這些段定義好之后,將會在寫程序的時候有不同的用處。比如,當我們需要用到變量的時候,我們就需要將其定義到數據段里面,而我們代碼的主體開始,就是從代碼段的起始處開始的,在做子函數跳轉的時候,現場地址是被壓入堆棧段。如圖1-2-1所示。

圖1-2-1 匯編語言的分段
當一個程序從硬盤被拷貝到內存上面時,它的代碼編碼部分被安放在代碼段中,而這個程序運行時所需定義的一些變量,則會被安放在數據段中。這里需要注意的是,這里的段地址在X86機器上面都是邏輯地址,即使用段基址和偏移量組合所得到的地址。因此,如果需要操作數據段中的變量時,應當使用存儲器尋址,如直接尋址,間接尋址等方式。這里,我們還需要再知道的一點是,不管我們上述中的數據段還是代碼段,雖然它們的地址都是邏輯地址,邏輯地址都是存在同一塊物理地址上面的,只不過加了段標識進行段限定。這種數據存儲和代碼存儲都在同一個存儲器上面的計算機架構,被稱為“馮·諾依曼”架構。
“馮·諾依曼”架構的計算機在運行程序的時候,首先會把程序從硬盤拷貝到內存上面來,如果程序退出,那么這個內存將會被回收,以用于下一個程序的運行。這種情形是不是很適合我們的個人計算機運行程序?這個就是“馮·諾依曼”架構的最大好處,極大地有利于動態程序的加載。
然而“馮·諾依曼”架構由于程序存儲器和數據存儲器都位于同一塊內存,而每次數據吞吐的時候,CPU都會去讀取代碼和程序,因此會影響程序的運行速度,這個缺陷也就是所謂的“馮·諾伊曼”瓶頸。

圖1-2-2 馮·諾依曼結構示意圖
“馮·諾依曼”結構由于數據和程序都存儲在一片物理內存上,因此CPU運行程序的時候,這塊內存的讀寫接口無疑是非常復雜的。而且程序由于存儲在外部存儲器上面,因此在運行的時候,還需要先拷貝到內存中去運行,在一片單片機中,這無疑是非常不實用的。我們希望的是,將程序直接在程序存儲器中去運行,代碼運行時產生的變量數據,再將其存儲到內部存儲器上。這種需求催生了另一種計算機的結構,即“哈佛結構”。
在“哈佛結構”中,一個程序的代碼部分和數據部分是被獨立地放置在兩塊不同形式的存儲器上面的,存放代碼的存儲器叫代碼存儲器,一般都是ROM;存放數據的存儲器叫數據存儲器,一般都是SRAM,現在有一些可外擴SDRAM。由于代碼和程序是被存儲在兩個獨立的存儲器上面,因此每個存儲器和CPU之間的讀寫總線都是獨立的,這也意味著,CPU從程序存儲器中取指令和代碼尋址時的內存訪問可以完全獨立開來。哈佛結構的示意圖如圖1-2-3所示。

圖1-2-3 哈佛結構示意圖
哈佛結構與馮·諾依曼結構處理器相比,處理器有兩個明顯的特點:使用兩個獨立的存儲器模塊,分別存儲指令和數據,每個存儲模塊都不允許指令和數據并存;使用獨立的兩條總線,分別作為CPU與每個存儲器之間的專用通信路徑,而這兩條總線之間毫無關聯。
傳統的哈佛結構使用非常少,現在的都為改進后的哈佛結構,其結構特點為:
使用兩個獨立的存儲器模塊,分別存儲指令和數據,每個存儲模塊都不允許指令和數據并存,以便實現并行處理;具有一條獨立的地址總線和一條獨立的數據總線,利用公用地址總線訪問兩個存儲模塊(程序存儲模塊和數據存儲模塊),公用數據總線則被用來完成程序存儲模塊或數據存儲模塊與CPU之間的數據傳輸;兩條總線由程序存儲器和數據存儲器分時共用。
2 CISC和RISC
CISC的英文全稱為“Complex Instruction Set Computer”,即“復雜指令系統計算機”;
RISC的英文全稱為“Reduced Instruction Set Computer”,即“精簡指令集計算機”。
從字面上來看,CISC和RISC最大的區別就是指令的復雜程度。
51單片機是一種CISC,ARM-Cortex M3是一種RISC,然而如果你同時學習過51單片機匯編語言和ARM匯編語言的話,你就會發現,如果以指令數量或者指令結構的復雜程序來說,似乎ARM匯編比51匯編更加復雜。因為隨著計算機需求的發展,不管是精簡指令還是復雜指令,它必然要支持更多的協處理器,這就使得它們的指令數量都在增加。所以,根據指令的數量和復雜程度來區分RISC和CISC也不準確。
CISC內部為將較復雜的指令譯碼,也就是指令較長,分成幾個周期去執行,正因如此,開發程序比較容易(指令多的緣故),但是由于指令復雜,執行工作效率較差,處理數據速度較慢。
RISC指令位數較短,內部還有快速處理指令的電路,使得指令的譯碼與數據的處理較快,所以執行效率比CISC高,不過,必須經過編譯程序的處理,才能發揮它的效率。
CISC和早期RISC的區別如圖1-2-4所示。

圖1-2-4 CISC和早期RISC的異同
