uboot初始化中,為何要設置CPU為SVC模式而不是設置為其他模式
在看Uboot的start.S文件時候,發現其最開始初始化系統,做的第一件事情,就是將CPU設置為SVC模式,但是S3C2440的CPU的core是ARM920T,其有7種模式,為何非要設置為SVC模式,而不是設置為其他模式呢?對此,經過一些求證,得出如下原因:
首先,先要了解ARM的CPU的7種模式是哪些:
http://www.docin.com/p-73665362.html
圖表 22 ARM中CPU的模式
另外,7種模式中,除用戶usr模式外,其它模式均為特權模式。
對于為何此處是svc模式,而不是其他某種格式,其原因,可以從兩方面來看:
【第一方面】
我們先簡單的來分析一下那7種模式:
中止abt和未定義und模式:
首先可以排除的是,中止abt和未定義und模式,那都是不太正常的模式,此處程序是正常運行的,所以不應該設置CPU為其中任何一種模式,所以可以排除。
快中斷fiq和中斷irq模式:
其次,對于快中斷fiq和中斷irq來說,此處uboot初始化的時候,也還沒啥中斷要處理和能夠處理,而且即使是注冊了終端服務程序后,能夠處理中斷,那么這兩種模式,也是自動切換過去的,所以,此處也不應該設置為其中任何一種模式。
用戶usr模式:
雖然從理論上來說,可以設置CPU為用戶usr模式,但是由于此模式無法直接訪問很多的硬件資源,而uboot初始化,就必須要去訪問這類資源,所以此處可以排除,不能設置為用戶usr模式。
系統sys模式 vs 管理svc模式:
首先,sys模式和usr模式相比,所用的寄存器組,都是一樣的,但是增加了一些訪問一些在usr模式下不能訪問的資源。
而svc模式本身就屬于特權模式,本身就可以訪問那些受控資源,而且,比sys模式還多了些自己模式下的影子寄存器,所以,相對sys模式來說,可以訪問資源的能力相同,但是擁有更多的硬件資源。
所以,從理論上來說,雖然可以設置為sys和svc模式的任一種,但是從uboot方面考慮,其要做的事情是初始化系統相關硬件資源,需要獲取盡量多的權限,以方便操作硬件,初始化硬件。
從uboot的目的是初始化硬件的角度來說,設置為svc模式,更有利于其工作。
因此,此處將CPU設置為SVC模式。
【第二方面】
uboot作為一個bootloader來說,最終目的是為了啟動Linux的kernel,在做好準備工作(即初始化硬件,準備好kernel和rootfs等)跳轉到kernel之前,本身就要滿足一些條件,其中一個條件,就是要求CPU處于SVC模式的。
(關于滿足哪些條件,詳情請參考:
ARM Linux Kernel Boot Requirements
http://www.arm.linux.org.uk/developer/booting.php
或者Linux內核文檔:
kernel_source_root\documentation\arm\booting
中也是同樣的解釋:
“The CPU must be in SVC mode”)
所以,uboot在最初的初始化階段,就將CPU設置為SVC模式,也是最合適的。
綜上所述,uboot在初始化階段,就應該將CPU設置為SVC模式。
ARM kernel 單片機
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。