關於mmu,bootloader,dta以及各種亂七八糟

這幾天一直在糾結於系統啓動,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號前這個應用搞得出來不。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章