linux内存管理 (三) 8 内核启动从start到start_kernel过程中的相关符号的注解

  • 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之前需要设置的一些变量

你可能感兴趣的:(Linux内存管理,linux,运维,服务器)