您的位置:首页 > 运维架构 > Linux

Linux系统的启动过程

2014-09-19 17:41 204 查看
Linux系统的启动必然是从加电开始,一开始没有任何的程序可以运行,只有上电后引起的门电路的启动。具体来说,就是CPU的RESET引脚会产生一个逻辑值,使得CPU的寄存器被置上值。然后CPU开始执行固化在ROM中的启动代码,这个启动代码叫做BIOS系统,主要进行底层的硬件初始化操作。BIOS还负责将装载器复制到RAM中,装载器比如Grub,LILO,BIOS从硬盘的第一个扇区(叫主引导扇区MBR)找到Grub程序,开始复制。

第二个然后Grub被复制到RAM(对于x86系统架构,拷贝到0x00007c00)中,一共512字节(在MBR引导扇区中存储,存入RAM,前446字节内容存放grub(bootloader)关键引导程序,接着64字节放置硬盘分区表DPT(Disk
Partition Table)),然后BIOS继续拷贝setup函数(位于arch/x86/boot/header.S中)。

第三个然后,BIOS将内核映像拷贝到内存正确的位置(一般的高地址装载bzImage大内核映像,装载到0x00100000地址)。

第四个然后,BIOS跳转并执行setup()函数,setup()函数根据操作系统的类型继续重新初始化硬件设备,调整内核镜像的位置,并使CPU切换到保护模式。

第五个然后,BIOS跳转并执行startup_32()函数(位于arch/i386/boot/compressed/head.S),主要作用是解压缩内核映像,并对位置做调整。

第六个然后,跳转到0xC0000000+0x100000+0x2000位置,执行startup_32函数(位于arch/i386/kernel/head.S),主要作用如下:[1]建立初始化临时内核页表[2]建立内核态堆栈[3]建立初始化临时全局描述符表和中断描述符表[4]将系统参数写入空页框中[4]跳转执行start_kernel()函数。

第七个然后(最终):执行start_kernel()函数,完成中断表、调度程序、软中断、日期时间、控制台、模块、slab分配器的初始化,确定CPU时钟速度,创建第一个内核线程等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: