1、ldr pc,=main
/* 5. 执行main */ ldr lr, =halt ldr pc, =main halt: b halt
2、main函数的主要架构
/* 0. 帮内核设置串口: 内核启动的开始部分会从串口打印一些信息,但是内核一开始没有初始化串口 */ /* 1. 从NAND FLASH里把内核读入内存 */ /* 2. 设置参数 */ /* 3. 跳转执行 */
/* 0. 帮内核设置串口: 内核启动的开始部分会从串口打印一些信息,但是内核一开始没有初始化串口 */
uart0_init();
/* 1. 从NAND FLASH里把内核读入内存 */
puts("Copy kernel from nand\n\r");
/*
*0x60000+64 //源地址 +64跳过64字节的头部
*unsigned char *)0x30008000 //目标地址
*0x200000//长度,代码大小
*/
nand_read(0x60000+64, (unsigned char *)0x30008000, 0x200000); puthex(0x1234ABCD); puts("\n\r"); puthex(*p); puts("\n\r");
/* 2. 设置参数 */
puts("Set boot params\n\r"); setup_start_tag(); setup_memory_tags(); setup_commandline_tag("noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"); setup_end_tag();
<1>
setup_start_tag
设置擦拭农户存放的位置0x30000100,
/* The list must start with an ATAG_CORE node */ #define ATAG_CORE 0x54410001 struct tag_core { u32 flags; /* bit 0 = read-only */ u32 pagesize; u32 rootdev; };
struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem32 mem; struct tag_videotext videotext; struct tag_ramdisk ramdisk; struct tag_initrd initrd; struct tag_serialnr serialnr; struct tag_revision revision; struct tag_videolfb videolfb; struct tag_cmdline cmdline; /* * Acorn specific */ struct tag_acorn acorn; /* * DC21285 specific */ struct tag_memclk memclk; } u; };
#include "setup.h"
static struct tag *params;
void setup_start_tag(void) { params = (struct tag *)0x30000100; params->hdr.tag = ATAG_CORE; params->hdr.size = tag_size (tag_core); params->u.core.flags = 0; params->u.core.pagesize = 0; params->u.core.rootdev = 0; params = tag_next (params); }
#define tag_next(t) ((struct tag *)((u32 *)(t) + (t)->hdr.size)) #define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
<2>
setup_memory_tags
<3>
setup_commandline_tag
<4>
setup_end_tag