最近幾年疆拘,隨著接觸到的技術(shù)越來越多蜕猫,在整體上對電子計算機世界的了解也越來越成熟。同時哎迄,也逐漸認(rèn)識到回右,對基礎(chǔ)知識及原理的掌握非常有助于理解更高層次的技術(shù)內(nèi)容。如果對基礎(chǔ)知識不夠了解漱挚,往往會造成空中樓閣的認(rèn)識翔烁,不能領(lǐng)會真正的精髓。
《微型計算機原理》應(yīng)該是大學(xué)電子信息/計算機類專業(yè)必修的課程吧旨涝,這個的確是現(xiàn)代計算機系統(tǒng)的鼻祖蹬屹,基本原理都是融會貫通的“谆回想起當(dāng)初慨默,這門課程學(xué)的是一塌糊涂。其實不光這門課弧腥,好多課學(xué)的都不好厦取,學(xué)渣屬性啊,哈哈」芴拢現(xiàn)在想起來虾攻,主要有兩點原因,一個當(dāng)然是主觀上不夠努力抛蚤;再一個就是相關(guān)的基礎(chǔ)知識台谢,或者說啟蒙吧,基本上沒有岁经,所以一頭扎進出根本不知所云∨缶冢現(xiàn)在,對計算機的知識已經(jīng)了解的挺多了缀壤,但大多偏上層的樊拓,對于最基礎(chǔ)、最底層的知識還是了解的不夠塘慕。所以筋夏,是時候來重新學(xué)習(xí)一下微機原理了。
先來看兩張圖:
這是不同時期的計算機組成框圖图呢,重要的是理解總線模型条篷,即地址總線骗随、數(shù)據(jù)總線和控制總線。地址線用于提供內(nèi)存或I/O設(shè)備的地址赴叹,即指明需要讀/寫數(shù)據(jù)的具體位置鸿染。數(shù)據(jù)線用于在CPU和內(nèi)存或I/O設(shè)備之間提供數(shù)據(jù)傳輸?shù)耐ǖ溃刂凭€則負(fù)責(zé)指揮執(zhí)行的具體讀/寫操作乞巧。理解這個總線模型就可以了涨椒。
上面說的其實是計算機的具體實現(xiàn)方式,而關(guān)于計算機的設(shè)計模型主要有兩種思路绽媒,即大名鼎鼎的馮諾依曼結(jié)構(gòu)和哈佛結(jié)構(gòu)蚕冬。這兩種設(shè)計的具體區(qū)別和聯(lián)系很容易了解到,這一轉(zhuǎn)一個我覺得講的很好的帖子是辕,我稍作修改囤热,以供參考。
以下內(nèi)容轉(zhuǎn)發(fā)自https://www.sohu.com/a/382531038_505803免糕,版權(quán)歸原作者赢乓!
嵌入式的學(xué)習(xí)中ARM 處理器是主題忧侧,這些年產(chǎn)業(yè)界除了PC和服務(wù)器市場外石窑,以手機、pad 蚓炬、家電控制等為代表的嵌入式領(lǐng)域都被ARM幾乎壟斷了松逊。所以學(xué)習(xí)嵌入式處理器,其實等同于學(xué)習(xí)ARM 肯夏。(當(dāng)然了经宏,近兩年RISC-V 架構(gòu)橫空出世在快速發(fā)展,不斷挑戰(zhàn)ARM 的權(quán)威驯击,咱們后面可以專門開一個專題說說RISC-V 的事兒)烁兰。
ARM到底是馮諾依曼結(jié)構(gòu)還是哈佛結(jié)構(gòu)呢?這個問題困惑了很多人徊都,包括我沪斟。我很明確的記得我在一本書上看到過:ARM是哈佛結(jié)構(gòu)的。所以我一直記得這個結(jié)論暇矫,也沒深思主之,在講課時直接就把這個結(jié)論講出來了。直到有同學(xué)看了課程產(chǎn)生疑問找我李根,我才去深入思考了這個問題槽奕,這其實是一個很值得思考和討論的問題。
CPU和指令數(shù)據(jù)的關(guān)系
大家知道CPU的核心是運算器和控制器房轿,CPU就好像一個數(shù)據(jù)加工機器粤攒,你給他原材料數(shù)據(jù)所森,他按照機器指令的指示幫你做加工(加法減法,左移等)夯接,再將加工后的數(shù)據(jù)返回給你必峰。所以CPU需要與外界建立優(yōu)質(zhì)的數(shù)據(jù)通道,而這2種結(jié)構(gòu)就是CPU和外界存儲器建立數(shù)據(jù)通道的2種不同思路钻蹬。
大家注意CPU和外界對接的數(shù)據(jù)一共有2組吼蚁。一組是指令,也就是機器碼问欠,也就是你寫的軟件代碼被編譯器轉(zhuǎn)化成的二進制指令肝匆。另一組是數(shù)據(jù),也就是軟件中的變量顺献,譬如放在全局?jǐn)?shù)據(jù)區(qū)的全局變量旗国,放在stack中的局部變量等,都是數(shù)據(jù)注整。
指令和數(shù)據(jù)加起來構(gòu)成了整個程序能曾,指令是指導(dǎo)CPU如何加工數(shù)據(jù)的,所以你可以簡單理解為數(shù)據(jù)是原材料肿轨,指令是加工流程說明寿冕。CPU工作時要不斷同時吞吐指令和數(shù)據(jù),所以這2項內(nèi)容(本質(zhì)其實都是數(shù)據(jù)椒袍,指令也是二進制數(shù)據(jù)的形式)必須都有途徑能和CPU進行交換驼唱。
什么是哈佛結(jié)構(gòu)和馮諾依曼結(jié)構(gòu)
這2種結(jié)構(gòu)其實就是CPU如何同時獲取指令和數(shù)據(jù)的2種不同設(shè)計思路。
哈佛結(jié)構(gòu)認(rèn)為CPU應(yīng)該分別通過2組獨立的總線來對接指令和數(shù)據(jù)驹暑,而馮諾依曼結(jié)構(gòu)認(rèn)為CPU通過1組總線來分時獲取指令和數(shù)據(jù)即可玫恳。
舉個栗子形象說明下。你把CPU想象成一個蒸饅頭的廚房优俘,蒸饅頭需要面粉和水京办,那你怎么送面粉和水進去呢?哈佛結(jié)構(gòu)認(rèn)為這個廚房應(yīng)該開2個門帆焕,一個專門送面粉惭婿,一個專門送水。這樣面粉和水可以通過2條路走2個門同時送給廚房视搏。
這樣做的好處是顯而易見的审孽。首先速度就快啊,因為面粉和水可以同時送浑娜,不必耽擱佑力。其次,不容易搞錯筋遭,面粉走面粉的門而水走水的門打颤,怎么搞錯暴拄?而且還安全啊,譬如送水的把水桶打翻了就不會影響到面粉编饺,是吧乖篷?有壞處嗎?當(dāng)然有了(這個世界上只有好處沒有壞處的事兒很少...)透且。你開2個門修2條路得花雙份的成本啊撕蔼,是門不要錢還是路不要錢啊秽誊?其實這個也不算壞處鲸沮,叫成本更合適。記住锅论,考慮任何事的好壞評價時讼溺,一定要考慮各自的成本。不考慮成本就評價好壞純屬耍流氓最易。
馮諾依曼結(jié)構(gòu)就覺得開一個門修一條路就夠了怒坯,分時復(fù)用嘛。譬如運送一次面粉或者水都需要1秒鐘藻懒,那就這一秒送面粉剔猿,下一秒送水。然后下一秒再送面粉束析,下一秒再送水艳馒。這樣做的好處當(dāng)然就是省成本了憎亚。壞處呢员寇?顯然意見,一個是效率低第美,一個是容易弄混弄錯嘛蝶锋。
所以這2種結(jié)構(gòu)其實分別對應(yīng)的是高成本高效率高可靠性,和低成本低效率低可靠度這2種不同思路什往,很好區(qū)分扳缕。兩種結(jié)構(gòu)哪種好?沒有絕對的好壞别威。
小時候喜歡看武俠電視躯舔,里面說凡是被毒蛇咬了7步之內(nèi)必有解毒的草,因為毒蛇必然和解毒的草伴生省古,感覺很神奇粥庄。然后初中時學(xué)化學(xué)里面講到一種化學(xué)變化產(chǎn)生的效果會抑制這個化學(xué)變化本身的發(fā)生,最終達到一個平衡狀態(tài)豺妓,我覺得很神奇惜互。其實現(xiàn)在想想布讹,任何事情都是這樣,沒有絕對的好壞训堆。你要評價好壞一定要先給個前提條件限定描验,否則無從評價誰好誰壞。
那產(chǎn)業(yè)實踐中是怎樣的呢坑鱼?這2種結(jié)構(gòu)提出都很多年膘流,實踐中都有使用,咱們簡單給大家分析下鲁沥。
MCU也就是單片機中幾乎都是用哈佛結(jié)構(gòu)睡扬,譬如廣泛使用的51單片機、典型的STM32單片機(核心是ARM Cortex-M系列的)都是哈佛結(jié)構(gòu)(指令存儲在Flash中黍析,數(shù)據(jù)存儲在RAM中)卖怜。為什么MCU要使用哈佛結(jié)構(gòu)呢?我個人認(rèn)為有幾個原因:
一個是哈佛結(jié)構(gòu)更加穩(wěn)定安全阐枣,MCU使用的壞境對穩(wěn)定性和安全性要求都比較高马靠,所以使用哈佛結(jié)構(gòu)更有保障。另一個是速度會更快一些蔼两,因為傳統(tǒng)的MCU主頻都很低所以速度不高甩鳄,使用哈佛結(jié)構(gòu)多少能提高一些系統(tǒng)性能。還有一個考量就是MCU的指令和數(shù)據(jù)需求量都不大额划,配置不高妙啃,所以內(nèi)存往往使用SRAM而不使用DRAM,這樣就導(dǎo)致他更適合哈佛結(jié)構(gòu)俊戳,如果MCU用馮諾依曼結(jié)構(gòu)反而不好設(shè)計揖赴。當(dāng)然這些都是我自己的理解,說的不一定準(zhǔn)抑胎,我畢竟不是做CPU設(shè)計工作的燥滑,而只是使用CPU做產(chǎn)品這一段位的,理解難免不到位阿逃,各位帶著批判的眼光看即可铭拧。
PC和服務(wù)器芯片(譬如Intel AMD那些)以及ARMCortex-A系列嵌入式芯片(譬如核心是ARM CortexA8的三星S5PV210,譬如華為的麒麟970等手機芯片)等都是馮諾依曼結(jié)構(gòu)恃锉。這些系統(tǒng)都需要大量內(nèi)存搀菩,所以工作內(nèi)存都是DRAM,因為他們更適合使用馮諾依曼系統(tǒng)破托。
混合和純粹結(jié)構(gòu)
這2種結(jié)構(gòu)的定義都是很純粹的肪跋,修2個門2條路,和修1個門1條路肯定是大不相同的炼团。但是實際上CPU內(nèi)部的設(shè)計遠比給廚房修門和路要復(fù)雜的多澎嚣。譬如說寄存器和Cache疏尿,這2個就是在CPU和存儲器之間做中轉(zhuǎn)的,所以考慮了這2個之后你發(fā)現(xiàn)CPU和存儲器并不直接相連易桃,這就增加了復(fù)雜性了褥琐。
所以實際上存在這2種結(jié)構(gòu)混用的情況,而且現(xiàn)代的CPU(準(zhǔn)確說叫SoC)基本都不是純粹的哈佛結(jié)構(gòu)或馮諾依曼機構(gòu)晤郑,而都是混合結(jié)構(gòu)的敌呈。
譬如說咱們嵌入式linux核心課程中講到的三星S5PV210吧,這家伙使用ARM的Cortex-A8核心造寝,按道理應(yīng)該是馮諾依曼結(jié)構(gòu)吧磕洪。實際上確實是這樣,咱們使用的X210/Study210開發(fā)板上配備了512MB的DDR SDRAM诫龙,和8GB的EMMC析显。正常工作時所有的程序和數(shù)據(jù)都從EMMC中加載到DDR中,也就是說不管你是指令還是數(shù)據(jù)签赃,存儲都是在EMMC中谷异,運行時都在DDR中,再通過cache和寄存器送給CPU去加工處理锦聊。這就是典型的馮諾依曼系統(tǒng)嘛歹嘹。
但是,S5PV210內(nèi)部仍然有一定容量的irom和96kb的iram孔庭,這些irom和iram是用于SoC引導(dǎo)和啟動的尺上,大家學(xué)習(xí)過我們嵌入式linux核心課程的ARM裸機部分就知道,芯片上電后首先會執(zhí)行內(nèi)部irom中固化的代碼圆到,其實執(zhí)行這些代碼時210就好像一個MCU一樣怎抛,irom就是他的flash,iram就是他的SRAM构资,這又是典型的哈佛結(jié)構(gòu)抽诉。
這就是混合式結(jié)構(gòu)設(shè)計,而非純粹設(shè)計吐绵!
為什么要混合式設(shè)計?很簡單河绽,為了各取所長而已己单。不管什么架構(gòu),我覺得好耙饰,適合解決我當(dāng)前的問題那就用了纹笼。
最后
現(xiàn)在可以回答本文的主題問題了,ARM到底是哈佛結(jié)構(gòu)還是馮諾依曼結(jié)構(gòu)苟跪?
應(yīng)該這么說:有一些ARM(Cortex-M系列)是哈佛結(jié)構(gòu)廷痘,而另一些ARM(Cortex-A)是馮諾依曼結(jié)構(gòu)(或者更準(zhǔn)確說是混合結(jié)構(gòu))蔓涧。
問題到此結(jié)束。
最后我還在再啰嗦一句笋额,其實不管是什么結(jié)構(gòu)元暴,這些問題應(yīng)該是設(shè)計CPU的人去考慮的事,對于我們使用CPU來做嵌入式開發(fā)的人來說兄猩,究竟是什么結(jié)構(gòu)并沒有本質(zhì)影響茉盏。但是如果能深入理解這個問題,對我們提升功力枢冤,尤其提高自己的思辨能力是有益處的鸠姨。所以我提2個互相矛盾的希望,一方面希望大家遇事多想一想淹真,多思考思考讶迁,這樣才能得到更多;另一方面我希望大家研究問題適合而止核蘸,不要過度深入跨界添瓷,否則可能浪費了很多時間卻又對你的工作好無助益。
2個互相矛盾的建議值纱,怎么辦鳞贷?真理唯有一個字,謂之“度”虐唠。