CPU位址空間詳解

2022-08-11 06:30:10 字數 2467 閱讀 5059

linux下的io埠和io記憶體

cpu對外設埠實體地址的編址方式有兩種:一種是io對映方式,另一種是記憶體對映方式。 

linux將基於io對映方式的和記憶體對映方式的io埠統稱為io區域(io region)。

io region仍然是一種io資源,因此它仍然可以用resource結構型別來描述。

linux管理io region:

1) request_region()

把乙個給定區間的io埠分配給乙個io裝置。

2) check_region()

檢查乙個給定區間的io埠是否空閒,或者其中一些是否已經分配給某個io裝置。

3) release_region()

釋放以前分配給乙個io裝置的給定區間的io埠。

linux中可以通過以下輔助函式來訪問io埠:

inb(),inw(),inl(),outb(),outw(),outl()

「b」「w」「l」分別代表8位,16位,32位。

對io記憶體資源的訪問

1) request_mem_region()

請求分配指定的io記憶體資源。

2) check_mem_region()

檢查指定的io記憶體資源是否已被占用。

3) release_mem_region()

釋放指定的io記憶體資源。

其中傳給函式的start address引數是記憶體區的實體地址(以上函式引數表已省略)。

驅動開發人員可以將記憶體對映方式的io埠和外設記憶體統一看作是io記憶體資源。

ioremap()用來將io資源的物理位址對映到核心虛位址空間(3gb

- 4gb)中,引數addr是指向核心虛位址的指標。

linux中可以通過以下輔助函式來訪問io記憶體資源:

readb(),readw(),readl(),writeb(),writew(),writel()。

linux在kernel/resource.c檔案中定義了全域性變數ioport_resource和iomem_resource,來分別描述基於io對映方式的整個io埠空間和基於記憶體對映方式的io記憶體資源空間(包括io埠和外設記憶體)。

1)關於io與記憶體空間:

在x86處理器中存在著i/o空間的概念,i/o空間是相對於記憶體空間而言的,它通過特定的指令in、out來訪問。埠號標識了外設的暫存器位址。intel語法的in、out指令格式為:

in 累加器,

out ,累加器

目前,大多數嵌入式微控制器如arm、powerpc等中並不提供i/o空間,而僅存在記憶體空間。記憶體空間可以直接通過位址、指標來訪問,程式和程式執行中使用的變數和其他資料都存在於記憶體空間中。 

即便是在x86處理器中,雖然提供了i/o空間,如果由我們自己設計電路板,外設仍然可以只掛接在記憶體空間。此時,cpu可以像訪問乙個記憶體單元那樣訪問外設i/o埠,而不需要設立專門的i/o指令。因此,記憶體空間是必須的,而i/o空間是可選的。

(2)inb和outb:

在linux裝置驅動中,宜使用linux核心提供的函式來訪問定位於i/o空間的埠,這些函式包括:

· 讀寫位元組埠(8位寬)

unsigned inb(unsigned port); 

void outb(unsigned char byte, unsigned port); 

· 讀寫字埠(16位寬)

unsigned inw(unsigned port); 

void outw(unsigned short word, unsigned port); 

· 讀寫長字埠(32位寬)

unsigned inl(unsigned port); 

void outl(unsigned longword, unsigned port); 

· 讀寫一串位元組

void insb(unsigned port, void *addr, unsigned long count); 

void outsb(unsigned port, void *addr, unsigned long count);

· insb()從埠port開始讀count個位元組埠,並將讀取結果寫入addr指向的記憶體;outsb()將addr指向的記憶體的count個位元組連續地寫入port開始的埠。

· 讀寫一串字

void insw(unsigned port, void *addr, unsigned long count); 

void outsw(unsigned port, void *addr, unsigned long count); 

· 讀寫一串長字

void insl(unsigned port, void *addr, unsigned long count); 

void outsl(unsigned port, void *addr, unsigned long count); 

上述各函式中i/o埠號port的型別高度依賴於具體的硬體平台,因此,只是寫出了unsigned。

CPU定址?為什麼需要虛擬位址空間?

cpu定址 現代處理器使用的是一種稱為虛擬定址的定址方式。使用虛擬定址,cpu需要將虛擬位址翻譯成實體地址,這樣才能訪問到真實的物理記憶體。實際上完成虛擬位址轉換為實體地址轉換的硬體是cpu中含有乙個被稱為記憶體管理單元的硬體。1.使用者可以訪問任意的記憶體,定址記憶體的每個位元組,這樣容易破壞作業...

系統位址空間,PCI位址空間

1 系統位址空間與 pci 位址空間 1.1 pci 位址空間 pci 匯流排具有 32 位資料 位址復用匯流排,所以其儲存位址空間為 2的32次方 4gb 也就是 pci 上的所有裝置共同對映到這 4gb 上,每個 pci 裝置占用唯一的一段 pci 位址,以便於 pci 匯流排統一定址。每個 p...

CPU 位址分配

1.s3c2440a 的儲存器控制器有以下特性 l 大小端 通過軟體選擇 l 位址空間 每個bank有128m 的位元組 總共1g位元組 8個banks l 可程式設計的訪問位寬,bank0 16 32 位 其他bank 8 16 32 位 l 共8個儲存器banks l 6 個是rom,sram ...