微波EDA网,见证研发工程师的成长! 2025濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柟缁㈠枟閸庡顭块懜闈涘缂佺嫏鍥х閻庢稒蓱鐏忣厼霉濠婂懎浜惧ǎ鍥э躬婵″爼宕熼鐐差瀴闂備礁鎲¢悷銉ф崲濮椻偓瀵鏁愭径濠勵吅闂佹寧绻傚Λ顓炍涢崟顓犵<闁绘劦鍓欓崝銈嗙箾绾绡€鐎殿喖顭烽幃銏ゅ川婵犲嫮肖闂備礁鎲¢幐鍡涘川椤旂瓔鍟呯紓鍌氬€搁崐鐑芥嚄閼搁潧鍨旀い鎾卞灩閸ㄥ倿鏌涢锝嗙闁藉啰鍠栭弻鏇熺箾閻愵剚鐝曢梺绋款儏濡繈寮诲☉姘勃闁告挆鈧Σ鍫濐渻閵堝懘鐛滈柟鍑ゆ嫹04闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簼閹癸綁鏌i鐐搭棞闁靛棙甯掗~婵嬫晲閸涱剙顥氬┑掳鍊楁慨鐑藉磻閻愮儤鍋嬮柣妯荤湽閳ь兛绶氬鎾閳╁啯鐝曢梻浣藉Г閿氭い锔诲枤缁辨棃寮撮姀鈾€鎷绘繛杈剧秬濞咃絿鏁☉銏$厱闁哄啠鍋撴繛鑼枛閻涱噣寮介褎鏅濋梺闈涚墕濞诧絿绮径濠庢富闁靛牆妫涙晶閬嶆煕鐎n剙浠遍柟顕嗙節婵$兘鍩¢崒婊冨箺闂備礁鎼ú銊╁磻濞戙垹鐒垫い鎺嗗亾婵犫偓闁秴鐒垫い鎺嶈兌閸熸煡鏌熼崙銈嗗23闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簼閹癸綁鏌i鐐搭棞闁靛棙甯掗~婵嬫晲閸涱剙顥氬┑掳鍊楁慨鐑藉磻閻愮儤鍋嬮柣妯荤湽閳ь兛绶氬鎾閳╁啯鐝栭梻渚€鈧偛鑻晶鎵磼椤曞棛鍒伴摶鏍归敐鍫燁仩妞ゆ梹娲熷娲偡閹殿喗鎲奸梺鑽ゅ枂閸庣敻骞冨鈧崺锟犲礃椤忓棴绱查梻浣虹帛閻熴垽宕戦幘缁樼厱闁靛ǹ鍎抽崺锝団偓娈垮枛椤攱淇婇幖浣哥厸闁稿本鐭花浠嬫⒒娴e懙褰掑嫉椤掑倻鐭欓柟杈惧瘜閺佸倿鏌ㄩ悤鍌涘 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簼閹癸綁鏌i鐐搭棞闁靛棙甯掗~婵嬫晲閸涱剙顥氬┑掳鍊楁慨鐑藉磻閻愮儤鍋嬮柣妯荤湽閳ь兛绶氬鎾閻樻爠鍥ㄧ厱閻忕偛澧介悡顖氼熆鐟欏嫭绀€闁宠鍨块、娆戠磼閹惧墎绐楅梻浣告啞椤棝宕橀敐鍡欌偓娲倵楠炲灝鍔氭繛鑼█瀹曟垿骞橀懜闈涙瀭闂佸憡娲﹂崜娑㈡晬濞戙垺鈷戦柛娑樷看濞堟洖鈹戦悙璇ц含闁诡喕鍗抽、姘跺焵椤掆偓閻g兘宕奸弴銊︽櫌婵犮垼娉涢鍡椻枍鐏炶В鏀介柣妯虹仛閺嗏晛鈹戦鑺ュ唉妤犵偛锕ュ鍕箛椤掑偊绱遍梻浣筋潐瀹曟﹢顢氳閺屻劑濡堕崱鏇犵畾闂侀潧鐗嗙€氼垶宕楀畝鍕厱婵炲棗绻戦ˉ銏℃叏婵犲懏顏犵紒杈ㄥ笒铻i柤濮愬€ゅΣ顒勬⒒娴e懙褰掓晝閵堝拑鑰块梺顒€绉撮悞鍨亜閹哄秷鍏岄柛鐔哥叀閺岀喖宕欓妶鍡楊伓婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻鐔兼⒒鐎靛壊妲紒鐐劤椤兘寮婚敐澶婄疀妞ゆ帊鐒﹂崕鎾绘⒑閹肩偛濡奸柛濠傛健瀵鈽夐姀鈺傛櫇闂佹寧绻傚Λ娑⑺囬妷褏纾藉ù锝呮惈闉嬪銈庡亜椤﹀灚淇婇悽绋跨妞ゆ牗姘ㄩ悿鈧梻浣告啞閹哥兘鎳楅崼鏇炴辈闁绘ḿ鏁哥壕钘壝归敐鍛儓妞ゅ骸鐭傞弻娑㈠Ω閵壯冪厽閻庢鍠栭…閿嬩繆閹间礁鐓涢柛灞剧煯缁ㄤ粙姊绘担鍛靛綊寮甸鍌滅煓闁硅揪瀵岄弫鍌炴煥閻曞倹瀚�
首页 > 硬件设计 > 嵌入式设计 > ARM-Linux嵌入式系统的Boot Loader分析与设计

