首頁  >  文章  >  程式必須存放在哪裡才能被CPU存取並執行

程式必須存放在哪裡才能被CPU存取並執行

coldplay.xixi
coldplay.xixi原創
2020-08-29 10:54:5514418瀏覽

程式必須存放在記憶體才能被CPU存取並執行,且需要先將指令暫存器的內容傳送到位址匯流排上,pc機在執行程式的時候將程式從外存中,調入到RAM中運行,cpu運行時直接從flash中讀取程式。

程式必須存放在哪裡才能被CPU存取並執行

CPU執行程式時,必須將指令存在於記憶體中,且需要先將指令暫存器 的內容傳送到位址匯流排上。

x86cpu和單晶片讀取程式的具體途徑pc機在運行程式的時候將程式從外存(硬碟)中,調入到RAM中運行,cpu從RAM中讀取程序和數據而單片機的程序則是固化在flash中,cpu運行時直接從flash中讀取程序,從RAM中讀取數據造成這種差別的具體原因分析x86構架的cpu是基於馮.諾依曼體系的,即資料和程式儲存在一起,而且pc機的RAM資源相當豐富,從幾十M到幾百M甚至是幾個G,客觀上能夠承受大量的程式資料。

單晶片的架構大多是哈弗體系的,即程式和資料分開存儲,而且單片的片內RAM資源是相當有限的,內部的RAM過大會帶來成本的大幅度提高。透過上面的分析可得知:單晶片的程式能儲存在flash中是基於兩點考慮,也就是體系結構和RAM資源的多寡。

因此,在技術不但進步片內RAM容量不斷增多的今天,RAM資源已經不再是製約這種差別的主要因素,而對於體系機構我們只要更改cpu讀取程序的方式就可以。

將嵌入式系統的程式存於RAM中的具體做法「對於很多的嵌入式系統,其程式碼很多都儲存在norflash中,運行也是直接在flash中運行.我最近了解到我新公司的軟體中的一段程式碼當時為了提高運行速度被加載到ram中運行.當時他們是花了很多時間來解決這個問題的.我仔細研究了一下鏈接腳本,用的是gnu的linux的交叉工具鏈.地址分配是寫在一個ld腳本中的.

他們是這樣實現的:1,將你需要在ram中運行的代碼寫在單獨的一個c文件中,然後在腳本中設置其運作位址與存放位址分開.設定好必要的程式碼起始和結束的標誌變數.2,在程式碼中將存放位址處的程式碼拷貝到運作位址中.馮.諾依曼系統與哈佛體系的區別二者的差別就是程式空間和資料空間是否是一體的。

早期的微處理器大多採用馮諾依曼結構,典型代表是Intel公司的X86微處理器。取指令和取操作數都在同一總線上,透過分時復用的方式進行的。缺點是在高速運行時,不能達到同時取指令和取操作數,從而形成了傳輸過程的瓶頸。

哈佛匯流排技術應用是以DSP和ARM為代表的。採用哈佛總線體系結構的晶片內部程式空間和資料空間是分開的,這就允許同時取指令和取操作數,從而大大提高了運算能力。例如STM320LF240x系列DSP是增強型的哈佛結構透過三組並行的匯流排存取多個儲存空間。

想了解更多程式設計學習,請關注php培訓專欄!

以上是程式必須存放在哪裡才能被CPU存取並執行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn