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