ARM处理器系统初始化编程注意事项

ARM处理器系统初始化编程注意事项

本文摘自王洪辉老师的《嵌入式系统Linux内核开发实战指南(ARM平台)》一书

 

在上述系统初始化过程中有以下两点需要注意,如果处理不好就可能出现程序跑飞的情况。
1)如果需要将程序从flash搬移到DRAM中运行
在现代嵌入式系统中,由于DRAM的速度比flash的速度快很多,所以除了极少数对性能要求不高但对成本要求很高的系统把程序放在flash中并一直在flash中运行外,大部分嵌入式系统都是将程序从flash芯片搬到DRAM芯片中运行,这样就会存在一个问题,因为我们编译链接程序都是将程序链接到程序最后运行的场所DRAM中的地址上,但是系统启动时只能从flash中读取指令,所以从系统启动读取的第一条指令到进入到DRAM运行前的程序代码是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转指令,因为此时程序存放的位置与其所链接到的位置不同,如果使用跳转指令,程序将跑飞。
2)如果要求程序在MMU使能状态下运行,即系统工作在虚拟地址模式
MMU使得系统能够更好地管理内存,因为MMU可以将同一段物理内存映射到多段虚拟地址空间上,而且可以将物理上不连续的内存映射到连续的虚拟内存空间(减少内存碎片),另外MMU还可以控制虚拟内存区段的缓冲特性和访问权限,所以MMU可以提高内存的使用效率,使程序仿佛能够使用比实际物理内存容量多得多的内存空间,提高系统性能,同时也增加了系统的安全性,所以在带有MMU功能的处理器系统中,一般都应该使能MMU,充分利用其功能。这样一来也会导致一个和上面相同的问题,因为在使用MMU的系统中,各种物理存储空间的实际物理地址与对应的虚拟地址设置得各不相同,包括flash和DRAM的物理地址与虚拟地址。系统启动时MMU被禁止,系统运行在实模式即物理地址模式,但程序却被编译链接到了虚拟地址上,这样在使能MMU之前,存放在flash或DRAM中的程序的实际地址(物理地址)与其链接到的地址是不相同的,所以从系统启动到MMU使能之间的程序代码也应该是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转指令,否则程序也将跑飞。

你可能感兴趣的:(ARM处理器系统初始化编程注意事项)