Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 操作系统 > Linux > linux 内核的启动部分。
【标  题】:linux 内核的启动部分。
【关键字】:linux
【来  源】:http://blog.chinaunix.net/article.php?articleId=37596&blogId=7720

linux 内核的启动部分。

Your Ad Here 最近在自己电脑上找点东西,却发现自己在03年读 LINUX kernel 时留下的一些东西一共4篇文章。贴上来看看有没有回贴的。

启动linux 内核

 

第一部分 基础知识

1。bzImage内核结构

    bzImage的意思就是压缩完还依然很大的核心映象(BIG ZIP IMAGE),bzImage是一个可以自解压的头,bzimage在文件中的结构如下

 

    [bootsect]+[setupsect]+[misc+head]+[piggy]

 

       bootsect是启动扇区,size=512,在文件中偏移为0

 

    setupsectsetup扇区,size一般不等于四个扇区大小。size=setup_sectors*512,在文件中偏移为512

 

    [misc+head]是个自解压的头,它的c程序为misc.c,汇编文件为head.s,二进制文件为misc.o+head.o=vmlinux-piggy.o,在文件中偏移为(1+setup_sectors)*512。

 

       makefile压缩的核心用数据段的方式编译成piggy.o。配置的文件为vmlinux.src

      

       piggy.o=fun(vmlinuz.bin.gz)

 

       连接misc,head,piggyvmlinux

    vmlinux 又通过一到工序(objcpy)变成vmlinux.bin

 

       合并bootsectsetupsectvmlinux.bin的程序是bulid.c。它是生成bzimage的工具,build.c的工作如下

 

    a.读出bootsetc,在bootsetc偏移508和509处填上根目录的设备号(minor_root,major_root),把bootsetc写到新文件。

 

    b.读出setupsetc,把setupsect写到新文件。用512对齐setupsect大小。如果setupsect小于2048,则用0补齐。

   

    c.读出vmlinux.bin,把vmlinux.bin写到新文件。

   

    d.计算setupsect的大小setup_sectors,和vmlinux.bin的大小sys_size。把他们写到新文件偏移497的地方。

 

2。I386 bzImage的启动方式。

    内核关于I386详细的启动文档在/usr/src/linux/Documentation/i386/boot.txt。以下是我对引导程序(如grublilo)引导bzImage的认识。

 

    1。bzImage可以分实模式程序和保护模式程序两部分,bootsectsetupsect为实模式部分,head.smisc.c以及压缩的内核数据piggy(以数据段的方式出现)为保护模式部分。

 

    2。引导程序把bzImage文件头2560(五个扇区大小,一个bootsect扇区+setupsect开始的四个扇区)字节保存在地址0x90000开始的地方。

   

    3。引导程序把setupsect剩余部分保存在0x10000开始的地方。

   

    4。保护模式部分被保存在0x100000开始的地方。

   

    5。引导程序跳转到0x90200开始执行setupsect的程序。

   

    6。setupsect进入保护模式后,立马跳转到head.s处开始执行(地址为0x100000),这个过程完成设置段选择符cs

 

    7。设置段选择符ds、es、fs、gs,以及ss(它们都是同一个段选择符。另外csds除了属性不同外其他都一样。linux通过设置相同的段抛弃了x86的使用段参加内存管理)。sssp的设置比较有趣。sp指向的是misc.c里在全局数组user_stack的最后一个元素。,

   

    8。做简单的准备后,跳转到misc.cdecompress-kernel

 

    9。decompress-kernel把内核解压分到两个地方。第一部分0x2000~~0x90000,第二部分开始地址是0x100000+head.s+misc.c+piggy+[HEAP_SIZE],HEAP_SIZE=0x3000。结束地址就是PC机最大内存处:)。当然如果解压后的内核能完全放在第一部分,那么第二部分也就用不着了。

   

    注:内核之所以要分放两个地方是因为

        1。最后的内核要合并到从0x100000开始的地方。head.s再次跳转到0x100000     始执行

        2。head.smisc.c本身的起始地址为0x100000,如果直接把内核解压到           0x100000则会覆盖当前代码。

 

    10。head.smove_routine_start代码移动到0x1000,然后跳转到   0x1000move_routine本身是head.s的一部分。

   

    11。move_routine_start合并两部分的内核到0x100000然后跳转到0x100000    arch/kernel/head.s)开始执行。

 

    12。内核解压具体的过程如下。

   

    第一步,准备解压

 

                     程序运行在此

addr=0x1000  addr=0x2000~0x90000  addr=0x100000                  ddr=0x~

none                none                head.s+misc.c+piggy+heap-szie    none

 

    第二步,解压完成

                     程序运行在此

addr=0x1000  addr=0x2000~0x90000  addr=0x100000                  ddr=0x~

none                内核数据1              head.s+misc.c+piggy+heap-szie    内核数据2

 

    第三步,移动move_routine_start

                     程序运行在此

addr=0x1000  addr=0x2000~0x90000  addr=0x10000                    ddr=0x~

move_routine 内核数据1                        head.s+misc.c+piggy+heap-szie    内核数据2

 

    第四步,合并内核数据

程序运行在此

addr=0x1000  addr=0x2000~0x90000  addr=0x10000             ddr=0x~

move_routine 内核数据1                        完整的内核数据        内核数据2,

 

    第五步,解压完成,运行kernel

                     程序运行在此

addr=0x1000  addr=0x2000~0x90000  addr=0x10000             ddr=0x~

move_routine 可丢弃                       完整的内核数据        可丢弃

 

 

 

 

 

 

3。bootsect扇区内容

    bootsect是启动扇区,它的大小为512字节。pc机在启动时bios自动把启动设备的    第一扇区读到内存7c00开始的地方(段地址为7c00),然后从bios跳转到7c00处开始执行。

 

    老的linux使用它把setupsectpiggy.o读到内存。这个过程实现的功能很单一,但却由于pc体系结构的限制而变得复杂(一会读这个柱面,一会读那个柱面。还因为要把数据倒向扩展内存而罗嗦)。

 

    新的linuxkernel v26)不再使用bootsect来加载setupsectpiggy.o。而只支持lilogrub之类的引导程序了。不过bootsect还是在bzimage中存在,因为它的位置保存着一些参数,但bootsect的程序变简单了(简单的打印错误信息,直接从bootsect启动linux已经不支持了)。

 

4。setupsect扇区功能

    bios读取机器配置。然后开启保护模式。跳到head.s

 

5。head.s功能

    调用misc中的decompress-kernel解压vmlinuz.bin.gz0x100000处,然后跳转到0x100000运行arch/kernel/head.s

 

6。misc.c功能

    解压vmlinuz.bin.gz

 

7setupsect扇区详细内容

    1。复位磁盘 Reset the disk controller

边跑边读LINUX KERNEL:【上一篇】
在Redhat Linux AS 4下实现软件RAID:【下一篇】
【相关评论】
没有相关评论
【发表评论】
姓名:
邮件:
随机码*
评论*
      
|  首 页  |  版权声明  |  联系我们   |  网站地图  |
CopyRight © 2004-2007 软讯网络 All Rigths Reserved.