如何實現BOOTLOADER

1.之所以要實現一個專用的BOOTLOADER,一是爲了更好的移植和自身的升級,二是爲了方便操作系統的調試,當然,你完全可以將這部分所要實現的與操作系統相關的功能集成到操作系統中去
2.確定一個簡單的BOOTLOADER所要完成的功能:我們這裏只需要完成兩個主要功能,一是將操作系統加載到內存中去運行,二是將自己和操作系統內核固化到ROM存儲區(這裏的ROM可以是很多設備,比如嵌入式芯片中的FLASH,PC機上的軟盤,U盤,硬盤等)

3.BOOTLOADER的編寫:
第一步:要進行相關硬件的初使化,比如在at91rm9200這塊嵌入式板子上(以後都使用這一款芯片,主要是我對這款芯片比較熟悉,嘿嘿),大概要做接下來的幾方面的工作,其一:將CPU模式切換進系統模式,關閉系統中斷,關閉看門狗,根據具體情況進行內存區域映射,初始化內存控制區,包括所使用的內存條的相關參數,刷新頻率等,其二:設定系統運行頻率,包括使用外部晶振,設置
CPU頻率,設置總線頻率,設置外部設備所採用的頻率等。其三:設置系統中斷相關,包括定時器中斷,是否使用FIQ中斷,外部中斷等,還有就是中斷優先級設置,這裏只實現兩個優先級,只有時鐘中斷高一級,其它都一樣,而中斷向量初始化時都將這些中斷向量指向0x18處,並關閉這裏的所有中斷,如果板子還接有諸如FLASH設備的話,還需要設置諸如FLASH相關操制寄存器,其四:需要關閉CACHE,到此爲止,芯片相關內容就完成初始化了


第二步:中斷向量表,ARM的中斷與PC機芯片的中斷向量表有一點差異,嵌入式設備爲了簡單,當發生中斷時,由CPU直接跳入由0x0開始的一部分區域(ARM芯片自身決定了它中斷時就會跳入0x0開始的一片區域內,具體跳到哪個地址是由中斷的模式決定的,一般用到的就是復位中斷,FIQ,IRQ中斷,SWI中斷,指令異常中斷,數據異常中斷,預取指令異常中斷),而當CPU進入相應的由0x0開始的向量表中時,這就需要用戶自己編程接管中斷處理程序了,這就是需要用戶自己編寫中斷向量表,中斷向量表裏存放的就是一些跳轉指令,比如當CPU發生一個IRQ中斷時,就會自動跳入到0x18處,這裏就是用戶自己編寫的一個跳轉指令,假如用戶在此編寫了一條跳轉到0x20010000處的指令,那麼這個地址就是一個總的IRQ中斷處理入口,一個CPU可能有多個IRQ中斷,在這個總的入口處如何區分不同的中斷呢?就由用戶編程來決定了,具體實現請參見以後相關部分,中斷向量表的一般用一個vector.S文件,當然,如何命名那是你自己的喜愛,但有一點需要聲明,那就是在鏈接時一定要將它定位在0x0處


第三步:設置堆棧,一般使用三個棧,一個是IRQ棧,一個是系統模式下的棧(系統模式下和用戶模式共享寄存器和內存空間,這主要是爲了簡單),設置棧的目的主要是爲了進行函數調用和局部變量的存放,不可能全用匯編,也不可能不用局部變量


第四步:將自己以後的代碼段和數據段全部拷貝至內存,並將BSS段清零


第五步:進行串口的初始化(主要是爲了與用戶交互,進行與PC機的文件傳輸),FLASH的初始化這裏在FLASH中存放BOOT和內核),FLASH驅動的編寫(這裏的驅動有別於平常所說的驅動,由於FLASH不像SDRAM,只要設定了相關控制器之後就可以直接讀寫指定地址的數據,對FLASH的寫操作是一塊一塊數據進行,而不是一個字節一個字節地寫,具體請查閱相關資料)
第六步:等待一定的秒數,來接收用戶進行輸入,如果在指定的秒數內用戶未輸入任何字符,那麼
BOOT就開始在FLASH中的指定位置(可以由自己指定,這麼做主要是爲了簡單)讀取內核的所有數據到內存中(具體是內存中的什麼位置由自己指定,也可以採用LINUX之類的做法,就是在內存的起始位置加上一個0x8000處),將跳轉到內核的第一條代碼處);如果用戶在指定的秒數內鍵入了字符(這主要是爲了方便開發,如果開發定型之後完全可以不要這段代碼),那麼就在串口與用戶進行交互,接受用戶在串口輸入的命令,比如用戶要求下載文件在FLASH中指定的位置等,具體內容可參考U-BOOT之類的開源項目到這裏爲止,BOOT部分已完成,這個BOOT非常簡單,僅僅只是將PC機上傳下來的文件固化到FLASH中,然後再將FLASH中的操作系統內核部分加載進內存中,並將CPU的控制權交給操作系統,下一頁開始講解如何寫一個最簡單的操作系統,呵,到現在纔開始切入正題呢!!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章