邏輯地址如何轉(zhuǎn)換成物理地址
邏輯地址和物理地址是什么?邏輯地址如何轉(zhuǎn)換成物理地址?看到很多人都在問這個(gè)問題,小編為大家分享了邏輯地址如何轉(zhuǎn)換成物理地址的方法,下面大家跟著學(xué)習(xí)啦小編一起來了解一下吧。
邏輯地址轉(zhuǎn)換成物理地址
CPU將一個(gè)虛擬內(nèi)存空間中的地址轉(zhuǎn)換為物理地址,需要進(jìn)行兩步:首先將給定一個(gè)邏輯地址(其實(shí)是段內(nèi)偏移量,這個(gè)一定要理解!!!),CPU要利用其段式內(nèi)存管理單元,先將為個(gè)邏輯地址轉(zhuǎn)換成一個(gè)線程地址,再利用其頁式內(nèi)存管理單元,轉(zhuǎn)換為最終物理地址。
物理地址(physical address)
用于內(nèi)存芯片級(jí)的單元尋址,與處理器和CPU連接的地址總線相對(duì)應(yīng)。
——這個(gè)概念應(yīng)該是這幾個(gè)概念中最好理解的一個(gè),但是值得一提的是,雖然可以直接把物理地址理解成插在機(jī)器上那根內(nèi)存本身,把內(nèi)存看成一個(gè)從0字節(jié)一直到最大空量逐字節(jié)的編號(hào)的大數(shù)組,然后把這個(gè)數(shù)組叫做物理地址,但是事實(shí)上,這只是一個(gè)硬件提供給軟件的抽像,內(nèi)存的尋址方式并不是這樣。所以,說它是“與地址總線相對(duì)應(yīng)”,是更貼切一些,不過拋開對(duì)物理內(nèi)存尋址方式的考慮,直接把物理地址與物理的內(nèi)存一一對(duì)應(yīng),也是可以接受的。也許錯(cuò)誤的理解更利于形而上的抽像。
虛擬內(nèi)存(virtual memory)
這是對(duì)整個(gè)內(nèi)存(不要與機(jī)器上插那條對(duì)上號(hào))的抽像描述。它是相對(duì)于物理內(nèi)存來講的,可以直接理解成“不直實(shí)的”,“假的”內(nèi)存,例如,一個(gè)0x08000000內(nèi)存地址,它并不對(duì)就物理地址上那個(gè)大數(shù)組中0x08000000 - 1那個(gè)地址元素;
之所以是這樣,是因?yàn)楝F(xiàn)代操作系統(tǒng)都提供了一種內(nèi)存管理的抽像,即虛擬內(nèi)存(virtual memory)。進(jìn)程使用虛擬內(nèi)存中的地址,由操作系統(tǒng)協(xié)助相關(guān)硬件,把它“轉(zhuǎn)換”成真正的物理地址。這個(gè)“轉(zhuǎn)換”,是所有問題討論的關(guān)鍵。
有了這樣的抽像,一個(gè)程序,就可以使用比真實(shí)物理地址大得多的地址空間。(拆東墻,補(bǔ)西墻,銀行也是這樣子做的),甚至多個(gè)進(jìn)程可以使用相同的地址。不奇怪,因?yàn)檗D(zhuǎn)換后的物理地址并非相同的。
——可以把連接后的程序反編譯看一下,發(fā)現(xiàn)連接器已經(jīng)為程序分配了一個(gè)地址,例如,要調(diào)用某個(gè)函數(shù)A,代碼不是call A,而是call 0x0811111111 ,也就是說,函數(shù)A的地址已經(jīng)被定下來了。沒有這樣的“轉(zhuǎn)換”,沒有虛擬地址的概念,這樣做是根本行不通的。
邏輯地址(logical address)
Intel為了兼容,將遠(yuǎn)古時(shí)代的段式內(nèi)存管理方式保留了下來。邏輯地址指的是機(jī)器語言指令中,用來指定一個(gè)操作數(shù)或者是一條指令的地址。以上例,我們說的連接器為A分配的0x08111111這個(gè)地址就是邏輯地址。
——不過不好意思,這樣說,好像又違背了Intel中段式管理中,對(duì)邏輯地址要求,“一個(gè)邏輯地址,是由一個(gè)段標(biāo)識(shí)符加上一個(gè)指定段內(nèi)相對(duì)地址的偏移量,表示為 [段標(biāo)識(shí)符:段內(nèi)偏移量],也就是說,上例中那個(gè)0x08111111,應(yīng)該表示為[A的代碼段標(biāo)識(shí)符: 0x08111111],這樣,才完整一些”
線性地址(linear address)或也叫虛擬地址(virtual address)
跟邏輯地址類似,它也是一個(gè)不真實(shí)的地址,如果邏輯地址是對(duì)應(yīng)的硬件平臺(tái)段式管理轉(zhuǎn)換前地址的話,那么線性地址則對(duì)應(yīng)了硬件頁式內(nèi)存的轉(zhuǎn)換前地址。
在早期的硬盤中,由于每個(gè)磁道的扇區(qū)數(shù)相等,外磁道的記錄密度遠(yuǎn)低于內(nèi)磁道,因此造成很多磁盤空間的浪費(fèi)。為了解決這一問題,人們改用等密度結(jié)構(gòu),即外圈磁道的扇區(qū)比內(nèi)圈磁道多。此種結(jié)構(gòu)的硬盤不再具有實(shí)際的3D參數(shù),尋址方式也改為以扇區(qū)為單位的線性尋址,這種尋址模式便是LBA(Logic Block Address, 邏輯塊地址)。在這種模式下,硬盤的物理地址與邏輯地址的轉(zhuǎn)換問題有一定必要性和復(fù)雜性,本文對(duì)此進(jìn)行討論,希望對(duì)感興趣的讀者有所幫助。
2 轉(zhuǎn)換過程
所謂邏輯扇區(qū)是物理扇區(qū)的一組連續(xù)數(shù)字的編號(hào),操作系統(tǒng)采用的一種扇區(qū)編號(hào)方式,其編號(hào)是從0開始到某個(gè)最大值方式排列,并連成一條線。使用邏輯扇區(qū)主要有以下兩個(gè)優(yōu)點(diǎn):第一,邏輯扇區(qū)的概念使硬盤的讀寫操作脫離了柱面、磁頭和扇區(qū)的硬件參數(shù);第二,在硬盤中每一定數(shù)目的扇區(qū)組成了數(shù)據(jù)文件的最小單位—— 簇,在對(duì)一個(gè)具體的簇進(jìn)行讀寫操作時(shí),操作系統(tǒng)劃分一個(gè)一維的邏輯扇區(qū)號(hào)要比使用三維物理扇區(qū)號(hào)簡單的多,如果一個(gè)簇的扇區(qū)跨越在兩個(gè)盤片,則使用“柱面、磁頭和扇區(qū)”的表示方法就更加復(fù)雜了。那么硬盤的物理地址和邏輯地址是如何轉(zhuǎn)換的呢?下面具體介紹其相互轉(zhuǎn)換方法。
2.1 硬盤物理地址轉(zhuǎn)換為邏輯地址
首先我們先來了解一下從C/H/S到LBA線性地址的轉(zhuǎn)換規(guī)則。為了與使用C/H/S尋址的老軟件兼容,于是在硬盤控制器內(nèi)部安裝了一個(gè)地址翻譯器,它負(fù)責(zé)將C/H/S參數(shù)翻譯成LBA地址。
同時(shí),由于系統(tǒng)在寫入數(shù)據(jù)時(shí)是按照從柱面到柱面的方式,當(dāng)上一個(gè)柱面寫滿數(shù)據(jù)后才移動(dòng)磁頭到下一個(gè)柱面,而且是從柱面的第一個(gè)磁頭的第一個(gè)扇區(qū)開始寫入,從而使磁盤性能最優(yōu)。那么在對(duì)物理扇區(qū)進(jìn)行線性編址時(shí),也是按照這種方式進(jìn)行。即把第一柱面(0柱)第一磁頭(0面)的第一扇區(qū)(1扇區(qū))編為邏輯“0”扇區(qū),把第一柱面(0柱)第一磁頭(0面)的第二扇區(qū)(2扇區(qū))編為邏輯“1”扇區(qū),直至第一柱面(0柱)第一磁頭(0面)的第63扇區(qū)(63扇區(qū))編為邏輯“62”扇區(qū),然后將磁頭轉(zhuǎn)到第一柱面(0柱)第二磁頭(1面)的第一扇區(qū)(1扇區(qū)),接著上面其對(duì)應(yīng)的邏輯編號(hào)為第“63”扇區(qū),0柱面所有扇區(qū)編號(hào)完畢后才轉(zhuǎn)到1柱面的0磁頭1扇區(qū),依次向下進(jìn)行,直到將所有的扇區(qū)都編上號(hào)。我們需要注意的是,物理扇區(qū)C/H/S中的扇區(qū)編號(hào)是從“1”至“63”,而邏輯扇區(qū)LBA方式下扇區(qū)是從“0”開始編號(hào),所有扇區(qū)編號(hào)按順序進(jìn)行。
在此轉(zhuǎn)換過程中,我們必須要知道的物理量有:
C1—起始扇區(qū)的柱面號(hào)
H1—起始扇區(qū)的磁頭號(hào)
S1—起始扇區(qū)的扇區(qū)號(hào)
NS—每磁道的扇區(qū)數(shù)
NH—硬盤每柱面磁道數(shù)
C、H、S表示硬盤當(dāng)前的柱面號(hào)、磁頭號(hào)和扇區(qū)號(hào),則計(jì)算柱面C、磁頭H、扇區(qū)S對(duì)應(yīng)的相對(duì)邏輯扇區(qū)號(hào)RS的公式為:
邏輯扇區(qū)RS=NH×NS×(C-C1)+NS×(H-H1)+(S-S1),為驗(yàn)證此公式,下面我們來舉個(gè)例子。
實(shí)例:已知有一個(gè)4磁頭(硬盤每柱面的磁道數(shù)為4),每磁道有17個(gè)扇區(qū)的硬盤,其中有一個(gè)邏輯硬盤D:,它的第一個(gè)扇區(qū)在硬盤的柱面號(hào)為120,磁頭號(hào)為1,扇區(qū)號(hào)為1的位置,則計(jì)算柱面號(hào)為160,磁頭號(hào)為3,扇區(qū)號(hào)為6的邏輯扇區(qū)號(hào)RS是多少?
分析:
根據(jù)前面的說明,已知條件有:C1=120, H1=1, S1=1, NS=17, NH=4,C=160,H=3,S=6,則代入上面公式可得到邏輯扇區(qū)號(hào)RS=4×17×(160-120)+17×(3-1)+(6-1)=2759,即硬盤柱面號(hào)為160,磁頭號(hào)為3,扇區(qū)號(hào)為6的邏輯扇區(qū)號(hào)為2759.
硬盤邏輯地址轉(zhuǎn)換成物理地址
在對(duì)硬盤進(jìn)行故障維護(hù)或者進(jìn)行相關(guān)軟件開發(fā)時(shí),不僅需要將硬盤的物理地址轉(zhuǎn)換成邏輯地址,有時(shí)還需要知道邏輯地址轉(zhuǎn)換為物理地址的方法。
根據(jù)計(jì)算機(jī)中符號(hào)的常用法則,我們用“div”表示除法運(yùn)算,用“mod”表示取余數(shù)運(yùn)算,其他參數(shù)如C、H、S依然表示硬盤當(dāng)前的柱面、磁頭和扇區(qū)號(hào),C1、H1、S1、NS和NH含義也和上面一致。在已知硬盤邏輯地址即邏輯扇區(qū)號(hào)LS的情況下,求硬盤對(duì)應(yīng)的物理地址的柱面號(hào)C、磁頭號(hào)H和扇區(qū)號(hào)S的方法如下:
C=((Ls div NS)div NH)+ C1
H=((Ls div NS)mod NH)+ H1
S=(Ls mod NH)+ S1
實(shí)例:設(shè)硬盤的磁頭號(hào)為4,每磁道17個(gè)扇區(qū),其中邏輯硬盤D的第一個(gè)扇區(qū)在硬盤的柱面120、磁頭1、扇區(qū)1上,求邏輯D盤上邏輯扇區(qū)為2757編號(hào)對(duì)應(yīng)的物理地址是多少?
分析:根據(jù)上面的已知條件,我們可知C1=120, H1=1,S1=1,NS=17,NH=4,Ls=2757,則將這些數(shù)據(jù)代入上面的公式可得:
C=((2757 div 17)div 4)+120=160
H=((2757 div 17)mod 4)+1=3
S=(2757 mod 17)+1=4
即邏輯扇區(qū)號(hào)Ls為2757的硬盤對(duì)應(yīng)的物理地址為柱面號(hào)是160、磁頭號(hào)是3和扇區(qū)號(hào)為4。
看過“ 邏輯地址如何轉(zhuǎn)換成物理地址”的人還看了: