2.根据BIOS的设置,来搜索一个操作系统来启动,这个过程可能要试图访问系统中软盘、硬盘、或者CD-ROM的第一个扇区。
3.只要找到一个有效设备,就会把第一个扇区的内容拷贝到RAM(内存)中物理地址0x00007c00开始的位置,并且从这个地址开始执行刚才装载进来的程序。
注:这个程序是引导装入程序,是由BIOS把操作系统的内核映像装载到RAM中所调用的一个程序。
4.linux使用了自己的引导装入程序,不是第一个扇区中的那个小程序,LINUX 的引导装入程序叫做LILO与GRUB(可以识别文件系统,且可以从文件中读入部分引导程序),LILO或许被装载MBR上。用来代替那个装载活动引导扇区的小程序,或许被装在每个磁盘的引导扇区上,在这两种的情况下的结果都是相同的:装入程序在启动过程中被执行时,用户可以选择装入那个操作系统。
5.LILO引导装入程序实际上被划分为两个部分。MBR(硬盘的第一个扇区,主引导记录)或者分区引导扇区包括一个小的引导装入程序,由BIOS把这个小程序装入从地址0x00007c00开始的RAM中,这个小程序再把自己移动到地址0x00096a00,建立实模式栈(0x00098000~0x000969ff),并把LILO的 第2部分装入到从地址0x00096c00开始的位置。注:这个小程序就是LILO的第一部分。
6.第二部分又依次从磁盘读取可用的操作系统映射表,并提供给用户一个提示符,用来选择要启动的操作系统。选择完毕后引导装入程序把相应分区的引导扇区拷贝到RAM中并执行,或者把内核映像拷贝到RAM中。
详解步骤6
1、调用BIOS过程显示loading信息
2、调用BIOS过程从磁盘装入内核映像的初始部分,即将内核映像的第一个512字节从地址0x00090000开始存入RAM,即结束地址为0x00090200。而将setup()函数的代码存入从地址0x00090200开始的RAM中。
3、调用BIOS过程从磁盘中装载其余的内核映像,并把内核映像装载到从低地址0x00010000(适合于make zImage编译的内核)或者从高地址0x00100000(适合于是用make bzImage编译的大内核映像)
4、跳转到setup()代码。
7.setup()函数是汇编语言函数的代码,由连接程序放在内核映像文件的偏移量0x200处。引导装入程序因此可以很容易的确定setup()代码的位置,并把它拷贝到从物理地址0x00090200开始的RAM中。setup()函数初始化计算机中的硬件设备。
完毕后条状到startup_32()汇编语言函数
8.startup_32(包含在arch/i386/boot/compressed/head.S)已经被移动到物理地址0x00100000,或者0x00001000,这取决于内核映像在之前是高装载还是低装载到RAM中,然后会调用decompress_kernel()函数解压内核映像,解压后放在物理地址0x00100000处,且调到0x00100000物理地址位置处开始执行。
9.解压后的内核映像以另一个statup_32()函数开始,这个实在arch/i386/kernel/head.S中。第二个setup_32()函数为第一个Linux进程建立环境,最后跳转到start_kernel()函数。
10.start_kernel()函数完成linux内核的初始化工作,在start_kernel()函数开始执行后就会显示内核的版本信息 “Linux version x.x.x”
以上就是Linux内核装载的过程。