微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 使用MMU进行地址重映射的启动代码结构探讨

使用MMU进行地址重映射的启动代码结构探讨

时间:11-10 来源:互联网 点击:

入式应用中,启动代码分为两个部分:一是系统的初始化,包括中断向量表的建立、时钟、存储系统初始化、关键I/O口初始化、各处理器模式下的栈指针初始化等;二是应用程序初始化(或说C库函数初始化),包括RW段的搬移和ZI段的清零、C应用程序堆栈区的建立(__user_initial_stackheap()函数初始化堆栈指针)等。

从这个意义上说,两者并没有直接关系。

(2)但两者并不是没有联系的。以单区模型的堆栈区为例,由于栈是向下生长的,堆是向上生长的,系统模式的栈指针(与用户模式相同,共用一个R13寄存器来描述)实际上定义了用户模式下单区模型堆栈区的上限,而__user_initial_stackheap()函数中指定的heap基址则成为该堆栈区的下限。

因此,如果之前已经对系统模式(用户模式)的栈指针进行了初始化,则在重定义__user_initial_stackheap()函数时,就不需要重新定义stack base了。

四、启动代码的内容和初始化顺序探讨

前面已经指出,启动代码包括系统初始化以及应用程序运行环境的初始化两个部分,完成初始化后,就可以呼叫用户主程序了。参考资料[1]、[3]和[5]等都对两个部分的内容以及过程列出了非常清晰但又简单明了的步骤,这对于初学者来说稍微有点抽象。

如果不需要使用MMU进行地址重映射,那么,结合网上可以搜集的示例boot代码以及分析文档,加上自己动手移植和调试,也是比较容易理解的。如果是使用处理器自带的Remap控制寄存器来进行地址重映射,网上也有相关的代码,例如网友twentyone的boot代码就非常清楚,另外,在《ARM学习报告》系列文章中也对其有详细的分析。

对于在启动过程中要使用MMU进行地址重映射的系统初始化顺序,在《使用AXD调试MMU地址映射程序手记(二)》一文中给出了一个参考步骤,并做了一定的说明。通过进一步参考权威资料,这里,对系统初始化顺序作了小的改进与修正如下:

①禁止所有中断→②初始化时钟→③初始化存储器→④初始化各模式下的栈指针→⑤初始化GPIO→⑥拷贝映像文件到SDRAM→⑦建立地址重映射表→⑧使能MMU→⑨应用程序初始化(RW&ZI区)→⑩使能异常中断→⑾呼叫主程序(dummyOS)。

主要对使能异常中断和应用程序初始化的顺序做了调整,即先进行应用程序的初始化,再使能异常中断,可参考[3]和[10]。

......

———————————————————————————————————————

[1]《ARM体系结构与编程》,杜春雷,清华大学出版社,2003年2月

[2]《ARM嵌入式系统开发——软件设计与优化》,沈建华译,2005年5月

[3]《基于ARM的嵌入式系统程序开发要点》,费浙平,2003年8月

[4]《RealView编译工具开发者指南》,ARM Limited,2003年1月

[5]《ADS Developer Guide》,ARM Limited,2001年11月

[6]《ADS Compilers and Libraries Guide》,ARM Limited,2001年11月

[7]《ADS Linker and Utilities Guide》,ARM Limited,2001年11月

[8]《MAP文件认识初步》,JOHNNY LEE

[9]《堆与栈的区别》,未知网友

[10]《使用ADS1.2进行嵌入式软件开发》,ARM Limited

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top