虛擬地址映射機制--動態、靜態


靜態映射: 
內核移植時,以代碼的形式硬編碼,如果需要更改,必須改源碼並重新編譯內核
在內核啟動時建立靜態映射表,到內核關閉時銷毀。
除非更改並重新編譯,否則只要內核啟動,靜態映射表就一直存在且不發生變化

靜態映射表的建立過程
(1)映射表描述。
linux/arch/arm/plat-s5p/cpu.c中的s5p_iodesc[]結構體數組
(2)映射表建立函數。該函數負責根據(1)中的映射表來建立linux內核的頁表映射關系。
kernel/arch/arm/mach-s5pv210/mach-smdkc110.c smdkc110_map_io函數
smdkc110_map_io
s5p_init_io
iotable_init
結論:靜態映射表本質上是一個結構體數組,數組中的每一個元素就是一個映射,
描述了物理地址和虛擬地址之間的映射。這個結構體數組記錄的映射關系被 iotable_init所使用,該函數負責將這個結構體數組格式的表建立成MMU所能
識別的頁表映射關系。以此達到開機后直接使用虛擬地址來訪問物理地址。
(3)開機時調用映射表建立函數

動態映射:
驅動程序根據需要隨時動態的建立、使用、銷毀映射。
動態映射是隨機的、臨時的、每一次建立都可能不一樣
選擇虛擬地址映射的方法:
1、兩種映射可以同時使用。就如:去學校可以選擇有多種路線,但指向的最終目的地都是一個
2、靜態映射類似於C語言中的全局變量(一旦分配作用周期就是內核運行的全過程),
動態映射類似於C語言中的malloc堆內存(用到就分配,用完就釋放,)
3、靜態映射的好處是執行效率高,壞處是始終占用虛擬地址空間;
動態映射的好處是按需使用虛擬地址空間,
壞處是每次使用前后都需要代碼去建立&&銷毀映射
動態映射的建立:
(1).request_mem_region,//向內核申請需要的內存資源
(2).ioremap,//真正實現映射,傳給他物理地址返回一個對應的虛擬地址
銷毀動態映射
(1).iounmap


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM