發表文章

目前顯示的是 11月, 2014的文章

自己動手做OS之Raspberry Pi MMU initialization.

圖片
寫了一個簡單的bare metal啟動MMU的程式, 把實際位址0x20000000~0x210000000 對應到虛擬位址0xa0000000~0xa1000000 ARM MMU的部份在ARMv6之前跟之後的版本不同, 請看Technical Reference Manual。 Raspberry Pi MMU initialization example. hackpad note:https://lbd.hackpad.com/MMU-initialization-Jl8YoJ3iUdf source code:https://github.com/tzuCarlos/RaspberryPi/tree/master/labMMU 為什麼需要MMU? TODO:.... 頁表(page table)是由頁表項(page table entry, PTE)組成的 。 每一個PTE包含一段虛擬位址(page)映射到一段實體位址的資訊,而page的大小依ARM core版本不同,有不同的支持1K(tiny page), 4K(small page), 64k(large page), 1MB, 16MB。 page的大小決定了映射的粒度(granularity):  如果我們把page切1MB,那64MB的記憶體就需要64MB/1MB的PTE,每個PTE是32bits(4bytes),64x4=256bytes頁表項空間。4G就是4096x6=16384=16K 切1K,4K,64K需要用二級查表,1MB,64MB用一級查差,二級差表用途是縮小PTE,以減少佔用記憶體空間,但降底了尋址的效率。 16M的page叫super section, 1M的叫section。 L1表還有個名稱叫page directory entry(PDE)。 ARM 的位址轉換涉及底下三種位址[1]: 虛擬位址 (Virtual Address,VA): CPU 送出的位址。 修改後的虛擬位址 (Modified Virtual Address,MVA): 快取和 MMU 看到的是 MVA。 物理位址 (Physical Address,PA): 內存看到的是 PA。