1. 程式人生 > >ARM linux解析之壓縮核心zImage的啟動過程

ARM linux解析之壓縮核心zImage的啟動過程

ARM linux解析之壓縮核心zImage的啟動過程


首先,我們要知道在zImage的生成過程中,是把arch/arm/boot/compressed/head.s和解壓程式碼misc.cdecompress.c加在壓縮核心的最前面最終生成zImage的,那麼它的啟動過程就是從這個head.s開始的,並且如果程式碼從RAM執行的話,是與位置無關的,可以載入到記憶體的任何地方。

下面以arch/arm/boot/compressed/head.s為主線進行啟動過程解析。

1.head.sdebug巨集定義部分

最開始的一段都是head.sdebug巨集定義部分,這部分可以方便我們除錯時使用。

如下:

#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技術進行除錯,DCCDebug 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設定好所有的引數。如我們的EVBARM的實現如下:

#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

tst \rd, #