ARM linux解析之壓縮核心zImage的啟動過程
ARM linux解析之壓縮核心zImage的啟動過程
首先,我們要知道在zImage的生成過程中,是把arch/arm/boot/compressed/head.s和解壓程式碼misc.c,decompress.c加在壓縮核心的最前面最終生成zImage的,那麼它的啟動過程就是從這個head.s開始的,並且如果程式碼從RAM執行的話,是與位置無關的,可以載入到記憶體的任何地方。
下面以arch/arm/boot/compressed/head.s為主線進行啟動過程解析。
1.head.s的debug巨集定義部分
最開始的一段都是head.s的debug巨集定義部分,這部分可以方便我們除錯時使用。
如下:
#ifdefDEBUG
#if defined(CONFIG_DEBUG_ICEDCC)
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
.macro loadsp, rb, tmp
.endm
.macro writeb, ch, rb
mcrp14, 0, \ch, c0, c5, 0
.endm
#elif defined(CONFIG_CPU_XSCALE)
.macro loadsp, rb, tmp
.endm
.macro writeb, ch, rb
mcrp14, 0, \ch, c8, c0, 0
.endm
#else
.macro loadsp, rb, tmp
.endm
.macro writeb, ch, rb
mcrp14, 0, \ch, c1, c0, 0
.endm
#endif
#else
#include<mach/debug-macro.S>
.macro writeb, ch, rb
senduart \ch, \rb
.endm
#if defined(CONFIG_ARCH_SA1100)
.macro loadsp, rb, tmp
mov\rb, #[email protected] physical base address
#ifdef CONFIG_DEBUG_LL_SER3
add \rb, \rb, #0x00050000 @ Ser3
#else
add \rb, \rb, #0x00010000 @ Ser1
#endif
.endm
#elif defined(CONFIG_ARCH_S3C2410)
.macro loadsp, rb, tmp
mov\rb, #0x50000000
add \rb, \rb, #0x4000 * CONFIG_S3C_LOWLEVEL_UART_PORT
.endm
#else
.macro loadsp, rb, tmp
addruart \rb, \tmp
.endm
#endif
#endif
#endif
如果開啟DEBUGging巨集的話,這部分程式碼分兩段CONFIG_DEBUG_ICEDCC是用ARMv6以上的加構支援的ICEDCC技術進行除錯,DCC(Debug Communications Channel)是ARM的一個除錯通訊通道,在串列埠無法使用的時候可以使用這個通道進行資料的通訊,具體的技術參前ARM公司文件《ARM Architecture Reference Manual》。
第二部分首先#include <mach/debug-macro.S>,這個檔案定義位於arch/arm/mach-xxxx/include/mach/debug-macro.S裡面,所以這個是和平臺相關的,裡面定義了每個平臺的相關的串列埠操作,因這個時候系統還沒有起來,所以它所用的串列埠配置引數是依賴於前一級bootloader所設定好的,如我們使用的u-boot設定好所有的引數。如我們的EVB板ARM的實現如下:
#include <mach/hardware.h>
#include <mach/platform.h>
.macroaddruart, rp, rv
ldr \rp, [email protected] System peripherals (phys address)
ldr \rv, =(IO_BASE+ ARM_EVB _UART0_BASE)@ System peripherals (virt address)
.endm
.macrosenduart,rd,rx
strb\rd, [\rx, #(0x00)]@ Write to Transmitter Holding Register
.endm
.macrowaituart,rd,rx
1001:ldr \rd, [\rx, #(0x18)]@ Read Status Register