自己写bootloader——mini2440(七、跳转到main函数执行)

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

猜你喜欢

转载自www.cnblogs.com/liuyuchun/p/9138716.html