核心中的2套虛擬位址對映方法 動態對映和靜態對映

2021-09-13 02:21:44 字數 981 閱讀 7325

靜態對映:

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等

在核心中獲取pmem裝置的虛擬位址

pmem的配置可以參考沒有的選項可以不選。不要少選了,不然沒有pmem裝置滴。配置完之後,想要在核心中獲取pmem的虛擬位址,就先來個系統呼叫吧。我的核心是4.4.4。所以在arch x86 entry syscall 64.tbl中新增編號,順序新增即可。然後在include linux sysc...

字元裝置驅動2 虛擬位址對映

前言 驅動程式和應用程式一樣,在系統啟動之後都是執行在虛擬位址之中,每乙個程序單獨的享用4g的位址空間,那麼虛擬位址到底是怎麼建立的呢,在使用它進行硬體驅動的操作前有必要對其進行了解,下面將對靜態 動態虛擬位址的對映原理和使用方法做乙個分析和介紹。1.靜態對映方法的特點 1 核心移植時以 的形式硬編...

虛擬位址與實體地址的對映

對於dsp的每個cpu而言,當由cpu發起的對corepac內部記憶體 l1,l2記憶體,片上暫存器位址 的訪問 通過store或load指令 時,所訪問記憶體的位址就是實體地址 但當cpu訪問corepac外部的記憶體 如msm,即多核共享記憶體或ddr 時,cpu所訪問的32位位址就是虛擬位址了...