ARM處理器系統初始化程式設計注意事項

2021-04-25 04:35:43 字數 942 閱讀 5714

本文摘自王洪輝老師的《嵌入式系統linux核心開發實戰指南(arm平台)》一書

在上述系統初始化過程中有以下兩點需要注意,如果處理不好就可能出現程式跑飛的情況。

1)如果需要將程式從flash搬移到dram中執行

在現代嵌入式系統中,由於dram的速度比flash的速度快很多,所以除了極少數對效能要求不高但對成本要求很高的系統把程式放在flash中並一直在flash中執行外,大部分嵌入式系統都是將程式從flash晶元搬到dram晶元中執行,這樣就會存在乙個問題,因為我們編譯鏈結程式都是將程式鏈結到程式最後執行的場所dram中的位址上,但是系統啟動時只能從flash中讀取指令,所以從系統啟動讀取的第一條指令到進入到dram執行前的程式**是與位址無關的,如果要跳轉到某個標號處執行,必須是基於pc的,不能是絕對跳轉指令,因為此時程式存放的位置與其所鏈結到的位置不同,如果使用跳轉指令,程式將跑飛。

2)如果要求程式在mmu使能狀態下執行,即系統工作在虛擬位址模式

mmu使得系統能夠更好地管理記憶體,因為mmu可以將同一段物理記憶體對映到多段虛擬位址空間上,而且可以將物理上不連續的記憶體對映到連續的虛擬記憶體空間(減少記憶體碎片),另外mmu還可以控制虛擬記憶體區段的緩衝特性和訪問許可權,所以mmu可以提高記憶體的使用效率,使程式彷彿能夠使用比實際物理記憶體容量多得多的記憶體空間,提高系統效能,同時也增加了系統的安全性,所以在帶有mmu功能的處理器系統中,一般都應該使能mmu,充分利用其功能。這樣一來也會導致乙個和上面相同的問題,因為在使用mmu的系統中,各種物理儲存空間的實際實體地址與對應的虛擬位址設定得各不相同,包括flash和dram的實體地址與虛擬位址。系統啟動時mmu被禁止,系統執行在實模式即實體地址模式,但程式卻被編譯鏈結到了虛擬位址上,這樣在使能mmu之前,存放在flash或dram中的程式的實際位址(實體地址)與其鏈結到的位址是不相同的,所以從系統啟動到mmu使能之間的程式**也應該是與位址無關的,如果要跳轉到某個標號處執行,必須是基於pc的,不能是絕對跳轉指令,否則程式也將跑飛。

ARM處理器系統初始化過程

arm處理器系統初始化過程 每次系統上電 復位啟動時,處理器都處於一種最低效能即只有最基本功能的狀態,此時它只能從復位向量位址處去讀取指令,其他功能模組都處於禁止或者不可預知狀態,而一旦處理器從復位向量位址位置讀取到第一條指令開始執行,那麼從軟體的角度看,處理器和整個系統就開始進入了軟體可控狀態,系...

初始化協議處理器 CPU多核初始化

最近的幾個專案都不止一次的碰到了mp 初始化的問題,每次都花了不少的時間,於是打算總結一下多處理器初始化的流程,以備將來再次碰到的問題時方便查詢。mp初始化指的是在乙個有至少2個或者多個處理器的系統裡,怎麼去初始化所有的處理器,讓系統工作起來。ia 32 arch 定義了mp 初始化的協議,該協議使...

C C 程式設計 成員初始化列表器列表

struct foo 初始化列表 include using namespace std struct mem mem int i num i int num 2 就地初始化 從上面可以看出,初始化列表總是後作用於就地初始化的。也就是說,初始化列表的效果總是優先於就地初始化的 建構函式的執行可以分為...