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 ...