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