隨想錄(mmu的學習)
【 宣告:版權所有,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
有一本書叫《一步一步寫嵌入式作業系統——ARM程式設計方法與實踐》。這本書很薄,大約有250-300多頁的樣子。雖然不是很厚,但是內容還是很實在的。特別是它依賴於skyeye和toolchain,可以單憑一臺pc就可以完成大部分的嵌入式作業系統開發工作,這本身還是值得肯定的。當然,用它開發出來的os不可以作為工業使用,但是它對我們瞭解toolchain、soc、print、mmu、interupt、fs、程序排程、系統呼叫這些功能的實現,還是非常有用的。
當然,對我自己來說,最喜歡的還是關於MMU的部分。因為本書中雖然關於MMU描述的內容很多,但是真正涉及的程式碼不多,有興趣的同學可以看看這個連結ofollow,noindex" target="_blank">https://github.com/feixiaoxing/skyeye_ucos2/blob/master/mmu.c 。
只要大家耐著性子將這個mmu.c程式碼讀一下,就會發現被大家討論很多的MMU其實不過如此。閱讀之後,大家也會得出自己的一些結論。比如,
1,一開始soc上電後是沒有開始MMU的
2,剛開始執行的pc地址就是實體地址
3,MMU本身依賴的其實就是一張表,cpu要知道的就是這張表的基地址
4,image版本大部分都是根據virtual address編譯的
5,TLB就是MMU table的快取
6, MMU中除了說明基地址,還要進行讀、寫、執行、cache、優先順序許可權的設定
7,一般IMMU和DMMU是分開的
8,設定MMU後,一般就不再關閉
9,IO地址也可以MMU
10,cpu只認virtual address,但是bus只認physical address
11,kernel中的pc address其實也是virtual address
12,MMU中不同的virtual address 其實可以對應同一塊physical address
13,MMU中table基地址肯定是physical address
14,DMA永遠需要的是physical address,不過為了方便user使用,還要是uncacheable的
上面的認知只是我個人的想法,特別是學習了openrisc cpu的程式碼,並且結合arm的mmu彙編程式碼之後,自己對mmu、icache、dcachhe的認知就更加深刻了。