»¶Ó»Øµ½KernelÖÐ……
¼ÌÐø˵__vet_atagsº¯Êý£¬Õâ¸öº¯ÊýÈԾɶ¨ÒåÔÚarch\arm\kernel\head-common.sÎļþÖУº
/* Determine validity of the r2 atags pointer. The heuristic requires
* that the pointer be aligned, in the first 16k of physical RAM and
* that the ATAG_CORE marker is first and present. Future revisions
* of this function may be more lenient with the physical address and
* may also be able to move the ATAGS block if necessary.
*
* r8 = machinfo
*
* Returns:
* r2 either valid atags pointer, or zero
* r5, r6 corrupted
*/
__vet_atags:
tst r2, #0x3 @ aligned?
bne 1f
ldr r5, [r2, #0] @ is first tag ATAG_CORE?
subs r5, r5, #ATAG_CORE_SIZE
bne 1f
ldr r5, [r2, #4]
ldr r6, =ATAG_CORE
cmp r5, r6
bne 1f
mov pc, lr @ atag pointer is ok
1: mov r2, #0
mov pc, lr
ENDPROC(__vet_atags)
ÓÉTIµÄоƬÊÖ²áÖª£¬OMAP3430µÄSDRAMµØÖ·¿Õ¼ä×Ô0x80000000Æ𣬼Æ1GB¿Õ¼ä¡£º¯Êý¿ªÊ¼µÄ×¢ÊÍÃ÷È·ÒªÇóATAG±íÐèÒªÔÚRAMÎïÀíµØÖ·Ç°16KB£¬¼´0x80000000-0x80004000·¶Î§ÄÚ£¬r2µÄ0x80000100Âú×ã´ËÒªÇó¡£¼òµ¥µÄÅжÏÁËÒ»ÏÂATAG±íµÄÆðʼµØÖ·ÊÇ·ñ¶ÔÆ룬ÊÇ·ñÒÔATAG_CORE×÷Ϊ¿ªÍ·±êÖ¾£¬¸Ãº¯Êý·µ»Ø¡£
__create_page_tablesº¯Êý£¬ÕâÊÇÒª·ÖÎöµÄÖص㺯Êý£¬¸Ãº¯Êý¾ÍÔÚarch\arm\kernel\head.sÎļþĩβ¡£
ÏÈÀ´¿´Ò»¸öºê¶¨Ò壺
.macro pgtbl, rd
ldr \rd, =(KERNEL_RAM_PADDR - 0x4000)
.endm
KERNEL_RAM_PADDRµÄ¶¨ÒåΪ£º
#define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)
PHYS_OFFSETÔÚÎļþarch\arm\plat-omap\include\mach\memory.hÖУ¨ÔõôÕÒµ½ÕâÀïµÄ£¬ÆäʵÊÇarch\arm\kernel\head.sÖаüº¬ÁËarch\arm\include\asm\memory.hÖÐÓÖ°üº¬ÁËarch\arm\plat-omap\include\mach\memory.hµÄÔµ¹Ê……£©¶¨ÒåΪ0x80000000£¬¶øTEXT_OFFSETÔòÐèÒªÔÚMakefileÖÐÑ°ÕÒµ½´ð°¸¡£arch\arm\MakefileÖж¨Òå
……
textofs-y := 0x00008000
……
TEXT_OFFSET := $(textofs-y)
¿É¼û£¬TEXT_OFFSETµÄֵΪ0x00008000£¬Ôٻص½ºêpgtbl£¬¿É¼ÆËã³öKERNEL_RAM_PADDRµÄֵΪ0x80000000+0x00008000=0x80008000×îºó¸³¸ø¼Ä´æÆ÷ֵΪ0x80008000-0x4000=0x