版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-字母編址

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

地址概述物理地址

物理地址就是CPU地址總線傳來的地址,由硬件電路控制其具體含義。物理地址中很大一部分是留給內(nèi)存條中的內(nèi)存的,但也常被映射到其他存儲(chǔ)器上(如顯存、BIOS等)。在程序指令中的虛擬地址經(jīng)過段映射和頁面映射后,就生成了物理地址,這個(gè)物理地址被放到CPU的地址線上。
物理地址空間,一部分給物理RAM(內(nèi)存)用,一部分給總線用,這是由硬件設(shè)計(jì)來決定的,因此在32 bits地址線的x86處理器中,物理地址空間是2的32次方,即4GB,但物理RAM一般不能上到4GB,因?yàn)檫€有一部分要給總線用(總線上還掛著別的許多設(shè)備)。在PC機(jī)中,一般是把低端物理地址給RAM用,高端物理地址給總線用。

總線地址總線地址就是總線的地址線在地址周期上產(chǎn)生的信號(hào)。外設(shè)使用的是總線地址,CPU使用的是物理地址。
物理地址與總線地址之間的關(guān)系由系統(tǒng)的設(shè)計(jì)決定的。在x86平臺(tái)上,物理地址就是總線地址,這是因?yàn)樗鼈児蚕硐嗤牡刂房臻g——這句話有點(diǎn)難理解,詳見下面的“獨(dú)立編址”。在其他平臺(tái)上,可能需要轉(zhuǎn)換/映射。比如:CPU需要訪問物理地址是0xfa000的單元,那么在x86平臺(tái)上,會(huì)產(chǎn)生一個(gè)PCI總線上對(duì)0xfa000地址的訪問。因?yàn)槲锢淼刂泛涂偩€地址相同,所以憑眼睛看是不能確定這個(gè)地址是用在哪兒的,它或者在內(nèi)存中,或者是某個(gè)卡上的存儲(chǔ)單元,甚至可能這個(gè)地址上沒有對(duì)應(yīng)的存儲(chǔ)器。

虛擬地址現(xiàn)代操作系統(tǒng)普遍采用虛擬內(nèi)存管理(Virtual Memory Management)機(jī)制,這需要MMU(Memory Management Unit)的支持。MMU通常是CPU的一部分,如果處理器沒有MMU,或者有MMU但沒有啟用,CPU執(zhí)行單元發(fā)出的內(nèi)存地址將直接傳到芯片引腳上,被內(nèi)存芯片(物理內(nèi)存)接收,這稱為物理地址(Physical Address),如果處理器啟用了MMU,CPU執(zhí)行單元發(fā)出的內(nèi)存地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address),而MMU將這個(gè)地址翻譯成另一個(gè)地址發(fā)到CPU芯片的外部地址引腳上,也就是將虛擬地址映射成物理地址。
Linux中,進(jìn)程的4GB(虛擬)內(nèi)存分為用戶空間、內(nèi)核空間。用戶空間分布為0~3GB(即PAGE_OFFSET,在0X86中它等于 0xC0000000),剩下的1G為內(nèi)核空間。程序員只能使用虛擬地址。系統(tǒng)中每個(gè)進(jìn)程有各自的私有用戶空間(0~3G),這個(gè)空間對(duì)系統(tǒng)中的其他進(jìn)程是不可見的。
CPU發(fā)出取指令請(qǐng)求時(shí)的地址是當(dāng)前上下文的虛擬地址,MMU再?gòu)捻摫碇姓业竭@個(gè)虛擬地址的物理地址,完成取指。同樣讀取數(shù)據(jù)的也是虛擬地址,比如mov ax, var. 編譯時(shí)var就是一個(gè)虛擬地址,也是通過MMU從也表中來找到物理地址,再產(chǎn)生總線時(shí)序,完成取數(shù)據(jù)的任務(wù)。1

編址方式外設(shè)都是通過讀寫設(shè)備上的寄存器來進(jìn)行的,外設(shè)寄存器也稱為“I/O端口”,而I/O端口有兩種編址方式:獨(dú)立編址和統(tǒng)一編制。

