IO埠與記憶體空間

2021-05-25 08:39:58 字數 2521 閱讀 4817

(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。

(3)readb和writeb:

在裝置的實體地址被對映到虛擬位址之後,儘管可以直接通過指標訪問這些位址,但是工程師宜使用linux核心的如下一組函式來完成裝置記憶體對映的虛擬位址的讀寫,這些函式包括:

·  讀i/o記憶體

unsigned int ioread8(void *addr);

unsigned int ioread16(void *addr);

unsigned int ioread32(void *addr);

與上述函式對應的較早版本的函式為(這些函式在linux 2.6中仍然被支援):

unsigned readb(address);

unsigned readw(address);

unsigned readl(address);

·  寫i/o記憶體

void iowrite8(u8 value, void *addr);

void iowrite16(u16 value, void *addr);

void iowrite32(u32 value, void *addr);

與上述函式對應的較早版本的函式為(這些函式在linux 2.6中仍然被支援):

void writeb(unsigned value, address);

void writew(unsigned value, address);

void writel(unsigned value, address);

(4)把i/o埠對映到「記憶體空間」:

void *ioport_map(unsigned long port, unsigned int count);

通過這個函式,可以把port開始的count個連續的i/o埠重對映為一段「記憶體空間」。然後就可以在其返回的位址上像訪問i/o記憶體一樣訪問這些i/o埠。當不再需要這種對映時,需要呼叫下面的函式來撤消:

void ioport_unmap(void *addr);

實際上,分析ioport_map()的源**可發現,所謂的對映到記憶體空間行為實際上是給開發人員製造的乙個「假象」,並沒有對映到核心虛擬位址,僅僅是為了讓工程師可使用統一的i/o記憶體訪問介面訪問i/o埠。

文章出處:飛諾網(www.firnow.com):

IO埠 IO記憶體 IO空間 記憶體空間的含義和聯絡

1,io空間 x86乙個特有的空間,與記憶體空間獨立的空間,同樣利用io空間可以運算元據,只不過是利用對應的io埠操作函式,例如inb inbw inl outb outw outl 等。2,記憶體空間 記憶體位址的定址範圍,例如32位作業系統記憶體空間為2的32次冪,即4g。3,io埠 當外部暫存...

記憶體空間與分配

1 記憶體分配錯誤 動態記憶體分配錯誤有兩種基本型別 記憶體錯誤和記憶體洩漏。1 記憶體錯誤 當乙個指標或者該指標所指向的記憶體單元成為無效單元,或者記憶體中分配的資料結構被破壞時,就會造成記憶體錯誤。指標未被初始化,指標被初始化為乙個無效位址,指標被不小心錯誤地修改,在與指標相關聯的記憶體區域被釋...

I O埠與I O記憶體

埠的概念 裝置通過系統匯流排上的介面與cpu相連,介面電路中含有多種暫存器,cpu向裝置讀寫資料實際上是向介面上的暫存器讀寫資料,這些暫存器稱為i o埠。乙個介面通常包含控制埠,資料埠,狀態埠。對於x86平台,實體地址就是匯流排位址。linux中,程序中的4gb虛擬記憶體分為使用者空間和核心空間,使...