linux驅動中位址空間轉換

2021-07-26 06:36:06 字數 1059 閱讀 7624

在linux kernel 中,實體地址是不能直接使用的,必須通過轉換才可以。

轉換分為兩種, 靜態和動態。

靜態就是下面那種,不過,靜態的位址轉換,還需要在kernel 初始化的時候作對映。  

動態對映是使用 ioremap 函式 。

[cpp]view plain

copy

#define sl2312_gpio_base  0x4d000000  

#define io_address(x)  (((x)&0x0fffffff)+(((x)>>4)&0x0f000000)+0xf0000000)   

#define gemini_gpio_base1  io_address(sl2312_gpio_base)   

linux 有記憶體保護機制,無論是核心態還是使用者態。  

靜態對映 :是在實體地址上加乙個偏移量, 所以虛擬位址是固定的。  

動態對映 :系統會生成乙個虛擬位址對應到實體地址上,虛擬位址不是固定的。

linux在初始化執行時會根據乙個map_desc的陣列中的實體地址進行靜態對映,0x4d000000位址應該就是這樣對映的。

靜態對映的位址無須使用icoremap函式,只要知道在map_desc陣列中實體地址與虛擬位址的移仿就可以了。  

至於驅動程式中關於實體地址是不是都要轉換呢,這個是當然的,linux是執行在虛擬位址的。

任何程式不能訪問實體地址,都必須轉換為實體地址才能訪問。只不過,在核心空間已經是轉換好了的(如前所述),可以隨便的訪問。 

動態對映是由linux核心統一管理,當使用kmalloc(分配在核心空間)和malloc函式申請時,核心會找到一塊空餘的物理記憶體,並在頁表中動態地新增一項其與虛擬位址對應的表項。 

靜態對映那應該就是linux在初始化階段讀取map_desc陣列進行的位址對映,map_desc中包括了一對對的實體地址和虛擬位址的對應關係,這個可以根據硬體修改,其中的虛擬位址必須是核心空間的,例如,sdram的物理是0x30000000 那麼可以將其對映為0xe0000000. 通過靜態對映後的位址一般之後就不會更改了的,除非你想辦法改掉。

linux驅動中實體地址的空間轉換

在linux kernel 中,實體地址是不能直接使用的,arm9可以最大定址範圍為1g,其從0x00000000開始都是實體地址。必須通過轉換才可以。轉換分為兩種,靜態和動態。靜態就是下面那種,不過,靜態的位址轉換,還需要在kernel 初始化的時候作對映。動態對映是使用 ioremap 函式 c...

解惑 Linux中的位址空間

函式mem init中,有這樣一行 high memory void va max low pfn page size 其中,max low pfn為物理記憶體的最大頁數。所以在圖中,page offset到high memory 之間就是所謂的物理記憶體對映。只有這一段之間,實體地址與虛位址之間是...

linux位址轉換

三 位址轉換 上圖揭示了程序空間 核心空間與實體地址之間的轉換關係。在linux中,實體地址用page結構 表示,物理內存在初始化時已經生成了page結構管理,其他位址空間則需要生成page再進行管理 ioremap 實體地址可以被對映到核心空間或程序空間,也可以從核心空間或程序使用者空間解除實體地...