feilengcui008 2015-09-20 704浏览量
(额…觉得Linux编译链接过程和启动过程还是有那么点作用的哈,要理清楚细节非常多…趟了不少源码…记此备忘)
下面是内核镜像的组成:
早期版本的linux内核,如0.1,是通过自带的bootsect.S/setup.S引导,现在需要通过bootloader如grub/lilo来引导。grub的作用大致如下:
下面是较为详细的步骤:
1.BIOS加载硬盘第一个扇区(MBR 512字节)到0000:07C00处,MBR包含引导代码(446字节,比如grub第一阶段的引导代码),分区表(64字节)信息,结束标志0xAA55(2字节)
2.MBR开始执行加载活跃分区,grub第一阶段代码加载1.5阶段的文件系统相关的代码(通过bios中断读活跃分区的扇区)
3.有了grub1.5阶段的文件系统相关的模块,接下来读取位于文件系统的grub第2阶段的代码,并执行
4.grub第2阶段的代码读取/boot/grub.cfg文件,生成引导菜单
5.加载对应的压缩内核vmlinuz和initrd(到哪个地址?)
6.实模式下执行vmlinuz头setup部分(bootsect和setup)[head.S[calll main],main.c[go_to_protected_mode]] ==> 准备进入32位保护模式
7.跳转到过渡的32位保护模式执行compressed/head_64.S[startup_32,startup_64] ==> 进入临时的32位保护模式
8.解压缩剩余的vmlinuz,设置页表等,设置64位环境,跳转到解压地址执行 ==> 进入64位
9.arch/x86/kernel/head_64.S[startup_64]
10.arch/x86/kernel/head64.c[x86_64_start_up]
11.init/main.c[start_kernel]
12.然后后面的事情就比较好知道了:)
ref: Linux source code 3.19.3
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
集结各类场景实战经验,助你开发运维畅行无忧