关于三星S3C44B0X目标板的uClinux Bootloader
发布时间:2008/5/27 0:00:00 访问次数:389
uclinux是为控制领域设计的嵌入式linux操作系统,它沿袭了主流linux的大部分特性,并进行了一定幅度的裁减。其设计主要针对没有内存管理单元(mmu)的微处理器,例如基于arm7tdmi内核的s3c44b0x。
嵌入式linux系统通常由三部份组成:bootloader、kernel和file system。其中bootloader是在系统启动之后、kernel运行之前所执行的第一段代码,其任务是为调用kernel准备必要的软硬件环境。由此可见,bootloader是非常依赖于硬件和操作系统的。所谓依赖于硬件,是指bootloader的实现与处理器体系架构和板级硬件资源密切相关;所谓依赖于操作系统,是指不同操作系统的内核对调用方式和运行环境有不同的要求。
理论上,uclinux在引导时并非一定需要一个独立于kernel image的bootloader im
age。然而将bootloader与kernel分开设计能够使软件架构更加清晰,也有助于灵活地支持多种引导方式,实现必要的辅助功能。uclinux bootloader的主要任务可概括如下:
●引导和初始化
●加载uclinux kernel
●设置内核启动参数
●调用uclinux kernel
●辅助功能:文件下载、flash烧写、人机界面等
对于常见架构的处理器,一般都能找到现成的bootloader,但其结构往往较为复杂,且仍需要针对具体的目标板进行移植。当然,也可以选择自行开发bootloader。由于bootloader image在物理上独立于kernel image,因此不一定跟随linux选用gnu作为开发工具。对于arm处理器,完全可以使用ads或rvds等集成环境来开发bootloader。
1.引导和初始化
1.1硬件初始化阶段一
s3c44b0x在上电或复位后,程序从位于地址0x0的reset exception vector处开始执行,因此需要在这里放置bootloader的第一条指令:b resethandler,跳转到标号resethandler处进行第一阶段的硬件初始化,主要内容为:关wdt,关中断,配置pll和时钟,初始化memory controller。这里比较重要的是配置pll的输出频率,s3c44b0x最高能够支持66mhz;如果目标板上使用dram/sdram,应当据此计算刷新频率等相关参数。
1.2建立异常向量表
arm7tdmi内核规定:包括reset exception vector在内的异常向量表的基地址是0x0,所以存放bootloader的flash基地址也必须是0x0;而s3c44b0x处理器又不支持remap,这意味着一旦发生中断,程序就要跳转到flash中的异常向量表(中断属于异常的一种)。uclinux会在ram里建立自己的二级异常向量表(基地址缺省为0x0c000000);所以编写bootloader时,0x0处的一级异常向量表只需简单地包含向二级异常向量表的跳转: b resethandler;reset handler
ldr pc,=0x0c000004;undefined instruction handler
ldr pc,=0x0c000008;software interrupt handler
ldr pc,=0x0c00000c;prefetch abort handler
ldr pc,=0x0c000010;data abort handler
b .;reserved
ldr pc,=0x0c000018;irq handler&n
bsp;
ldr pc,=0x0c00001c;fiq handler
如果在bootloader运行过程中不必响应中断,那么上面的配置已能满足要求。如果某些bootloader功能要求使用中断(例如用timer interrupt实现精确定时),那么bootloader必须在同样的位置建立自己的二级异常向量表,以便同uclinux保持一致。这张表应存放在flash中,并由bootloader复制到ram地址0x0c000000处。
1.3初始化各种处理器模式
arm7tdmi内核支持7种处理器模式:user,fiq,irq,supervisor,abort,system和undefined。bootloader需要依次切换到每种模式,初始化该模式的程序状态寄存器(spsr)和堆栈指针(sp)。s3c44b0x在上电或复位后处于supervisor模式;本步骤中应该在最后切换回supervisor模式,即bootloader后续部份仍将运行在supervisor模式下。
1.4section重定位
对于ads或rvds等开发工具,一个arm程序通常由ro、rw和zi三个section组成,其中ro是代码和常量,rw是已初始化的全局变量,zi是未初始化的全局变量(在gnu中对应的概念是text、data和bss)。ro代码既可以在flash中运行,也可以在ram中运行。考虑到bootloader可能需要烧写flash,而烧写时处理器无法从flash中读取指令,因此应将ro和rw复制到ram中,并将zi清零。ro复制完毕之后,程序就可以跳转到ram中运行。若不考虑烧写flash,则bootloader不必复制ro,程序始终在flash中运行。
1.5填写中断向量表
中断向量表一般位于ram地址的最高端,存放着各个isr的
嵌入式linux系统通常由三部份组成:bootloader、kernel和file system。其中bootloader是在系统启动之后、kernel运行之前所执行的第一段代码,其任务是为调用kernel准备必要的软硬件环境。由此可见,bootloader是非常依赖于硬件和操作系统的。所谓依赖于硬件,是指bootloader的实现与处理器体系架构和板级硬件资源密切相关;所谓依赖于操作系统,是指不同操作系统的内核对调用方式和运行环境有不同的要求。
理论上,uclinux在引导时并非一定需要一个独立于kernel image的bootloader im
|
●引导和初始化
●加载uclinux kernel
●设置内核启动参数
●调用uclinux kernel
●辅助功能:文件下载、flash烧写、人机界面等
对于常见架构的处理器,一般都能找到现成的bootloader,但其结构往往较为复杂,且仍需要针对具体的目标板进行移植。当然,也可以选择自行开发bootloader。由于bootloader image在物理上独立于kernel image,因此不一定跟随linux选用gnu作为开发工具。对于arm处理器,完全可以使用ads或rvds等集成环境来开发bootloader。
1.引导和初始化
1.1硬件初始化阶段一
s3c44b0x在上电或复位后,程序从位于地址0x0的reset exception vector处开始执行,因此需要在这里放置bootloader的第一条指令:b resethandler,跳转到标号resethandler处进行第一阶段的硬件初始化,主要内容为:关wdt,关中断,配置pll和时钟,初始化memory controller。这里比较重要的是配置pll的输出频率,s3c44b0x最高能够支持66mhz;如果目标板上使用dram/sdram,应当据此计算刷新频率等相关参数。
1.2建立异常向量表
arm7tdmi内核规定:包括reset exception vector在内的异常向量表的基地址是0x0,所以存放bootloader的flash基地址也必须是0x0;而s3c44b0x处理器又不支持remap,这意味着一旦发生中断,程序就要跳转到flash中的异常向量表(中断属于异常的一种)。uclinux会在ram里建立自己的二级异常向量表(基地址缺省为0x0c000000);所以编写bootloader时,0x0处的一级异常向量表只需简单地包含向二级异常向量表的跳转: b resethandler;reset handler
ldr pc,=0x0c000004;undefined instruction handler
ldr pc,=0x0c000008;software interrupt handler
ldr pc,=0x0c00000c;prefetch abort handler
ldr pc,=0x0c000010;data abort handler
b .;reserved
ldr pc,=0x0c000018;irq handler&n
|
ldr pc,=0x0c00001c;fiq handler
如果在bootloader运行过程中不必响应中断,那么上面的配置已能满足要求。如果某些bootloader功能要求使用中断(例如用timer interrupt实现精确定时),那么bootloader必须在同样的位置建立自己的二级异常向量表,以便同uclinux保持一致。这张表应存放在flash中,并由bootloader复制到ram地址0x0c000000处。
1.3初始化各种处理器模式
arm7tdmi内核支持7种处理器模式:user,fiq,irq,supervisor,abort,system和undefined。bootloader需要依次切换到每种模式,初始化该模式的程序状态寄存器(spsr)和堆栈指针(sp)。s3c44b0x在上电或复位后处于supervisor模式;本步骤中应该在最后切换回supervisor模式,即bootloader后续部份仍将运行在supervisor模式下。
1.4section重定位
对于ads或rvds等开发工具,一个arm程序通常由ro、rw和zi三个section组成,其中ro是代码和常量,rw是已初始化的全局变量,zi是未初始化的全局变量(在gnu中对应的概念是text、data和bss)。ro代码既可以在flash中运行,也可以在ram中运行。考虑到bootloader可能需要烧写flash,而烧写时处理器无法从flash中读取指令,因此应将ro和rw复制到ram中,并将zi清零。ro复制完毕之后,程序就可以跳转到ram中运行。若不考虑烧写flash,则bootloader不必复制ro,程序始终在flash中运行。
1.5填写中断向量表
中断向量表一般位于ram地址的最高端,存放着各个isr的
uclinux是为控制领域设计的嵌入式linux操作系统,它沿袭了主流linux的大部分特性,并进行了一定幅度的裁减。其设计主要针对没有内存管理单元(mmu)的微处理器,例如基于arm7tdmi内核的s3c44b0x。
嵌入式linux系统通常由三部份组成:bootloader、kernel和file system。其中bootloader是在系统启动之后、kernel运行之前所执行的第一段代码,其任务是为调用kernel准备必要的软硬件环境。由此可见,bootloader是非常依赖于硬件和操作系统的。所谓依赖于硬件,是指bootloader的实现与处理器体系架构和板级硬件资源密切相关;所谓依赖于操作系统,是指不同操作系统的内核对调用方式和运行环境有不同的要求。
理论上,uclinux在引导时并非一定需要一个独立于kernel image的bootloader im
age。然而将bootloader与kernel分开设计能够使软件架构更加清晰,也有助于灵活地支持多种引导方式,实现必要的辅助功能。uclinux bootloader的主要任务可概括如下:
●引导和初始化
●加载uclinux kernel
●设置内核启动参数
●调用uclinux kernel
●辅助功能:文件下载、flash烧写、人机界面等
对于常见架构的处理器,一般都能找到现成的bootloader,但其结构往往较为复杂,且仍需要针对具体的目标板进行移植。当然,也可以选择自行开发bootloader。由于bootloader image在物理上独立于kernel image,因此不一定跟随linux选用gnu作为开发工具。对于arm处理器,完全可以使用ads或rvds等集成环境来开发bootloader。
1.引导和初始化
1.1硬件初始化阶段一
s3c44b0x在上电或复位后,程序从位于地址0x0的reset exception vector处开始执行,因此需要在这里放置bootloader的第一条指令:b resethandler,跳转到标号resethandler处进行第一阶段的硬件初始化,主要内容为:关wdt,关中断,配置pll和时钟,初始化memory controller。这里比较重要的是配置pll的输出频率,s3c44b0x最高能够支持66mhz;如果目标板上使用dram/sdram,应当据此计算刷新频率等相关参数。
1.2建立异常向量表
arm7tdmi内核规定:包括reset exception vector在内的异常向量表的基地址是0x0,所以存放bootloader的flash基地址也必须是0x0;而s3c44b0x处理器又不支持remap,这意味着一旦发生中断,程序就要跳转到flash中的异常向量表(中断属于异常的一种)。uclinux会在ram里建立自己的二级异常向量表(基地址缺省为0x0c000000);所以编写bootloader时,0x0处的一级异常向量表只需简单地包含向二级异常向量表的跳转: b resethandler;reset handler
ldr pc,=0x0c000004;undefined instruction handler
ldr pc,=0x0c000008;software interrupt handler
ldr pc,=0x0c00000c;prefetch abort handler
ldr pc,=0x0c000010;data abort handler
b .;reserved
ldr pc,=0x0c000018;irq handler&n
bsp;
ldr pc,=0x0c00001c;fiq handler
如果在bootloader运行过程中不必响应中断,那么上面的配置已能满足要求。如果某些bootloader功能要求使用中断(例如用timer interrupt实现精确定时),那么bootloader必须在同样的位置建立自己的二级异常向量表,以便同uclinux保持一致。这张表应存放在flash中,并由bootloader复制到ram地址0x0c000000处。
1.3初始化各种处理器模式
arm7tdmi内核支持7种处理器模式:user,fiq,irq,supervisor,abort,system和undefined。bootloader需要依次切换到每种模式,初始化该模式的程序状态寄存器(spsr)和堆栈指针(sp)。s3c44b0x在上电或复位后处于supervisor模式;本步骤中应该在最后切换回supervisor模式,即bootloader后续部份仍将运行在supervisor模式下。
1.4section重定位
对于ads或rvds等开发工具,一个arm程序通常由ro、rw和zi三个section组成,其中ro是代码和常量,rw是已初始化的全局变量,zi是未初始化的全局变量(在gnu中对应的概念是text、data和bss)。ro代码既可以在flash中运行,也可以在ram中运行。考虑到bootloader可能需要烧写flash,而烧写时处理器无法从flash中读取指令,因此应将ro和rw复制到ram中,并将zi清零。ro复制完毕之后,程序就可以跳转到ram中运行。若不考虑烧写flash,则bootloader不必复制ro,程序始终在flash中运行。
1.5填写中断向量表
中断向量表一般位于ram地址的最高端,存放着各个isr的
嵌入式linux系统通常由三部份组成:bootloader、kernel和file system。其中bootloader是在系统启动之后、kernel运行之前所执行的第一段代码,其任务是为调用kernel准备必要的软硬件环境。由此可见,bootloader是非常依赖于硬件和操作系统的。所谓依赖于硬件,是指bootloader的实现与处理器体系架构和板级硬件资源密切相关;所谓依赖于操作系统,是指不同操作系统的内核对调用方式和运行环境有不同的要求。
理论上,uclinux在引导时并非一定需要一个独立于kernel image的bootloader im
|
●引导和初始化
●加载uclinux kernel
●设置内核启动参数
●调用uclinux kernel
●辅助功能:文件下载、flash烧写、人机界面等
对于常见架构的处理器,一般都能找到现成的bootloader,但其结构往往较为复杂,且仍需要针对具体的目标板进行移植。当然,也可以选择自行开发bootloader。由于bootloader image在物理上独立于kernel image,因此不一定跟随linux选用gnu作为开发工具。对于arm处理器,完全可以使用ads或rvds等集成环境来开发bootloader。
1.引导和初始化
1.1硬件初始化阶段一
s3c44b0x在上电或复位后,程序从位于地址0x0的reset exception vector处开始执行,因此需要在这里放置bootloader的第一条指令:b resethandler,跳转到标号resethandler处进行第一阶段的硬件初始化,主要内容为:关wdt,关中断,配置pll和时钟,初始化memory controller。这里比较重要的是配置pll的输出频率,s3c44b0x最高能够支持66mhz;如果目标板上使用dram/sdram,应当据此计算刷新频率等相关参数。
1.2建立异常向量表
arm7tdmi内核规定:包括reset exception vector在内的异常向量表的基地址是0x0,所以存放bootloader的flash基地址也必须是0x0;而s3c44b0x处理器又不支持remap,这意味着一旦发生中断,程序就要跳转到flash中的异常向量表(中断属于异常的一种)。uclinux会在ram里建立自己的二级异常向量表(基地址缺省为0x0c000000);所以编写bootloader时,0x0处的一级异常向量表只需简单地包含向二级异常向量表的跳转: b resethandler;reset handler
ldr pc,=0x0c000004;undefined instruction handler
ldr pc,=0x0c000008;software interrupt handler
ldr pc,=0x0c00000c;prefetch abort handler
ldr pc,=0x0c000010;data abort handler
b .;reserved
ldr pc,=0x0c000018;irq handler&n
|
ldr pc,=0x0c00001c;fiq handler
如果在bootloader运行过程中不必响应中断,那么上面的配置已能满足要求。如果某些bootloader功能要求使用中断(例如用timer interrupt实现精确定时),那么bootloader必须在同样的位置建立自己的二级异常向量表,以便同uclinux保持一致。这张表应存放在flash中,并由bootloader复制到ram地址0x0c000000处。
1.3初始化各种处理器模式
arm7tdmi内核支持7种处理器模式:user,fiq,irq,supervisor,abort,system和undefined。bootloader需要依次切换到每种模式,初始化该模式的程序状态寄存器(spsr)和堆栈指针(sp)。s3c44b0x在上电或复位后处于supervisor模式;本步骤中应该在最后切换回supervisor模式,即bootloader后续部份仍将运行在supervisor模式下。
1.4section重定位
对于ads或rvds等开发工具,一个arm程序通常由ro、rw和zi三个section组成,其中ro是代码和常量,rw是已初始化的全局变量,zi是未初始化的全局变量(在gnu中对应的概念是text、data和bss)。ro代码既可以在flash中运行,也可以在ram中运行。考虑到bootloader可能需要烧写flash,而烧写时处理器无法从flash中读取指令,因此应将ro和rw复制到ram中,并将zi清零。ro复制完毕之后,程序就可以跳转到ram中运行。若不考虑烧写flash,则bootloader不必复制ro,程序始终在flash中运行。
1.5填写中断向量表
中断向量表一般位于ram地址的最高端,存放着各个isr的