-
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)介绍
等等……
随机文章:
发现一个不错的东西:protothreads 2009-05-09如何读源码2 2008-09-27Redboot 设备初始化说明 2008-06-15Redboot(i386)启动流程(三) 2008-05-22Redboot(i386)启动流程(二) 2008-05-21
收藏到:Del.icio.us







