Linux开机流程

在开机时,由于80x86的特性CS(Code Segment)这个寄存器中放的都是1,而IP(Instruction Pointer)这个寄存器中全部放着0,换句话说,CS=FFFF而IP=0000。此时,CPU就依据CS和IP的值,到FFFF0H去执行那个地方所放的指令。这时候,由于FFFF0H已经到到了高位置的顶端,所以,FFFF0H这个地方总会放一个JMP指令,跳到比较低的位置。
接着,ROM BIOS就会做一些检查的动作,像内存、键盘等等,并在我们俗称的UMB(Upper Memory Block)之中扫描,看看是否有合法的ROM存在(比如SCSI卡上的ROM)。假如有就到里面去执行一些东西,执行完后再继续刚才的行程。到了最后,读取硬盘上的第一个sector。
在这里,假设各位由硬盘启动。因此,就硬盘的构造而言,它的第一个sector称为MBR(Master Boot Record)。因为一个sector是512bytes,而MBR这512bytes可分为两部分,第一个部分为Pre-Boot,占了446bytes;第二部分是Partition Table,占了66bytes。Pre-Boot的作用之一,就是去看看哪个Partition被标为Active,然后去读那个Partition的Boot区。
在Linux的启动方面,一般人最常把LILO或Grub放在MBR或Superblock,假如你把LILO或Grub放在MBR,此时你的屏幕就会出现启动项选择,接着就进行Load Kernel动作。在另一方面,假如你把LILO或Grub安装在Superblock,通常你还会有一个管理开机的程序,也许是放在MBR或者放在一个单独的Partition。再由这个管理开机的程序读取LILO或Grub,进而做Load Kernel的动作。到目前为止,Kernel被load到memory之后,接着又进行了一连串probe周边的动作,像串口、并口、软盘、声卡、硬盘、光驱等,接着mount root Partition。在这之后Kernel会启动init这个process。init这个process的PID为1,它是所有Process的祖先。
上一篇:hdu4714(树形dp)


下一篇:利用Python实现自动化办公之Excel简单操作