免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1335 | 回复: 0
打印 上一主题 下一主题

linux 内核的启动部分。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-25 21:49 |只看该作者 |倒序浏览
最近在自己电脑上找点东西,却发现自己在03年读 LINUX kernel 时留下的一些东西一共4篇文章。贴上来看看有没有回贴的。
启动linux 内核


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

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

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

    setupsect是setup扇区,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,piggy成vmlinux。
    vmlinux 又通过一到工序(objcpy)变成vmlinux.bin

       合并bootsect、setupsect、vmlinux.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。以下是我对引导程序(如grub,lilo)引导bzImage的认识。

    1。bzImage可以分实模式程序和保护模式程序两部分,bootsect和setupsect为实模式部分,head.s和misc.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(它们都是同一个段选择符。另外cs和ds除了属性不同外其他都一样。linux通过设置相同的段抛弃了x86的使用段参加内存管理)。ss和sp的设置比较有趣。sp指向的是misc.c里在全局数组user_stack的最后一个元素。,
   
    8。做简单的准备后,跳转到misc.c的decompress-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.s和misc.c本身的起始地址为0x100000,如果直接把内核解压到           0x100000则会覆盖当前代码。

    10。head.s把move_routine_start代码移动到0x1000,然后跳转到   0x1000。move_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开始的地方(段地址为7c0:0),然后从bios跳转到7c0:0处开始执行。

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

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

4。setupsect扇区功能
    从bios读取机器配置。然后开启保护模式。跳到head.s。


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

6。misc.c功能
    解压vmlinuz.bin.gz

7。setupsect扇区详细内容
    1。复位磁盘 Reset the disk controller
<span la

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/7720/showart_37596.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP