Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

ARM Linux 虛擬位址映射基礎:map-base.h 詳解

編輯:Linux 教學

ARM 架構下,Linux 核心將周邊暫存器映射至核心虛擬位址空間。arch/arm/plat-samsung/include/plat/map-base.h 定義了 Samsung 平台的基礎映射巨集與常用虛擬位址常數。

核心映射基址

#define S3C_ADDR_BASE (0xF4000000)

#ifndef __ASSEMBLY__
#define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x))
#else
#define S3C_ADDR(x) (S3C_ADDR_BASE + (x))
#endif

S3C_ADDR_BASE 設為 0xF4000000,留出足夠空間給 vmalloc 區。S3C_ADDR(x) 將實體位址偏移轉換為核心虛擬位址,C 語言與組合語言版本略有不同。

主要周邊虛擬位址定義

巨集虛擬位址對應實體偏移功能
S3C_VA_IRQ0xF40000000x00000000中斷控制器
S3C_VA_SYS0xF41000000x00100000系統控制
S3C_VA_MEM0xF42000000x00200000記憶體控制器
S3C_VA_TIMER0xF43000000x00300000定時器區塊
S3C_VA_WATCHDOG0xF44000000x00400000看門狗
S3C_VA_OTG0xF4E000000x00E00000USB OTG
S3C_VA_OTGPHY0xF4F000000x00F00000OTG PHY
S3C_VA_UART0xF50000000x01000000UART 序列埠
S3C_VA_RTC0xF4C000000x00C00000即時時鐘

CPU 專屬映射區

#define S3C_ADDR_CPU(x) S3C_ADDR(0x00500000 + (x))

保留 0x00500000~0x00DFFFFF 區間供特定 CPU 實作(如 S3C2410/S3C6410/S5P 等)擴充專用暫存器映射,避免汙染通用定義。

使用範例

驅動程式中直接引用巨集進行 ioremap 或存取:

void __iomem *uart_base = S3C_VA_UART; // 已映射區域可直接使用
writel(val, uart_base + UART_OFFSET);

設計考量

  • 靜態映射:早期啟動階段建立 1:1 區段映射,無需動態 ioremap,存取效率最高。
  • 位址空間規劃:0xF4000000 起始,每區塊 1MB 對齊,便於用單指令(MOV + 8-bit immediate)載入基址。
  • 擴充性:S3C_ADDR_CPU 機制讓新 SoC 只需補充專屬偏移,不修改通用標頭檔。

此檔案是 Samsung ARM 平台所有驅動開發的基石,熟悉映射分佈能快速定位暫存器位址並除錯記憶體存取錯誤。

Copyright © Windows教程網 All Rights Reserved