獨(dú)立編址(專用的I/O端口編址)定義:

I/O端口編址和存儲(chǔ)器的編址相互獨(dú)立,在兩個(gè)獨(dú)立的地址空間中,即I/O端口地址空間和存儲(chǔ)器地址空間分開設(shè)置,互不影響。采用這種編址方式,對(duì)I/O端口的操作使用輸入/輸出指令(I/O指令)。

優(yōu)點(diǎn):

[1]I/O端口的地址碼較短,譯碼電路簡(jiǎn)單,I/O端口的地址空間一般較小,所用地址線也就較少;

[2]存儲(chǔ)器同I/O端口的操作指令不同,程序比較清晰;

[3]存儲(chǔ)器和I/O端口的控制結(jié)構(gòu)相互獨(dú)立,可以分別設(shè)計(jì);

[4]不占用內(nèi)存空間。

缺點(diǎn):

需要有專用的I/O指令,程序設(shè)計(jì)的靈活性較差,訪問端口的方法不如訪問存儲(chǔ)器的方法多。

統(tǒng)一編址(存儲(chǔ)器映像編址)定義:

在這種編址方式中,I/O端口和內(nèi)存單元統(tǒng)一編址,即把I/O端口當(dāng)作內(nèi)存單元對(duì)待,從整個(gè)內(nèi)存空間中劃出一個(gè)子空間給I/O端口,每一個(gè)I/O端口分配一個(gè)地址碼,用訪問存儲(chǔ)器的指令對(duì)I/O端口進(jìn)行操作,也就是說存儲(chǔ)器和I/O端口共用統(tǒng)一的地址空間,當(dāng)一個(gè)地址空間分配給I/O端口以后,存儲(chǔ)器就不能再占有這一部分的地址空間。

優(yōu)點(diǎn):

[1]不需要專用的I/O指令,任何對(duì)存儲(chǔ)器數(shù)據(jù)進(jìn)行操作的指令都可用于I/O端口的數(shù)據(jù)操作,程序設(shè)計(jì)比較靈活對(duì)I/O端口的數(shù)據(jù)處理能力強(qiáng);

[2]由于I/O端口的地址空間是內(nèi)存空間的一部分,這樣,I/O端口的地址空間可大可小,從而使外設(shè)的數(shù)量幾乎不受限制;

[3]cpu無需產(chǎn)生區(qū)別訪問內(nèi)存操作和I/O操作的控制信號(hào),從而可減少引腳。

缺點(diǎn):

[1]I/O端口占用了內(nèi)存空間的一部分,影響了系統(tǒng)的內(nèi)存容量;

[2]訪問I/O端口也要同訪問內(nèi)存一樣,由于內(nèi)存地址較長(zhǎng),導(dǎo)致執(zhí)行時(shí)間增加;

[3]程序中I/O操作不清晰,難以區(qū)分程序中的I/O操作和存儲(chǔ)器操作;

[4]I/O端口地址譯碼電路較復(fù)雜(因?yàn)閮?nèi)存的地址位數(shù)較多)。2

應(yīng)用對(duì)于某一既定的系統(tǒng),它要么是獨(dú)立編址、要么是統(tǒng)一編址,具體采用哪一種則取決于CPU的體系結(jié)構(gòu)。比如,PowerPC、m68k等采用統(tǒng)一編址,而X86等則采用獨(dú)立編址,存在I/O空間的概念。目前,大多數(shù)嵌入式微控制器如ARM、PowerPC等并不提供I/O空間,僅有內(nèi)存空間,可直接用地址、指針訪問。但對(duì)于Linux內(nèi)核而言,它可能用于不同的CPU,所以它必須都要考慮這兩種方式,于是它采用一種新的方法,將基于I/O映射方式的或內(nèi)存映射方式的I/O端口通稱為“I/O區(qū)域”(I/O region),不論你采用哪種方式,都要先申請(qǐng)IO區(qū)域:request_resource(),結(jié)束時(shí)釋放它:release_resource()。1