如果都是在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陣列
1 static 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巨集
1 machine_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,
11 machine_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 * e8000000 40000000 pci memory phys_pci_mem_base (max 512m)
4 * ec000000 61000000 pci 配置空間 phys_pci_config_base (max 16m)
5 * ed000000 62000000 pci v3 regs phys_pci_v3_base (max 64k)
6 * ee000000 60000000 pci io phys_pci_io_base (max 16m)
7 * ef000000 cache flush
8 * f1000000 10000000 核心模組暫存器
9 * f1100000 11000000 系統控制暫存器
10 * f1200000 12000000 ebi暫存器
11 * f1300000 13000000 計數器/定時器
12 * f1400000 14000000 中斷控制器
13 * f1600000 16000000 uart 0
14 * f1700000 17000000 uart 1
15 * f1a00000 1a000000 除錯用leds
16 * f1b00000 1b000000 gpio
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 又稱資料緩衝暫存器,其主要功能是...