這幾天一直在糾結于系統啟動,bootloader的功能等等,沒有系統學過所以總是想不明白,也沒有系統的文章,總是對一些細節困惑。最近又被分配了應用程序的任務,擔心以后再也沒機會看驅動這邊的東西了...
今天看了一下mmu相關的,都是嵌入式系統的,pc可能有很大不同
mmu,硬件設備(似乎也有軟件實現?),實現虛擬地址到物理地址映射,cpu的指令都是在虛擬地址上執行的(這么說似乎也不準確),或許該說是在沒有mmu的時候,cpu的地址是虛擬地址同時也是物理地址(因為沒有去映射,直接輸出到地址線上了),mmu可以當坐中間的翻譯,系統上電后,cpu自然要從某一處讀指令,那么我們要做的就是把初始化系統的代碼(請允許我叫他bootloader)放在那,
這時候其他外設都(或許有的可以?)驅動不了(cpu不會),cpu的一些工作狀態也不一定是我們想要的(寄存器的值),那么放在這的代碼就要設置一下cpu的參數(比如關中斷),也可以檢測一下硬件什么的,比如往某個地址寫個什么,但是終極目標是加載OS,驅動周邊設備供應用工作
關于這個放指令的地方,一般(從來都是)放在rom里,flash、eeprom什么的,這里速度比較慢,運行個bootloader可以(匯編),程序還是要放到ram上(c語言還要堆棧的,不像匯編不要動態內存,堆棧的sp也要往哪分),比如sdram什么的,嵌入式的話就是知道從rom里拷到ram里了,這里你要知道放到哪,那么你就又要知道這個系統硬件怎么連的,ram規格什么樣的才能知道物理地址,要不然cpu不知道給你放到哪,放完了跳過去啟動就行了,跳過去的方法還是設置一下寄存器什么的
這里有個問題就是不同設備物理地址連的不一樣(一般來說很多時候都是不連續的甚至),那么操作系統控制起來就有點麻煩了,每個設備都要重新設置寄存器地址啊,系統和程序分配的地址啊什么的,而且很可能某個應用申請不到連續的地址,用指針加加減減的很麻煩
于是誕生了mmu,在bootloader里配置好(似乎一般來說?),他把所有的物理地址按你的要求映射的虛擬地址,不連續的連續了,不統一的統一了(需要根據不同的設備編寫不同的bootloader,但是這似乎比編寫寫操作系統輕松),需要說明的是mmu配置了一個寄存器存放的地址映射的表格的物理地址基址,開啟mmu以后的cpu指令都會根據那個表格翻譯了。
操作系統回對虛擬地址設置訪問權限,有的只能操作系統涂改,有的分給用戶,用戶的程序不能隨便改操作系統的的虛擬內存范圍(這其中就有cpu寄存器之類的),但是cpu也提供了修改它們的接口,這其實是防止意外發生啦,比如你的指針亂指。
再來想想現在的dta的啟動,看看能想通多少。
1、內置rom的啟動程序(或許也叫bootloader)啟動flash里的bootloader,起始地址0xbfe00000(物理地址哦,ps:還可以設置是否效驗什么的。。);
2、flash的bootloader讀取某處的配置信息,獲得應用程序的在flash中的物理地址,然后把應用程序拷到ram里,然后跳過去跑應用,入口應該是個操作系統入口吧
接下來就是我根據各種網上資料對我現在看得這個bootloader的yy
該bootloader的確分兩步,但是不知道這兩部分別干什么暫時假設:
第一步設置一下cpu、內存控制器什么的寄存器,算是最初始的初始化,gpio引腳點亮一個led說明一下,然后把stage2的文件找個ram的地方展開,運行stage2
第二部也就是stage2,初始化串口(關于串口我實在有幾千字的吐槽不提)供調試以及輸出信息什么的(似乎嵌入式全部提供串口,而且都會從串口接收發送數據之類的,難道是因為串口驅動起來很簡單?),再玩一下led,這時候可以找一下哪些物理地址可以用,不過這里這個嵌入式系統似乎哪些可以用都是之前就定好了的?然后就按之前說的從“定好的”地方(flash某處)讀取配置信息,挑一個程序映像,并挑一個ram位置作為目的地拷過去,然后啟動那個程序!
那個程序一般來說是個操作系統了,他會建幾個任務運行什么的
不過很令我沮喪的是我看的關于bootloader的文章表示不要再os啟動前開啟mmu。。。關于os和bl實在還有很懂地方不懂啊,不知道14號前這個應用搞得出來不。。
不知道各位看這塊的時候,是不是也有同感啊。
-
嵌入式系統
+關注
關注
41文章
3593瀏覽量
129476 -
bootloader
+關注
關注
2文章
235瀏覽量
45627 -
MMU
+關注
關注
0文章
91瀏覽量
18291
原文標題:嵌入式er日常!最近一直糾結于MMU,bootloader,dta....
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論