uboot初始化中,為何要設(shè)置CPU為SVC模式而不是設(shè)置為其他模式
在看Uboot的start.S文件時候,發(fā)現(xiàn)其最開始初始化系統(tǒng),做的第一件事情,就是將CPU設(shè)置為SVC模式,但是S3C2440的CPU的core是ARM920T,其有7種模式,為何非要設(shè)置為SVC模式,而不是設(shè)置為其他模式呢?對此,經(jīng)過一些求證,得出如下原因:
首先,先要了解ARM的CPU的7種模式是哪些: http://www.docin.com/p-73665362.html
圖表 22 ARM中CPU的模式 處理器模式 | 說明 | 備注 | 用戶
(usr) | 正常程序工作模式 | 此模式下程序不能夠訪問一些受操作系統(tǒng)保護(hù)的系統(tǒng)資源,應(yīng)用程序也不能直接進(jìn)行處理器模式的切換。 | 系統(tǒng)
(sys) | 用于支持操作系統(tǒng)的特權(quán)任務(wù)等 | 與用戶模式類似,但具有可以直接切換到其它模式等特權(quán) | 快中斷
(fiq) | 支持高速數(shù)據(jù)傳輸及通道處理 | FIQ異常響應(yīng)時進(jìn)入此模式 | 中斷
(irq) | 用于通用中斷處理 | IRQ異常響應(yīng)時進(jìn)入此模式 | 管理
(svc) | 操作系統(tǒng)保護(hù)代碼 | 系統(tǒng)復(fù)位和軟件中斷響應(yīng)時進(jìn)入此模式 | 中止
(abt) | 用于支持虛擬內(nèi)存和/或存儲器保護(hù) | 在ARM7TDMI沒有大用處 | 未定義
(und) | 支持硬件協(xié)處理器的軟件仿真 | 未定義指令異常響應(yīng)時進(jìn)入此模式 |
另外,7種模式中,除用戶usr模式外,其它模式均為特權(quán)模式。
對于為何此處是svc模式,而不是其他某種格式,其原因,可以從兩方面來看: 【第一方面】 我們先簡單的來分析一下那7種模式: 中止abt和未定義und模式: 首先可以排除的是,中止abt和未定義und模式,那都是不太正常的模式,此處程序是正常運行的,所以不應(yīng)該設(shè)置CPU為其中任何一種模式,所以可以排除。 快中斷fiq和中斷irq模式: 其次,對于快中斷fiq和中斷irq來說,此處uboot初始化的時候,也還沒啥中斷要處理和能夠處理,而且即使是注冊了終端服務(wù)程序后,能夠處理中斷,那么這兩種模式,也是自動切換過去的,所以,此處也不應(yīng)該設(shè)置為其中任何一種模式。 用戶usr模式: 雖然從理論上來說,可以設(shè)置CPU為用戶usr模式,但是由于此模式無法直接訪問很多的硬件資源,而uboot初始化,就必須要去訪問這類資源,所以此處可以排除,不能設(shè)置為用戶usr模式。 系統(tǒng)sys模式 vs 管理svc模式: 首先,sys模式和usr模式相比,所用的寄存器組,都是一樣的,但是增加了一些訪問一些在usr模式下不能訪問的資源。 而svc模式本身就屬于特權(quán)模式,本身就可以訪問那些受控資源,而且,比sys模式還多了些自己模式下的影子寄存器,所以,相對sys模式來說,可以訪問資源的能力相同,但是擁有更多的硬件資源。 所以,從理論上來說,雖然可以設(shè)置為sys和svc模式的任一種,但是從uboot方面考慮,其要做的事情是初始化系統(tǒng)相關(guān)硬件資源,需要獲取盡量多的權(quán)限,以方便操作硬件,初始化硬件。
從uboot的目的是初始化硬件的角度來說,設(shè)置為svc模式,更有利于其工作。 因此,此處將CPU設(shè)置為SVC模式。
【第二方面】 uboot作為一個bootloader來說,最終目的是為了啟動Linux的kernel,在做好準(zhǔn)備工作(即初始化硬件,準(zhǔn)備好kernel和rootfs等)跳轉(zhuǎn)到kernel之前,本身就要滿足一些條件,其中一個條件,就是要求CPU處于SVC模式的。 (關(guān)于滿足哪些條件,詳情請參考: ARM Linux Kernel Boot Requirements http://www.arm.linux.org.uk/developer/booting.php 或者Linux內(nèi)核文檔: kernel_source_root\documentation\arm\booting 中也是同樣的解釋: “The CPU must be in SVC mode”) 所以,uboot在最初的初始化階段,就將CPU設(shè)置為SVC模式,也是最合適的。
綜上所述,uboot在初始化階段,就應(yīng)該將CPU設(shè)置為SVC模式。 |