• 2008-06-05

    Redboot(i386)启动流程(四) - [源码分析]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://redboot.blogbus.com/logs/22329480.html

    上篇继续

    进入保护模式之后做以下工作:

    •  设置中断栈空间,在之前栈定义在小于0x3000的内存空间中。通过
       movl $__interrupt_stack, %esp
       将栈重新设置在__interrupt_stack处,并分配了4096kB的栈空间。
       栈大小也可以通过改变cdl文件进行调整。

     

    • hal_idt_init(packages/hal/i386/pc/v2_0/include/platform.inc) 
        设置idt向量, 回头会在介绍中断的文章中介绍这部分。
    • BSS段初始化(清零)
      解释: BSS(Block Started by Symbol)用来存放程序中未初始化的全局变量的一块內存区域,属于静态內存分配。

     

    • hal_platform_init(packages/hal/i386/pc/v2_0/src/plf_misc.c)
        这部分是内容比较多,也比较重要。主要为 初始化 中断,异常 以及虚拟向量表。
        初始化虚拟向量表的工作通过调用函数 hal_if_init 来完成
      在eCos中设置了3张向量表,idt, hal_vsr_table, hal_virtual_vector_table
      内存地址如下:
      idtStart = 0x00001000;
      hal_vsr_table = 0x00001800;
      hal_virtual_vector_table = 0x00001c00;

    idt 是硬件实际设置的中断区域,当中断发生后进入调用idt的中断向量。而eCos将idt的中断向量有指向 hal_vsr_table
    (猜测是为了隔离不同的cpu中断机制不同,专门设置了hal_vsr_table,使其中断处理方式一致)

    在 hal_platform_init 函数中,初始化所有中断(和异常),设定为缺省的中断处理例程,以防止有中断意外发生,造成程序进入未知状态。

    有关中断,异常,虚拟向量等相关处理机制内容比较多,会在以后的文章具体介绍。

    • cyg_hal_invoke_constructors

    这个函数主要执行相关的构造函数,因为ecos一部分代码是用c++写的,所以有些类具有构造函数,需要在首先执行,这里面做这部分的处理。

     

    • cyg_start
      最后则进入主函数 cyg_start, 这个函数中,首先执行外围设备的初始化,之后就开始轮询处理用户输入的命令。

    以上就是Redboot启动的全过程。由于篇幅有限,对很多部分没有深入讨论。在之后计划对以下部分进行讨论:

    1 eCos设备驱动结构和编写

    2 PCI设备的初始化过程

    3 中断和异常处理过程

    4 虚拟向量(hal_virtual_vector_table)介绍

    5 Redboot 命令介绍

    等等……


    收藏到:Del.icio.us