驅動中如何訪問CPU中的暫存器?

2021-04-26 01:47:16 字數 3022 閱讀 7260

如果都是在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 又稱資料緩衝暫存器,其主要功能是...