馮諾依曼結(jié)構(gòu)和哈佛結(jié)構(gòu)

最近幾年疆拘,隨著接觸到的技術(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個互相矛盾的建議值纱,怎么辦鳞贷?真理唯有一個字,謂之“度”虐唠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辐脖,一起剝皮案震驚了整個濱河市庐椒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖台谊,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洛二,居然都是意外死亡侨歉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門处铛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饲趋,“玉大人,你說我怎么就攤上這事撤蟆∞人埽” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵家肯,是天一觀的道長龄砰。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么换棚? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任式镐,我火速辦了婚禮,結(jié)果婚禮上固蚤,老公的妹妹穿的比我還像新娘娘汞。我一直安慰自己,他們只是感情好颇蜡,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布价说。 她就那樣靜靜地躺著,像睡著了一般风秤。 火紅的嫁衣襯著肌膚如雪鳖目。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天缤弦,我揣著相機與錄音领迈,去河邊找鬼。 笑死碍沐,一個胖子當(dāng)著我的面吹牛狸捅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播累提,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼尘喝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斋陪?” 一聲冷哼從身側(cè)響起朽褪,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎无虚,沒想到半個月后缔赠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡友题,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年嗤堰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片度宦。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡踢匣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斗埂,到底是詐尸還是另有隱情符糊,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布呛凶,位于F島的核電站,受9級特大地震影響行贪,放射性物質(zhì)發(fā)生泄漏漾稀。R本人自食惡果不足惜模闲,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崭捍。 院中可真熱鬧尸折,春花似錦、人聲如沸殷蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粒梦。三九已至亮航,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匀们,已是汗流浹背缴淋。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泄朴,地道東北人重抖。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像祖灰,于是被迫代替她去往敵國和親钟沛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本文簡單地介紹了MCU及MCU相關(guān)的開發(fā)工具局扶。并引用IC insights和IHS兩個重要的市場研究機構(gòu)說明了MC...
    芯資訊閱讀 2,335評論 0 2
  • 馮·諾依曼結(jié)構(gòu) 馮·諾依曼結(jié)構(gòu)恨统,又稱為普林斯頓體系結(jié)構(gòu),是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的存儲器結(jié)構(gòu)详民。...
    一個人在路上走下去閱讀 4,107評論 1 31
  • 馮·諾依曼被稱為“計算機之父”沈跨,但是他并不承認(rèn)計算機這個兒子由捎,就像成龍不承認(rèn)小龍女一樣。 馮·諾依曼的主要身份是數(shù)...
    Andy虎老獅閱讀 1,014評論 1 3
  • 牽著你的手饿凛,漫步在月夜下的柏林園你輕依肩頭狞玛,互訴著說不完的衷腸空中時不時傳來幾聲蟋蟀的嬉鬧聲像譜寫著的歡快樂章,點...
    俗人安安閱讀 418評論 0 7
  • 第一章主要對機器學(xué)習(xí)的基本術(shù)語涧窒,目的及原理做了簡單闡述 1. 機器學(xué)習(xí)的目的:通過經(jīng)驗對新情況做出預(yù)判 機器學(xué)習(xí)研...
    69ae7603d0cc閱讀 516評論 0 0