1、馮諾依曼架構(gòu)和哈佛架構(gòu)
如果你學(xué)習(xí)過X86微機(jī)原理和匯編語言,你可能會依稀地記得,我們在用匯編語言開發(fā)X86代碼時,需要定義數(shù)據(jù)段,代碼段,堆棧段和擴(kuò)展段,這些段定義好之后,將會在寫程序的時候有不同的用處。比如,當(dāng)我們需要用到變量的時候,我們就需要將其定義到數(shù)據(jù)段里面,而我們代碼的主體開始,就是從代碼段的起始處開始的,在做子函數(shù)跳轉(zhuǎn)的時候,現(xiàn)場地址是被壓入堆棧段。如圖1-2-1所示。
圖1-2-1 匯編語言的分段
當(dāng)一個程序從硬盤被拷貝到內(nèi)存上面時,它的代碼編碼部分被安放在代碼段中,而這個程序運行時所需定義的一些變量,則會被安放在數(shù)據(jù)段中。這里需要注意的是,這里的段地址在X86機(jī)器上面都是邏輯地址,即使用段基址和偏移量組合所得到的地址。因此,如果需要操作數(shù)據(jù)段中的變量時,應(yīng)當(dāng)使用存儲器尋址,如直接尋址,間接尋址等方式。這里,我們還需要再知道的一點是,不管我們上述中的數(shù)據(jù)段還是代碼段,雖然它們的地址都是邏輯地址,邏輯地址都是存在同一塊物理地址上面的,只不過加了段標(biāo)識進(jìn)行段限定。這種數(shù)據(jù)存儲和代碼存儲都在同一個存儲器上面的計算機(jī)架構(gòu),被稱為“馮·諾依曼”架構(gòu)。
“馮·諾依曼”架構(gòu)的計算機(jī)在運行程序的時候,首先會把程序從硬盤拷貝到內(nèi)存上面來,如果程序退出,那么這個內(nèi)存將會被回收,以用于下一個程序的運行。這種情形是不是很適合我們的個人計算機(jī)運行程序?這個就是“馮·諾依曼”架構(gòu)的最大好處,極大地有利于動態(tài)程序的加載。
然而“馮·諾依曼”架構(gòu)由于程序存儲器和數(shù)據(jù)存儲器都位于同一塊內(nèi)存,而每次數(shù)據(jù)吞吐的時候,CPU都會去讀取代碼和程序,因此會影響程序的運行速度,這個缺陷也就是所謂的“馮·諾伊曼”瓶頸。
圖1-2-2 馮·諾依曼結(jié)構(gòu)示意圖
“馮·諾依曼”結(jié)構(gòu)由于數(shù)據(jù)和程序都存儲在一片物理內(nèi)存上,因此CPU運行程序的時候,這塊內(nèi)存的讀寫接口無疑是非常復(fù)雜的。而且程序由于存儲在外部存儲器上面,因此在運行的時候,還需要先拷貝到內(nèi)存中去運行,在一片單片機(jī)中,這無疑是非常不實用的。我們希望的是,將程序直接在程序存儲器中去運行,代碼運行時產(chǎn)生的變量數(shù)據(jù),再將其存儲到內(nèi)部存儲器上。這種需求催生了另一種計算機(jī)的結(jié)構(gòu),即“哈佛結(jié)構(gòu)”。
在“哈佛結(jié)構(gòu)”中,一個程序的代碼部分和數(shù)據(jù)部分是被獨立地放置在兩塊不同形式的存儲器上面的,存放代碼的存儲器叫代碼存儲器,一般都是ROM;存放數(shù)據(jù)的存儲器叫數(shù)據(jù)存儲器,一般都是SRAM,現(xiàn)在有一些可外擴(kuò)SDRAM。由于代碼和程序是被存儲在兩個獨立的存儲器上面,因此每個存儲器和CPU之間的讀寫總線都是獨立的,這也意味著,CPU從程序存儲器中取指令和代碼尋址時的內(nèi)存訪問可以完全獨立開來。哈佛結(jié)構(gòu)的示意圖如圖1-2-3所示。
圖1-2-3 哈佛結(jié)構(gòu)示意圖
哈佛結(jié)構(gòu)與馮·諾依曼結(jié)構(gòu)處理器相比,處理器有兩個明顯的特點:使用兩個獨立的存儲器模塊,分別存儲指令和數(shù)據(jù),每個存儲模塊都不允許指令和數(shù)據(jù)并存;使用獨立的兩條總線,分別作為CPU與每個存儲器之間的專用通信路徑,而這兩條總線之間毫無關(guān)聯(lián)。
傳統(tǒng)的哈佛結(jié)構(gòu)使用非常少,現(xiàn)在的都為改進(jìn)后的哈佛結(jié)構(gòu),其結(jié)構(gòu)特點為:
使用兩個獨立的存儲器模塊,分別存儲指令和數(shù)據(jù),每個存儲模塊都不允許指令和數(shù)據(jù)并存,以便實現(xiàn)并行處理;具有一條獨立的地址總線和一條獨立的數(shù)據(jù)總線,利用公用地址總線訪問兩個存儲模塊(程序存儲模塊和數(shù)據(jù)存儲模塊),公用數(shù)據(jù)總線則被用來完成程序存儲模塊或數(shù)據(jù)存儲模塊與CPU之間的數(shù)據(jù)傳輸;兩條總線由程序存儲器和數(shù)據(jù)存儲器分時共用。
2、CISC和RISC
CISC的英文全稱為“Complex Instruction Set Computer”,即“復(fù)雜指令系統(tǒng)計算機(jī)”;
RISC的英文全稱為“Reduced Instruction Set Computer”,即“精簡指令集計算機(jī)”。
從字面上來看,CISC和RISC最大的區(qū)別就是指令的復(fù)雜程度。
51單片機(jī)是一種CISC,ARM-Cortex M3是一種RISC,然而如果你同時學(xué)習(xí)過51單片機(jī)匯編語言和ARM匯編語言的話,你就會發(fā)現(xiàn),如果以指令數(shù)量或者指令結(jié)構(gòu)的復(fù)雜程序來說,似乎ARM匯編比51匯編更加復(fù)雜。因為隨著計算機(jī)需求的發(fā)展,不管是精簡指令還是復(fù)雜指令,它必然要支持更多的協(xié)處理器,這就使得它們的指令數(shù)量都在增加。所以,根據(jù)指令的數(shù)量和復(fù)雜程度來區(qū)分RISC和CISC也不準(zhǔn)確。
CISC內(nèi)部為將較復(fù)雜的指令譯碼,也就是指令較長,分成幾個周期去執(zhí)行,正因如此,開發(fā)程序比較容易(指令多的緣故),但是由于指令復(fù)雜,執(zhí)行工作效率較差,處理數(shù)據(jù)速度較慢。
RISC指令位數(shù)較短,內(nèi)部還有快速處理指令的電路,使得指令的譯碼與數(shù)據(jù)的處理較快,所以執(zhí)行效率比CISC高,不過,必須經(jīng)過編譯程序的處理,才能發(fā)揮它的效率。
CISC和早期RISC的區(qū)別如圖1-2-4所示。
圖1-2-4 CISC和早期RISC的異同