新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 操作系统研究。UEFI
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 操作系统原理 』 → Linux操作系统下关于引导和初始化的问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6242 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: Linux操作系统下关于引导和初始化的问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 操作系统原理 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 

    是就去启动其他介质.

      一般来说,Linux是从硬盘启动的.这就需要不同的自举程序.在Intel系统里,用得最多的自举程

      序就是LILO.对于其它的体系结构,还存在着别的自举程序.LILO可以安装在MBR上(请注意:在安装

      Red Hat Linux时,有一个步骤会让用户选择把LILO安装到MBR或者引导扇区)或一个活动分区的引导扇

      区上.

      由于LILO太大,MBR无法容纳,所以它被分成两部分.MBR(或者磁盘分区的引导扇区)包含有一个

      小的自举程序,它被BIOS载入到起始地址为0x00007c00的内存中.然后,这个小程序再把自己移到

      0x0009a000地址处,接着设置实模式栈,最后加载第二部分的LILO自举程序(请注意:实模式栈地址范

      围是0x0009b000 到 0x0009a200).

      第二部分的LILO会从磁盘读取所有可用的操作系统,并且给用户列出,以选择所要启动的系统.一旦

      用户选择完成,自举程序就会加载相应的扇区内容到内存中并且执行之.

      自举程序bootsect.S

      自举程序bootsect.S被BIOS调用时(跳到物理地址为0x00007c00处),要执行以下操作:

      (1)把自已从地址0x00007c00移动到0x00090000;

      (2)使用地址0x00003ff4,创建"实模式"栈;

      (3)设置磁盘参数表.


      (4)通过调用BIOS程序显示"Loading Linux"信息;

      (5)自举程序BIOS调用来加载的setup()函数,并把它放在起始地址为0x00090200的内存中;

      (6)自举程序BIOS调用加载剩余的内核程序,并将其放入起始地址为0x00010000或者0x00100000;

      (根据内核类型,对于小内核zImage放在 0x10000 ,大内核bzImage放在0x100000)

      此处是如何判断要加载的内核是什么的

      (7)然后,跳转到setup()函数.

      Setup()函数的功用

      Setup()函数可以在/linux-2.4.22/arch/i386/boot/setup.S文件中找到.

      Setup()函数代码是在完整的内核自举程序加载以后,才会跳到相应的函数代码处.在内核文件中,

      其偏移地址是0x200.这使得自举程序很容易找到这段代码,并将其拷贝到起始物理地址为0x00090200的

      内存中.

      这个Setup()文函数到底是做什么用的 在计算机时里,内核要正确地操作所有硬件就必需首先要检

      测到它们,并且以一种有序的方式进行初始化.Setup()函数初始化所有的硬件设备,从而为内核操作它创

      造了一个环境.

      但是,前面我们不是已经提到过BIOS会检测所有的硬件吗 虽然BIOS初始化了所有的硬件,但是Linux

      内核并不放心,它还要以自己的方式对所有的硬件进行初始化.Linux内核之所以要设计成这样,是为了

      增强可移植性和稳定性.这也是Linux内核要优于很多目前可用的Unix和类Unix内核的原因之一,并且

      也使得它在很多方面表现的非常出众.

      Setup()函数主要完成以下任务:

      (1)首先是检测系统可用内存的总量,它是通过BIOS程序来完成检测的;

      (2)设置键盘重复延迟时间和重复速度;

      (3)检测视频卡;

      (4)重新初始化硬盘控制器和硬盘参数;


      (5)检测一个MCA;

      (5)检测一个PS/2定点设备(鼠标总线);

      (6)检测高级电源管理器(APM)BIOS支持;

      (7)检测内核在内存中的位置,如果在低地址0x00010000,就将其移到高地址0x00001000,如在高地

      址则不做任何移动;

      (8)设置设备中断描述表(IDT)和全局描述表(GDT);

      (9)如已经有了浮点单位(FPU),则重置之;

      (10)重新调用程序中断控制器;

      (11)通过设置cr0状态寄存器的PE位,把CPU从"实模式"切换到"保护模式";

      (12)跳转到stratup_32( )汇编语言函数.

      因为在内核中不能做BIOS调用,内存信息由setup通过INT 0X15 来加以查询,并根据获得的信息生

      成一张物理内存构成图,称为e820图,再通过参数块传给内核,使内核知道系统中内存资源的配置.因为

      在做int 0x15来查询内存构成是要把调用参数之一设置成0xe820,所以叫e820图.

      l 第一个stratup_32( )函数

      在启动过程中要用到两个stratup_32( )函数,虽然它们都是汇编语言函数,但是却是两个完全不同

      的函数.我们这里所说的函数包含在/usr/src/linux-2.4.2/arch/i386/boot/compressed/head.S文件里.

      Setup()文件执行后,这个函数就被加载到物理地址为0x00100000或者物理地址为0x00001000的内存中(取

      决于内核是载入高或者低内存).

      当执行这个函数时,会执行以下的操作:

      (1)初始化段寄存器和一个临时栈.

      (2)内核中没有初始化的数据都用0填充.它是通过symbols _edata和 _end来识别的.

      (3)执行decompress_kernel( )函数.这个函数用于对Linux内核解压缩.这个时候,屏幕上将显示

      "Uncompressing Linux……"信息.解压缩完成后,就会显示"OK, booting the kernel"信息.现在有


      一个问题,就是解完压缩的内核被放置在什么位置 答案是如果Linux内核被加载低地址,那么解压缩的内

      核将被置于物理地址为0x00100000的地方.如果在高地

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/9/7 8:19:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 操作系统原理 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/7/1 9:23:01

    本主题贴数5,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  Linux操作系统下关于引导和初始化的问题(3788字) - 卷积内核,2007年9月7日
        回复:  e设备,重定向stdin,stdout和stderr到控制台,最后,搜索文件系统中的init ..(3583字) - 卷积内核,2007年9月7日
        回复:  址,则内核会被先解压到一个临时缓冲区中,待完  成后再将其加载到物理地址为0x00100000..(3795字) - 卷积内核,2007年9月7日
        回复:  是就去启动其他介质.  一般来说,Linux是从硬盘启动的.这就需要不同的自举程序.在Inte..(4053字) - 卷积内核,2007年9月7日
        回复:  r-On Self-Test,POST),这时会显示版本及其它很多相关的硬件信  息. BIO..(3870字) - 卷积内核,2007年9月7日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms