字母編址

對於CPU而言,如果它要發數據到某個設備,其實是發到對應的接口,接口電路里有多個暫存器(也稱為連線埠),訪問設備實際上是訪問相關的連線埠,所有的信息會由接口轉給它的設備。那么CPU會準備數據傳送到數據匯流排,但是諸多接口,該發給誰呢?這時就須要為各接口分配一個地址,然後把地址放在地址匯流排上,需要的控制信息放到控制匯流排上,就可以和設備通信了。 對於一個系統而言,通常會有多個外設,每個外設的接口電路中,又會有多個連線埠,每個連線埠都需要一個地址,為他們標識一個具體的地址值,是系統必須解決的事,與此同時,你還有個記憶體條,可能是512M或1G或更大的金士頓、現代DDR2之類,他們的每一個地址也都需要分配一個標識值,另外,很多外設有自己的記憶體緩衝區,就像你的記憶體條一樣,你同樣需要為它們分配記憶體……你的CPU可能需要和這些打交道,這個時候為每一部分編一個地址,使用起來就會方便很多。

基本介紹

  • 中文名:字母編址
  • 外文名:alphabet addressing
  • 性質:計算機軟體術語
  • 兩種形式:獨立編址和統一編址y套用
  • 套用:計算機中傳輸數據過程p靜態
  • 平台:計算機
地址概述,物理地址,匯流排地址,虛擬地址,編址方式,獨立編址(專用的I/O連線埠編址),統一編址(存儲器映像編址),套用,

地址概述

物理地址

物理地址就是CPU地址匯流排傳來的地址,由硬體電路控制其具體含義。物理地址中很大一部分是留給記憶體條中的記憶體的,但也常被映射到其他存儲器上(如顯存、BIOS等)。在程式指令中的虛擬地址經過段映射和頁面映射後,就生成了物理地址,這個物理地址被放到CPU的地址線上。
物理地址空間,一部分給物理RAM(記憶體)用,一部分給匯流排用,這是由硬體設計來決定的,因此在32 bits地址線的x86處理器中,物理地址空間是2的32次方,即4GB,但物理RAM一般不能上到4GB,因為還有一部分要給匯流排用(匯流排上還掛著別的許多設備)。在PC機中,一般是把低端物理地址給RAM用,高端物理地址給匯流排用。

匯流排地址

匯流排地址就是匯流排的地址線在地址周期上產生的信號。外設使用的是匯流排地址,CPU使用的是物理地址。
物理地址與匯流排地址之間的關係由系統的設計決定的。在x86平台上,物理地址就是匯流排地址,這是因為它們共享相同的地址空間——這句話有點難理解,詳見下面的“獨立編址”。在其他平台上,可能需要轉換/映射。比如:CPU需要訪問物理地址是0xfa000的單元,那么在x86平台上,會產生一個PCI匯流排上對0xfa000地址的訪問。因為物理地址和匯流排地址相同,所以憑眼睛看是不能確定這個地址是用在哪兒的,它或者在記憶體中,或者是某個卡上的存儲單元,甚至可能這個地址上沒有對應的存儲器。

虛擬地址

現代作業系統普遍採用虛擬記憶體管理(Virtual Memory Management)機制,這需要MMU(Memory Management Unit)的支持。MMU通常是CPU的一部分,如果處理器沒有MMU,或者有MMU但沒有啟用,CPU執行單元發出的記憶體地址將直接傳到晶片引腳上,被記憶體晶片(物理記憶體)接收,這稱為物理地址(Physical Address),如果處理器啟用了MMU,CPU執行單元發出的記憶體地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address),而MMU將這個地址翻譯成另一個地址發到CPU晶片的外部地址引腳上,也就是將虛擬地址映射成物理地址。
Linux中,進程的4GB(虛擬)記憶體分為用戶空間核心空間。用戶空間分布為0~3GB(即PAGE_OFFSET,在0X86中它等於 0xC0000000),剩下的1G為核心空間。程式設計師只能使用虛擬地址。系統中每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。
CPU發出取指令請求時的地址是當前上下文的虛擬地址,MMU再從頁表中找到這個虛擬地址的物理地址,完成取指。同樣讀取數據的也是虛擬地址,比如mov ax, var. 編譯時var就是一個虛擬地址,也是通過MMU從也表中來找到物理地址,再產生匯流排時序,完成取數據的任務。

編址方式

外設都是通過讀寫設備上的暫存器來進行的,外設暫存器也稱為“I/O連線埠”,而I/O連線埠有兩種編址方式:獨立編址和統一編制。

獨立編址(專用的I/O連線埠編址)

定義:
I/O連線埠編址和存儲器的編址相互獨立,在兩個獨立的地址空間中,即I/O連線埠地址空間和存儲器地址空間分開設定,互不影響。採用這種編址方式,對I/O連線埠的操作使用輸入/輸出指令(I/O指令)。
優點:
[1]I/O連線埠的地址碼較短,解碼電路簡單,I/O連線埠的地址空間一般較小,所用地址線也就較少;
[2]存儲器同I/O連線埠的操作指令不同,程式比較清晰;
[3]存儲器和I/O連線埠的控制結構相互獨立,可以分別設計;
[4]不占用記憶體空間。
缺點:
需要有專用的I/O指令,程式設計的靈活性較差,訪問連線埠的方法不如訪問存儲器的方法多。

統一編址(存儲器映像編址)

定義:
在這種編址方式中,I/O連線埠和記憶體單元統一編址,即把I/O連線埠當作記憶體單元對待,從整個記憶體空間中劃出一個子空間給I/O連線埠,每一個I/O連線埠分配一個地址碼,用訪問存儲器的指令對I/O連線埠進行操作,也就是說存儲器和I/O連線埠共用統一的地址空間,當一個地址空間分配給I/O連線埠以後,存儲器就不能再占有這一部分的地址空間。
優點:
[1]不需要專用的I/O指令,任何對存儲器數據進行操作的指令都可用於I/O連線埠的數據操作,程式設計比較靈活對I/O連線埠的數據處理能力強;
[2]由於I/O連線埠的地址空間是記憶體空間的一部分,這樣,I/O連線埠的地址空間可大可小,從而使外設的數量幾乎不受限制;
[3]cpu無需產生區別訪問記憶體操作和I/O操作的控制信號,從而可減少引腳。
缺點:
[1]I/O連線埠占用了記憶體空間的一部分,影響了系統的記憶體容量
[2]訪問I/O連線埠也要同訪問記憶體一樣,由於記憶體地址較長,導致執行時間增加;
[3]程式中I/O操作不清晰,難以區分程式中的I/O操作和存儲器操作;
[4]I/O連線埠地址解碼電路較複雜(因為記憶體的地址位數較多)。

套用

對於某一既定的系統,它要么是獨立編址、要么是統一編址,具體採用哪一種則取決於CPU的體系結構。比如,PowerPCm68k等採用統一編址,而X86等則採用獨立編址,存在I/O空間的概念。目前,大多數嵌入式微控制器如ARMPowerPC等並不提供I/O空間,僅有記憶體空間,可直接用地址、指針訪問。但對於Linux核心而言,它可能用於不同的CPU,所以它必須都要考慮這兩種方式,於是它採用一種新的方法,將基於I/O映射方式的或記憶體映射方式的I/O連線埠通稱為“I/O區域”(I/O region),不論你採用哪種方式,都要先申請IO區域:request_resource(),結束時釋放它:release_resource()。

相關詞條

熱門詞條

聯絡我們