linux的線性位址空間為
0x00000000
到0xffffffff
。linux
核心將這
4g位元組的空間分為兩個部分:將最高的
1g位元組(
0xc0000000
到0xfffffff
)供核心使用,稱之為核心空間。而將較低的
3g位元組(
0x00000000
到0xbfffffff
),供各個程序使用,稱之為使用者空間。因為每個程序都可以通過系統呼叫進入核心,因此,
linux
核心由系統內的所有程序所共享。從而,每個程序都可以擁有
4g的線性位址空間。
裝置通常會提供一組暫存器,如控制暫存器、資料暫存器和狀態暫存器等等。這些暫存器可能位於
i/o空間,也可能位於記憶體空間。
當這些暫存器位於
i/o空間時,通常被稱為
i/o埠。當這些暫存器位於記憶體空間時,對應的記憶體空間被稱為
i/o記憶體一般來說,在系統執行時,外設的
i/o記憶體資源的實體地址是已知的,由硬體的設計決定。但是
cpu並沒有為這些已知的外設
i/o記憶體資源的實體地址預定義虛擬位址範圍,驅動程式並不能直接通過實體地址訪問
i/o記憶體資源,而必須將它們對映到核心的虛擬位址空間,然後才能根據對映所得的虛擬位址空間,通過訪問指令訪問這些
i/o資源。linux
通過ioremap
來將 i/o
記憶體資源的物理位址對映到核心的虛擬位址空間(
3g~4g
)中去。
但使用者空間仍不能直接訪問核心空間中對映的
i/o記憶體資源位址,必須把裝置位址對映到使用者空間中去才能實現使用者空間態的訪問。通過
mmap
,我們可以講使用者空間的一段記憶體與裝置記憶體相關聯,當使用者訪問使用者空間的這段位址範圍時,就會轉化為對裝置的訪問。
LINUX IO埠 IO記憶體釋疑
io埠是指介面電路中能夠被cpu直接訪問的暫存器,一般有資料埠 控制埠和狀態埠。每個連線到io匯流排的裝置都有自己的位址 集合 即埠,可以被對映到實體地址空間。io記憶體和io埠的主要區別是,io埠操作具有邊際效應,而記憶體則沒有 所以可以用多種方法進行優化,比如重新排序 告訴快取等 使用io記憶體...
Linux I O埠與I O記憶體
一 io埠訪問 1 直接使用io埠操作函式 1 在裝置開啟或驅動模組被載入時申請io埠區域,之後使用inb outb 等進行埠訪問,最後在裝置關閉或驅動被解除安裝時釋放io埠範圍。流程如下 2 struct resource request region unsigned long first,un...
Linux記憶體對映
使用記憶體對映處理大檔案很方便,在windows系統中,實現了這樣的藉口。在linux中我們也可以通過mmap函式來實現。以下內容完全參考自 如有冒犯,請諒解 mmap函式實現把乙個檔案對映到乙個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read write也要快上許多。在某些時...