如果都是在memory空間的話,cpu內部的暫存器(非cpu核的暫存器)和外設上的暫存器地位是同等的,因此對映方法也是2種:1是靜態對映(s3c2410的基本上是這種),2是ioremap,注意對映的單位都至少是page。當然cpu核的暫存器(如x86的cs、ds,arm的r0,r1等)只能用彙編來訪問了
在將linux
移植到目標電路板的過程中,通常會建立外設
i/o記憶體實體地址到虛擬位址的靜態對映,這個對映通過在電路板對應的
map_desc
結構體陣列中新增新的成員來完成,
map_desc
結構體的定義如**清單
11.12
所示。**清單
11.12 map_desc結構體
1 struct map_desc
2 ;例如,
s3c2440 arm
評估板smdk2440
的map_desc
結構體陣列定義如**清單
11.13
所示,位於檔案
/arch/ arm/mach-smdk2440.c
檔案。**清單
11.13 smdk2440評估板的
map_desc陣列
1static struct map_desc smdk2440_iodesc __initdata = , , ,
24 };
linux
作業系統移植到特定平台上
machine_start
到machine_end
巨集之間的定義針對特定電路板而設計,其中的
map_io()
成員函式完成
i/o記憶體的靜態對映,**清單
11.14
給出了smdk2440
電路板的
machine_start
、machine_end
巨集的例子。
**清單
11.14 smdk2440 machine_start、
machine_end巨集
1machine_start(s3c2440, "smdk2440") 2
/* maintainer: ben dooks */ 3
.phys_io= s3c2410_pa_uart, 4
.io_pg_offst= (((u32)s3c24xx_va_uart) >> 18) & 0xfffc, 5
.boot_params= s3c2410_sdram_pa + 0x100, 6
7.init_irq= s3c24xx_init_irq, 8
.map_io= smdk2440_map_io, 9
.init_machine= smdk2440_machine_init,
10 .timer= &s3c24xx_timer,
11machine_end 第
8行賦值給
map_io
的smdk2440_map_io()
函式完成
smdk2440
電路板i/o
記憶體的靜態對映,最終呼叫的是
cpu->map_io()
建立map_desc
陣列中物理記憶體和虛擬記憶體的靜態對映關係。
在乙個已經移植好
os的核心中,驅動工程師完全可以對非常規記憶體區域的
i/o記憶體(外設控制器暫存器、
mcu內部整合的外設控制器暫存器等)依照電路板的資源使用情況新增到
map_desc
陣列中,**清單
11.15
的例子給出了記憶體空間資源的使用情況(注釋部分)與
map_desc
陣列的對應關係。
**清單
11.15根據電路板記憶體資源情況定義
map_desc
1/*2*
邏輯位址
實體地址
3* e800000040000000pci memoryphys_pci_mem_base(max 512m)
4* ec00000061000000pci
配置空間
phys_pci_config_base(max 16m)
5* ed00000062000000pci v3 regsphys_pci_v3_base(max 64k)
6* ee00000060000000pci io
phys_pci_io_base(max 16m)
7* ef000000cache flush
8* f100000010000000
核心模組暫存器
9* f110000011000000
系統控制暫存器
10* f120000012000000ebi
暫存器
11* f130000013000000
計數器/
定時器
12* f140000014000000
中斷控制器
13* f160000016000000uart 0
14* f170000017000000uart 1
15* f1a000001a000000
除錯用leds
16* f1b000001b000000gpio
17*/
18 19 static struct map_desc ap_io_desc __initdata = , , , , , , , , , , , ,
86 };
此後,在裝置驅動中訪問經過
map_desc
陣列對映後的
i/o記憶體時,直接在
map_desc
中該段的虛擬位址上加上相應的偏移即可,不再需要使用
ioremap()
。
驅動中如何訪問CPU中的暫存器
如果都是在memory空間的話,cpu內部的暫存器 非cpu核的暫存器 和外設上的暫存器地位是同等的,因此對映方法也是2種 1是靜態對映 s3c2410的基本上是這種 2是ioremap,注意對映的單位都至少是page。當然cpu核的暫存器 如 x86的cs ds,arm的r0,r1等 只能用彙編來...
CPU中的主要暫存器
在cpu中至少要有六類暫存器。這些暫存器用來暫存乙個計算機字。根據需要,可以擴充其數目。下面詳細介紹這些暫存器的功能與結構。1.資料緩衝暫存器 dr 資料緩衝暫存器用來暫時存放由記憶體儲器讀出的一條指令或乙個資料字 反之,當向記憶體存入一條指令或乙個資料字時,也暫時將它們存放在資料緩衝暫存器中。緩衝...
CPU中的主要暫存器
在cpu中至少要有六類暫存器 指令暫存器 ir 程式計數器 pc 位址暫存器 ar 資料暫存器 dr 累加暫存器 ac 程式狀態字暫存器 psw 這些暫存器用來暫存乙個計算機字,其數目可以根據需要進行擴充。1.資料暫存器 資料暫存器 data register,dr 又稱資料緩衝暫存器,其主要功能是...