ARM Linux Booting Sequence (1)
Linux的启动需要由bootloader来引导。
在bootloader完成system initialization后,会试着将Linux的bzImage和initrd加载memory,接着设定好Linux启动所需的参数,并将program counter指向bzImage所在的地址,将控制权交给Linux。
bootloader在启动Linux时必需设定的参数主要有3个
1. r1 = #0
2. r2 = machine(platform) type id
3. r3 = ATAG start address(physical address)
其中ATAG(kernel tagged list)是bootloader用来存放要传递给kernel使用的系统参数的list。ATAG_CORE和ATAG_NONE此两个field分别代表ATAG的起始和结束。
另外,在Linux启动前,bootloader必须先将CPU设定在SVC mode并且关掉IRQ和FIQ;如果系统有MMU或data cache的话,也必将他们关闭。
Stage
x86上,一个instruction为4 bytes(在进入保护模式之前是2 bytes)。MBR上512 bytes所能存放的指令数不多,对于现在功能日益强大的bootloader来说绝对是不够用的(尤其是一些可以执行多重开机的bootloader)。因此,bootloader的工作又被切割成两个stages,来完成OS加载的工作。
stage 1:
即由MBR上的code所完成。此512 byte的code所能提供的程序功能有限,因此主要的工作只是负责找到stage 2的code在disk上的位置并将code读取出来。
stage 2:
stage 2已不再受限于512 bytes的大小,因此可以让programmer尽情发挥,拓展bootloader的功能。当然,不管如何,bootloader的主要功能仍然是辅助启动OS,因此stage 2的code必须能够判读disk的file system,并以此为依据找到OS image所在的位置并load到memory。stage 2执行完后,系统的所有软硬件就完全转移给OS来控制与管里了。
MBR
现行的hard disk与floppy disk标准规格,以每512 bytes为一个sector。disk上第0号sector称作MBR(Master Boot Record),是存放bootloader的地方。
BIOS在做完POST的程序后,会依照各个开机装置的priority,依序check他们的MBR。假若MBR上的最后2 byte所存放的值为0xaa55此一magic number,表示此装置的MBR所储存的数据为合法的bootloader程序代码,BIOS即将此MBR中512 bytes的数据load到memory的0x0000:0x7c00到0x0000:0x7dff处。接着BIOS设定CS = 0x0000和IP = 0x7c00,将控制权专交给bootloader,从此BIOS在computer运行中就完全失去了作用。
Bootloader概述
Bootloader 是计算器系统用来加载OS到memory的程序
对一般的x86 PC来说,power on或reset后系统将会先到ROM读取并执行BIOS。BIOS执行完POST并在memory的0x0000:0x0000到0x0000:0x0400地址上创建好基本的256个interrupt vector后,即将512 bytes的bootloader标头载入memory的0x0000:0x7c0000之处,接着program counter便跳转到0x0000:0x7c0000执行bootloader。
在embedded system里,bootloader经常是直接烧在ROM中,系统在power on后就立即执行bootloader的程序代码。此时,bootloader就必须身兼x86中BIOS的工作,先作POST和硬件初始化的程序,再加载OS。因为embedded system的硬件通常较简单阳春,所以bootloader的设计和程序撰写上相对于x86 PC的BIOS及bootloader而言是较容易的。