上篇博文咱們按照210的啓動流程,對u-boot啓動中的設置異常向量表,設置SVC模式進行了分析,今天咱們繼續按照u-boot的啓動流程對如下內容進行分析。.net
今天咱們會用到的文檔:3d
今天咱們將會分析如下內容:code
2. 關閉MMU和cacheblog
3. 關閉看門狗內存
1. 什麼是cache文檔
Cache 是位於 CPU與主存儲器DRAM之間的少許超高速靜態存儲器 SRAM(static RAM),其是爲了解決 CPU 與主存之間速度匹配問題而設置的。get
Cache又分爲I-cache(用來存指令)和D-cache(用來存數據)
2. 爲何要讓cache失效
咱們在使用cache的時候要通過一系列的配置,在沒配置以前是不能使用的。因此咱們要關閉cache,可是在關閉cache以前cache裏面可能已經有數據了,爲了避免影響咱們的代碼,因此要先讓其失效,在進行關閉。
3. 怎麼讓cache失效
根據A8內核手冊中的3.2.1Register allocation一節咱們找到了其對CP15協處理器的寄存器的簡介,咱們仔細閱讀其對全部寄存器的說明能夠找到下面的表
那麼怎麼去設置這個寄存器呢,咱們稍微看看文檔就會發現下面東西
因此咱們讓cache失效的代碼就很簡單了,經過下面的指令就可讓cache失效了。
1 mcr p15, 0, r0, c7, c5, 0//讓cache失效
注:在u-boot中這一部分代碼還失效了別的東西,咱們這裏就不關注了。
l 關閉MMU和cache
1. 什麼是MMU:
MMU就是負責虛擬地址(virtual address)轉化成物理地址(physical address)。
在這裏確定有人跟我同樣的疑惑,既然有物理地址咱們訪問的時候訪問物理地址不就完事了嗎?爲何要有虛擬地址的存在,而後還要加個專門的硬件去轉換,這就是畫蛇添足嗎?
其實加入了虛擬地址後有下面兩個做用
1) 虛擬內存:有了虛擬內存,能夠在處理器上運行比實際物理內存大的應用程序。
2) 內存保護:根據須要對特定的內存區塊的訪問進行保護,經過這一功能,咱們能夠將特定的內存塊設置成只讀、只寫或是可同時讀寫。
2. 爲什要關閉MMU
跟cache的緣由同樣,在使用MMU以前要進行一系列的初始化,而且過程比較複雜,如今用不到因此要關閉它。
3. 怎麼關閉MMU
一樣在剛纔的寄存器列表中咱們能夠找到一個Control Register 咱們重點關注一下它的下面幾個位
從上圖咱們能夠看到,咱們只要將這個寄存器的0、2、12、位設置爲零就能夠關閉咱們的cache和MMU了。
那麼如何設置呢,咱們稍微往下找找就能夠找到
咱們先要將裏面的數據讀出來,通過處理後在寫入。因此就不難理解u-boot的代碼了
1 mrc p15, 0, r0, c1, c0, 0 2 3 bic r0, r0, #0x00002000 @ clear bits 13 (--V-) 4 5 bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) 6 7 orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align 8 9 orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB 10 11 #ifdef CONFIG_SYS_ICACHE_OFF 12 13 bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache 14 15 #else 16 17 orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache 18 19 #endif 20 21 mcr p15, 0, r0, c1, c0, 0
注:咱們重點關注咱們剛纔提到的幾個是否是爲零便可
接着流程往下,咱們應該是檢查reset狀態和恢復IO引腳爲默認值了,因爲這兩部分不是很重要的初始化,因此咱們在此就跳過了,在往下就應該到關閉看門狗了
l 關閉看門狗
看門狗的用途是使微控制器在進入錯誤狀態後(死機)的必定時間內復位。當看門狗使能時,若是用戶程序沒有在週期時間內喂狗(重裝),看門狗會產生一個系統復位。
2. 看門狗原理解析
咱們在每一個芯片的芯片手冊中均可以找到下圖:
1) PCLK通過預分頻器以及選擇器之後會產生看門狗時鐘,而後經過計數邏輯模塊,開始計數。
2) WTDAT是預先存放的計數初值,WTCNT是減量計數模塊,當WTCNT從WTDAT的值減到0的時候,若是尚未更新WTDAT,則認爲沒有喂狗,系統死機。
3) 發出reset 信號,強制系統重啓
3. 爲何要關看門狗
1) 要一直喂狗麻煩
2) 廣泛認爲bootloader代碼較少,不須要看門狗。
4. 怎麼關閉看門狗
在芯片手冊中咱們能夠輕鬆的找到WTCON寄存器
經過上面寄存器的介紹,咱們能夠知道向其最低位寫入0可關閉,其復位,想第二位寫入0可關閉中斷,索性咱們之間寫入0就完事,因此也就不難理解u-boot中的代碼了
1 /* Disable Watchdog */ 2 3 4 5 ldr r0, =ELFIN_WATCHDOG_BASE /* 0xE2700000 */ 6 7 mov r1, #0 8 9 str r1, [r0]