靜態對映表建立過程分析

2021-09-25 07:12:34 字數 2145 閱讀 9729

建立對映表的三個關鍵部分

static struct map_desc s5p_iodesc __initdata = , , , , , , ,

};這個陣列對應的是乙個對映表,每乙個元素都是乙個對映的關係。

例如:#define s5p_va_gpio s3c_addr(0x00500000) = 0xfd500000

#define s5pv210_pa_gpio (0xe0200000)

#define s5p_pa_gpio s5pv210_pa_gpio

.virtual	= (unsigned long)s5p_va_gpio,

.pfn = __phys_to_pfn(s5p_pa_gpio),

.length = sz_4k,

.type = mt_device,

這個對映表就是實體地址0xe0200000,對映到虛擬位址0xfd500000。

sz_4k應該就是對映的長度,這個就是4kbyte的長度。

我們的對映的虛擬位址存在於兩個檔案:

arch/arm/plat-s5p/include/plat/map-s5p.h和

arch/arm/plat-samsung/include/plat/map-base.h中。

2.對映表建立函式。該函式負責由(1)中的對映表來建立linux核心的頁表對映關係。

在kernel/arch/arm/mach-s5pv210/mach-smdkc110.c中的smdkc110_map_io函式

smdkc110_map_io

s5p_init_io

iotable_init

結論:經過分析,真正的核心移植時給定的靜態對映表在arch/arm/plat-s5p/cpu.c中的s5p_iodesc,本質是乙個結構體陣列,陣列中每乙個元素就是乙個對映,這個對映描述了一段實體地址到虛擬位址之間的對映。這個結構體陣列所記錄的幾個對映關係被iotable_init所使用,該函式負責將這個結構體陣列格式的表建立成mmu所能識別的頁表對映關係,這樣在開機後可以直接使用相對應的虛擬位址來訪問對應的實體地址

3.開機時呼叫對映表建立函式

問題:開機時(kernel啟動時)smdkc110_map_io怎麼被呼叫的?

賦值:.map_io = smdkc110_map_io,

呼叫:start_kernel

setup_arch

paging_init

devicemaps_init

if (mdesc->map_io)

mdesc->map_io();

使用writel和readl函式,以及讀改寫操作,見**:

static void __iomem * test_base_addr = null;

#define s5p_gpj0con_offset 0

#define s5p_gpj0dat_offset 4

if (!(test_base_addr = ioremap(phy_gpj0con, 8)))

temp = readl(test_base_addr + s5p_gpj0con_offset);

temp |= (1<<12) | (1<<16) | (1<<20);

writel(temp, test_base_addr + s5p_gpj0con_offset);

temp = readl(test_base_addr + s5p_gpj0dat_offset);

temp &= ~((1<<3) | (1<<4) | (1<<5));

writel(temp, test_base_addr + s5p_gpj0dat_offset);

我們使用ioremap返回void __iomem *型別的值,其實是void *型別,__iomem 是乙個attribute的修飾符。返回乙個指向實體地址的虛擬位址,是void * 型別的。

readl:傳參是乙個虛擬位址。

writel:傳參第乙個是乙個值,第二個是乙個虛擬位址。

讀該寫操作:

1.使用readl讀出來值

2.修改該值

3.writel寫回去

還有兩個函式:

iowrite32和ioread32,使用方法和上面的類似

Linux核心靜態對映表建立過程分析

分析的原始碼 九鼎為s5pv210移植過的linux qt4.8的kernel,核心版本號2.6.35 建立對映表的三個關鍵部分 具體實體地址和虛擬位址的值相關的巨集定義,也就是文章 隨筆 linux字元裝置驅動開發基礎 中靜態對映操作led一節提到的靜態對映表。實際工作中我們也只要明白靜態對映表的...

linux驅動開發擴充套件 靜態對映表建立過程

start kernel setup arch mdesc setup machine machine arch type paging init mdesc devicemaps init mdesc map io ifdef config mach smdkc110 machine start ...

S5PV210靜態對映表的構建過程

注 分析的三星官方的核心。一 板子啟動相關 1.首先得明白一般與板子相關的啟動初始化都在mach c檔案。因為靜態對映表我們主要關注的是板子的gpio,而gpio也屬於板子啟動必須初始化的部分,所以我們要找的檔案就是 kernel arch arm mach s5pv210 mach smdkc11...