nand flash的vivi装载器的解析及改进
引言
在操作系统启动前,要先运行一段程序.这段程序就是bootloader,即启动装载程序,它相当于pc机上的bios。通过这段程序,可以实现硬件设备的初始化,建立内存卒问映射等一系列初始化工作,从而将系统的软硬件环境初始化为一个合适的状态.以便为装载操作系统作好准备。在系统加电或复位后,cpu通常都是从一个预先定义的地址上取指令,而在嵌入式系统中,通常将某种类型的固态存储设备(如rom、fiash等)映射到此地址处。通过烧写工具把bootloader的映像烧写到这种固态存储设备上,在系统加电或复位后cpu就可以从这种固态存储设备上取指令执行bootloader以实现系统的启动。由于在rom及flash等存储设备中程序的执行速度与效率不及程序在ram中的执行速度与效率,因此在嵌入式程序设计中,通常都会有程序拷贝的操作。所谓程序拷贝,就是在程序运行过程中,通过软件的方法将周化在rom或flash中的程序拷贝到ram中,然后再跳转到ram相应地址继续执行程序。
1 系统硬件平台及vivi简介
本实验平台的处理器采用的是samsung公司的s3c2410.它是基于arm920t内核的处理器,片外存储器采用了64mb的sdram、32mb的nand flash、2mb的nor flash及4kb的片上sram,其中sdram映射到基地址为ox30000000的存储空间,本实验平台支持两种方式启动,即nand fiash启动和nor flash启动,这两种启动方式以跳线方式进行选择。
vivi是由韩国mizi公司开发的一种针对arm9的bootloader,支持s3c2410。与其它的boot loader相比,它具有容易理解,易于移植等优点。它有两种工作模式:启动加载模式和下载模式。它的启动分为两个阶段,stage1阶段和stage2阶段。stage1主要用汇编语言编写,主要进行与cpu核有关的一些寄存器的配置以及进行一些必要的初始化工作,这部分代码与具体的cpu体系结构依赖性很大。stage2用一般的c语言编写,用来实现一些初始化工作,如建立内存映射,初始化驱动等,这部分代码会被拷贝到ram中执行。本文要研究和论述的主要在stage1阶段。
2 nand flash启动过程分析
nand flash使用i/o口串行地存取数据,它不映射到存储空间中任何一个bank区域上.对nand flash的渎写操作通过串行数据总线进行传输。nand flash以页(page)为单位进行读写,以块(block)为单位进行擦除,本文用到的nand flash页(page)大小为(512+16)byte,块(block)大小等于32个页的大小。每页的最后16byte不用于存储程序数据,它主要用于存储ecc校验、标志位等信息。对nand flash的操作主要是通过向nand f1ash控制器发送命令来进行的,对不同型号的nand flash,其命令有所不同。由于nand flash以块(block)为单位进行擦除,以页为单位进行写入,所以擦除与写入的速度都很快。
由于nand flash不能芯片内执行,s3c2410必须提供一种机制支持从nand flash启动。s3c2410提供了这样一种机制,当设置为nand flash启动时,系统加电或复位后,使能nand flash控制器的自动启动模式,nand flash中的前4kb代码自动地被拷贝到位于cpu内部的称为steppingstone的sram中,这是启动代码的第一次拷贝,这次拷贝由硬件自动完成.然后这块sram被映射到存储空间中的0x00000000处,cpu从这个地址处开始执行启动代码。
由于cpu内部的sram仅有4kb,不能保证整个vivi都被从nand flash中拷贝到cpu内部的sram中,所以这前4kb的代码要保证完成把整个vivi从nand flash拷贝到执行效率更高的ram中运行以及程序的跳转任务,此时从nand flash到sdarm的拷贝过程就是所谓的软件拷贝。
3 程序拷贝过程分析
3.1 vivi的编译与链接
编泽器对程序的处理要经过预编译阶段、编译阶段、汇编阶段及链接阶段,每个目标文件都有一系列段(section),输入文件的段(section)称为输入段(input section).输出文件的段(section) 则称为输出段(output section)。在vivi的链接过程中,用到了一个链接脚本文件,它描述了各个输入文件的各个段(section)如何映射到输出文件的各个(section)中,并控制输出文件中secrion和符号的内存布局,此内存布局决定了vlvi的运行时域。在此阶段,链接器ld利用链接脚本把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析,最后把所有的目标文件链接成为一个可执行的目标文件,即为可烧写到flash中的vivi映像。针对本系统开发板的vivi链接脚本对原链脚本进行了改进,添加了第行,下文的论述会用到此处的变量vivi end。
sections{
.=0x33f00000;
.text :{ * (.text)}
.data allgn(4) :{ * (.data)}
.bss align(4):{ * (.bss) * (common)}
vivi_end=.:
}
其中:sections表示段。第行表示当前地址为0x33f00000,它是text段的起始地址,也是运行时域的起始地址。第行用了通配符*表示所有字符,这里的意思就是说指定的每个目标文件的text section的内容都放到同一个.text中。第行表示指定的每个目标文件的data section的内容都放到问一个.data中,而且要四字节对齐。每行表示指定的每个目标文件的bss section的内容都放到同一个.bss中,所有的普通符号都放到common中,也要四字节对齐。第行是把当前地址赋值给变量vivi_end,它也是运行时域的末地址。
【虹科案例】用于超高磁场的虹科 digitizerNETBOX——高采样率和完全同步采样
全球电视市场低开高走,全年销量实现正增长
联想将推出两款最新笔记本电脑,Thinkpad P1为史上最薄、最轻
基于DWC2的USB驱动开发-UVC的相机终端详解
在时间上连续的信号就一定是模拟信号吗
Nand Flash的VIVI装载器的解析及改进
不会被ai取代的职业
基于BlueCore01b芯片和API实现嵌入式音频网关的设计
电气设备的接地施工
400G将如何引领下一代数据中心网络
有机阳离子和金属掺杂效应对二维无铅基钙钛矿光伏性能影响
HS1101LF湿度传感器在存酒中的应用
初步认识FreeRTOS
当AIoT遇上tinyML是否会成为MCU供应链下一个新商机
基于无线数据传输的水下爆炸压力遥测系统
猎鹰9发射一箭十星,今年已经成功发射20颗卫星
通过应用程序性能监控保护关键基础设施
谷歌发布全新AI SDK,简化安卓应用集成
华为卫星通话和手机通话有什么区别?
PLC智能网关在调温除湿控制系统中如何实现远程监控和故障报警