EUARTinit(); //串口初始化 EUARTputString("\n\nDBMX1 Linux Bootloader ver 0.2.0\n"); EUARTputString("Copyright (C) 2002 Motorola Ltd.\n\n"); EUARTputString((U8 *)cmdLine); EUARTputString("\n\n");
EUARTputString("Press any key for alternate boot-up options ... ");
小弟的bootloader主要干这么几件事:init(); 初始化硬件,打印一些信息和提供一些操作选项: 0. Program bootloader image 1. Program kernel image 2. Program root-disk image 3. Download kernel and boot from RAM 4. Download kernel and boot with ver 0.1.x bootloader format 5. Boot a ver0.1.x kernel 6. Boot with a different command line
//the page table in 0800 4000 is just temp base page, when init_task's sweaper_page_dir ready, // the temp page will be useless // the high 12 bit of virtual address is base table index, so we need 4kx4 = 16k temp base page,
mov r0, r4 mov r3, #0 add r2, r0, #0x4000 @ 16k of page table 1: str r3, [r0], #4 @ Clear page table str r3, [r0], #4 str r3, [r0], #4 str r3, [r0], #4 teq r0, r2 bne 1b /* * Create identity mapping for first MB of kernel. * This is marked cacheable and bufferable. * * The identity mapping will be removed by */
// 由于linux编译的地址是0xC0008000,load的地址是0x08008000,我们需要将虚地址0xC0008000映射到0800800一段 //同时,由于部分代码也要直接访问0x08008000,所以0x08008000对应的表项也要填充 // 页表中的表象为section,AP=11表示任何模式下可访问,domain为0。 add r3, r8, r5 @ mmuflags + start of RAM //r3=0800 0c1e add r0, r4, r5, lsr #18 //r0=0800 4200 str r3, [r0] @ identity mapping //*0800 4200 = 0800 0c1e 0x200表象 对应的是0800 0000 的1m /* * Now setup the pagetables for our kernel direct * mapped region. We round TEXTADDR down to the * nearest megabyte boundary. */ //下面是映射4M
void __init setup_arch(char **cmdline_p) { struct param_struct *params = NULL; struct machine_desc *mdesc; //arch structure, for your ads, defined in include/arm-asm/mach/arch.h very long struct meminfo meminfo; char *from = default_command_line;
/******************************************************/ #define NR_BANKS 4 //define the systen mem region, not consistent struct meminfo { int nr_banks; unsigned long end; struct { unsigned long start; unsigned long size; int node; } bank[NR_BANKS]; }; /******************************************************/