ARM-Linux嵌入式系统的Boot Loader分析与设计

时间:01-17 来源: 点击:

引言

由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basic input output system)。但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。

1 Boot Loader分析

系统加电,然后复位后,基本上所有的CPU都是从复位地址上取得指令的。以微处理器为核心的嵌入式系统中,通常都有某种类型的固态存储设备(FLASH,E2PROM等),这个固态存储设备被映射到一个预先设置好的地址上。在系统加电复位后,一开始处理器就会去执行存放在复位地址处的程序,而且通过开发环境可以将Boot Loader定位在复位地址一开始的存储空间上,因此Boot Loader是系统加电后,在操作系统内核或者一些应用程序被运行之前,首先会运行的程序。对于嵌人式系统来说,比较复杂的或者为了方便后期开发大的应用程序,有的使用操作系统,也有很多的情况下,因功能简单,或仅包括应用程序的系统不使用操作系统,但是不论有无操作系统在启动时都必须执行Boot Loader,为的是准备好软硬件运行环境。

以微处理器为核心的嵌入式系统中,一般都有某种类型的固态存储设备(FLASH,E2PROM等),这个固态存储设备被映射到一个预先设置好的地址上。在系统加电复位后,一开始处理器就会去执行存放在复位地址处的程序。而且通过开发环境可以将Boot Loader定位在复位地址一开始的存储空间上,因此Boot Loader是系统加电后,在操作系统内核或者一些应用程序被运行之前,首先会运行的程序。对于Linux系统,它的主要任务有以下7个方面。

(1)初始化处理器及外设的硬件资源配置。一般嵌入式系统的处理器在上电复位后,外部的I/O引脚都处于输入状态,处理器的片内和片外设备资源都需要配置。

(2)建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的环境,这样就能为最终启动操作系统的内核提供最好条件。

(3)把操作装载到映射的内存中,这也是所有任务当中最重要的一个,只有完成这个任务,操作系统才能被装载到内存当中去,Boot Loader一般会提供串口和网络装载两种方式。

(4)为了把操作系统的映像保存在FLASH中,以便以后启动,可以直接装载FLASH的数据,而不用重新下载程序,但需要对FLASH进行编程。

(5)运行操作系统。设置相关的寄存器和资源,跳转到操作系统的所在空间,进行相关的引导,这就是Boot Loader。

(6)在Linux系统启动时,传递系统的启动参数,可以给内核传递命令行等参数,通过命令行可以选择控制系统的启动模式。

(7)命令行的解析和输入/输出控制。为了开发的方便,多数的Boot Loader都采用串口作为终端的控制方式。
Boot Loader的启动过程可分为两个重要阶段。第一阶段:由于Boot Loader的实现依赖于CPU的体系结构,所以设备代码的初始化等功能都在该阶段完成。而且,为了达到缩短代码的目的,通常用汇编语言来编写。在这一阶段的执行过程中,又可分为几个方面。

①硬件设备的初始化。在该阶段的执行过程中,首先需要对硬件设备进行初始化,其目的主要是为第二阶段的执行以及随后Kernel的调用准备基本的硬件环境。
②为加载Boot Loader的第二阶段准备RAM空间。为了获得更快的执行速度,通常把第二阶段加载到RAM空间中来执行。因此,必须为加载Boot Loader准备好一段可用的RAM空间范围。
③设置堆栈指针。设置堆栈是为了执行C语言代码作好准备。
④跳转到第二阶段的C入口点。当程序执行到这个位置时,可以通过修改PC寄存器的值,使其跳转到第二阶段。

第二阶段阶段的启动流程分析:为了便于实现复杂的功能和获得更好的代码可读性和可移植性,通常第二阶段的代码用C语言来实现。但是,与普通C语言的不同之处是,这里使用了"弹簧床"的概念,即先用汇编语言写一段小程序,并将这段小程序作为第二阶段可执行映像的执行入口点,然后在汇编程序中用CPU跳转指令跳入main()函数中去执行,当main()函数返回时,CPU执行路径再次返回到汇编程序中第二阶段,包括初始化本阶段要使用的硬件设备,检测系统内存映射,会将Kernel映像和根文件系统映像从FLASH中读到RAM空间中,为内核设置启动参数调用内核。

閻忓繐瀚伴。鑸电▔閹捐尙鐟归柛鈺冾攰椤斿嫰寮▎鎴旀煠闁规亽鍔忓畷锟�

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

网站地图

Top