關於程式碼如何執行的五個問題

咕嚕企業簽名老尼發表於2023-12-25

哈嘍大家好,我是咕嚕老尼,今天我和大家分享一下關於程式碼如何執行的五個問題。

問題 1:FLASH中的程式碼是如何得到執行的呢?比如PC指標是在哪裡由誰設定的? ARM 為例 微控制器 該類微控制器的程式碼在 nor flash中,cortex核心可以直接執行,不需要將程式碼載入到ram中執行。ARM-cortex-A系列的SOC 該類 SOC更加複雜,通常有記憶體管理單元,程式碼儲存在nand flash中,程式執行時,需要先將程式碼載入到ram中執行,該類SOC的啟動環節包含了載入程式。就像Windows作業系統儲存在硬碟中,開機的時候,作業系統的程式碼會載入到 RAM 中。 PC指標:無論什麼微控制器或者SOC,都有一個PC暫存器,這個暫存器儲存了下一條待取指令的地址。正常情況下自動加“4”,遇到分支跳轉的時候,由跳轉指令設定值。那麼指標是什麼?指標是一個變數的地址,在含有作業系統即硬體層面含有記憶體管理單元的情況下,指標是虛擬地址,不含作業系統的情況下,是實體地址,虛擬地址和實體地址經過MMU轉換。

問題 2:這些程式碼需要搬到RAM中才能執行嗎?不這樣做會有什麼不妥嗎?

上文講了,大部分微控制器的程式碼直接在 nor flash中執行,少部分需要載入到ram中。nor flash可以直接定址一個位元組,可以找到一個指令的具體地址,因此可以直接執行。nand flash 的儲存單元是塊,不能對指令直接定址,因此不能直接執行其中的程式碼。因此儲存在nand flash中的程式不載入到ram中執行不了。即你的硬碟中的Windows不載入到記憶體條中,執行不起來。

問題 3:如果需要搬到RAM,那是片內還是片外有什麼區別嗎?

片內片外都可以,具體看是那款 SOC或CPU了。

問題 4:如果使用者存在FLASH的實際程式碼大小(比如1MB),超過了RAM的可用空間(比如512KB),那這個搬移過程是啥樣的?

現在實際情況很少遇到這種情況,當然可能會有 RAM很小的系統,可以分時分段的使用,即程式執行一段,載入一段,執行完,載入下一段。很不建議這樣玩,現在的RAM很大了,你的實際程式碼達到1MB的時候,你的記憶體可能都有1G,2G了。比如Linux作業系統編譯完後,實際上只有幾MB,實際的Linux系統會有幾個G 的記憶體可用。

問題 5:片外擴充套件的FLASH和SRAM與片內的想比,除了空間大小有差別,效能速度上會有怎樣的差異呢?

具體要看 SOC的匯流排設計。一般來說片外的效能弱一點。能不能在Flash中直接執行程式程式碼,取決於Flash的訪問特性。Flash儲存器是按塊組織的,在使用時也傾向於按塊訪問才更加高效。Flash類似於ROM一類的儲存器,但它其實是可讀可寫的,不同於同樣可讀可寫的RAM,它在寫入資料時需要先將你所寫位置所屬的塊擦除,不管你是不是隻寫幾個位元組,所以如果要改寫Flash中的資料,總是會先將資料所屬的塊快取到記憶體中,然後再在記憶體中改寫好資料後又重新將塊寫回,這樣就不會丟失資料,但是花銷太大。讀的時候,往往也是先定位塊的位置,然後在塊中順序讀取,在不同塊中間斷讀取資料是非常低效的,所以按塊讀按塊寫是Flash的一大特點,它不能夠隨意的對儲存區域定址,典型的如NAND Flash。

好啦今天就講到這了,我是咕嚕老尼,我們下次再見


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70035601/viewspace-3001490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章