內核中的2套虛擬地址映射方法:動態映射和靜態映射

靜態映射:
1)內核移植時以代碼的形式硬編碼(代碼裏已經把它寫固定了,即移植的時候已經設計好了要把哪個物理地址映射哪個虛擬地址),如果要更改的話必須改源代碼後重新編譯內核。開機時調用映射表建立函數,映射表建立函數。該函數根據映射表來建立linux內核的頁表映射關係。
start_kernel
setup_arch
paging_init
devicemaps_init

if (mdesc->map_io)
mdesc->map_io();
2)對於移植好的內核,在內核啓動時建立靜態映射表,到內核關機時銷燬,中間一直有效;
3)靜態映射的好處是執行效率高,壞處是始終佔用虛擬地址空間;
4)所謂映射表其實就是頭文件中的宏定義,不同SoC,不同版本內核中靜態映射表位置、文件名可能不同。

動態映射:
1)驅動程序根據需要隨時動態地建立、使用和銷燬映射;
2)映射是短期臨時的,映射建立時,是要先申請再映射然後使用,使用完要解除映射時要先解除映射再釋放申請;
3)動態映射的好處是按需使用虛擬地址空間,壞處是每次使用前後都需要用函數去建立映射和銷燬映射。如:request_mem_region函數向內核申請(報告)需要映射的內存資源,ioremap函數真正用來實現映射,傳給他物理地址他給你映射返回一個虛擬地址,iounmap函數結束映射,release_mem_region函數釋資源。

另外需要注意的是:
1)二種映射並不排斥,可以同時使用;靜態映射類似於C語言中全局變量,動態方式類似於C語言中malloc堆內存。在實際大多數驅動開發工作中用動態還是用靜態我們根本不用考錄,因爲寫代碼,我們都是抄的,說的好聽點就是移植的,一般情況下只需要體會內核的代碼是怎麼寫,自己認真體會就可以了。
2)內核提供的寄存器讀寫接口(arch/arm/include/asm/io.h):writel和readl,iowrite32和ioread32等

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