-
u-boot 相关的地址请参考 linux内存管理 (三) 6 u-boot引导内核相关地址
-
zImage 启动过程中的符号
// linux-3.0.1/arch/arm/boot/compressed/head.S
131 .word 0x016f2818 @ Magic numbers to help the loader
用来帮助 u-boot 识别 zImage 的
132 .word start @ absolute load/run zImage address
不知道用来干嘛的,大概是用来帮助 u-boot 识别 zImage 入口地址的,为链接地址
133 .word _edata @ zImage end address
不知道用来干嘛的
176 ldr r4, =zreladdr
zreladdr 为 解压zImage后,得到的Image 的运行地址,起始地址.
181 restart: adr r0, LC0
restart 标号 用于 搬移 zImage 到 解压后的Image的end地址.
LC0 用于 获取linux-3.0.1/arch/arm/boot/compressed/vmlinux.lds 中的符号的链接地址,放到二进制代码中
208 add sp, sp, r0
设置栈
209 add r10, sp, #0x10000
标准堆的顶,在r10中,r10中的值也是zImage 的结束地址
r10 = end of this image, including bss/stack/malloc space if non XIP
- Image 启动过程中的符号
// linux-3.0.1/arch/arm/kernel/head.S
TEXT_OFFSET 0x008000
TEXT_OFFSET 0x208000
TEXT_OFFSET 0x408000
...
36 #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET)
37 #if (KERNEL_RAM_VADDR & 0xffff) != 0x8000
38 #error KERNEL_RAM_VADDR must start at 0xXXXX8000
39 #endif
KERNEL_RAM_VADDR 为 0xC0008000 , 是链接地址
42 .equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000
swapper_pg_dir 为 0xC0004000 , 是 页目录表的起始地址 ???
52 #define KERNEL_START KERNEL_RAM_VADDR
KERNEL_START 为 0xC0008000 ,是内核的起始地址(逻辑地址)
53 #define KERNEL_END _end
KERNEL_END 为 vmlinux.lds中的 _end ,值为 c08cd554,是内核的结束地址(逻辑地址)
85 adr r3, 2f
86 ldmia r3, {r4, r8}
87 sub r4, r3, r4 @ (PHYS_OFFSET - PAGE_OFFSET)
88 add r8, r8, r4 @ PHYS_OFFSET
// 算出 PAGE_OFFSET(0xC0000000) 对应的物理地址(0x50000000),作为页表的基址
// 16K level 1 swapper page table 起始地址就是 0x50000000
// __enable_mmu 相关的映射 放在 了 0x50000000 + (__enable_mmu << 2)
// 整个kernel 的映射放在了 0x50000000 + #(KERNEL_START & 0x00f00000) >> 18]
// boot args 的映射 放在了 0x50000000 相关的位置
81 adr r3, __mmap_switched_data
__mmap_switched_data 放的是一些
1.段符号相关的(data段,bss段)
2.将控制权交换给start_kernel之前需要设置的一些变量