- 論壇徽章:
- 0
|
你的理解錯誤很多,居然將硬件的進(jìn)步說成是冗余,可惜了。
從硬件設(shè)計的角度來看!
物理地址: 內(nèi)存單元的編號,邏輯上是將將內(nèi)存單元按照一定的度量單位劃分,如字節(jié),字等,80x86 可以按字節(jié)也可以按字編址。所謂的總線只是一個存取通路,插座相當(dāng)于一個設(shè)備開關(guān)。地址空間是數(shù)據(jù)總線的寬度。
邏輯地址:也稱相對地址,是與絕對地址(物理地址)相對的一個概念,是相對與某一位置開始編址。她存在的意義是記住程序和數(shù)據(jù)的相對位置。一般定義為CPU通過地址總線發(fā)出的地址。 程序裝入到內(nèi)存后就通過相關(guān)的硬件,主要是地址的加法器與一個相對位置相加得到絕對地址。相對的位置是存在段表和頁表中的,通過相聯(lián)查找獲得。地址空間由用戶定義
虛擬內(nèi)存:說白了就是構(gòu)造一個滿足程序和用戶需要的空間。程序員不用擔(dān)心內(nèi)存不夠!也不用擔(dān)心地址問題。只要關(guān)心程序的邏輯順序,即邏輯地址。
虛擬地址:和邏輯地址是抽象和具體的關(guān)系,是邏輯地址的一個實例。
虛擬地址到物理地址變換:對于X86 目前有三種方式,頁式,段式,段頁式
頁式:
地址映像:
第一步 將用戶程序按頁的長度劃分,長度固定。 劃分了之后,就有了頁的起始地址
第二步 操作系統(tǒng)創(chuàng)建進(jìn)程時,先查全局的頁表,找了幾頁空閑的內(nèi)存,也就有了物理的頁的起始地址
第三步 操作系統(tǒng)創(chuàng)建頁表,一般有這么幾項,物理頁號, 用戶頁號 (o-n) 使用位等。 這樣就建立了虛擬地址到物理地址的映射關(guān)系了。
地址變換:硬件根據(jù)cpu發(fā)出的邏輯地址(這里是虛擬地址)查表,得到物理的頁號(高位地址),將物理頁號加邏輯地址的地位(頁內(nèi)地址)就是物理地址了。一次查表,一次加法計算。比直接用物理地址編程效率要低很多。
段式:
虛擬地址劃分 用戶號+段號+段內(nèi)偏移
地址映像:
第一步 將用戶程序分段,長度不固定。 劃分了之后,就有了段的起始地址,和段的長度。
第二步 操作系統(tǒng),根據(jù)段長申請內(nèi)存空間,也就有了段起始地址。
第三步 操作系統(tǒng)創(chuàng)建段表,一般有這么幾項,兩個段起始地址, 段長。 這樣就建立了邏輯段到物理段的映射關(guān)系了。
地址變換:INTEL X86是這樣的, 有段寄存器堆,即段選擇子,描述符是一致的。 先將段表基地址裝入 LDT,(這里討論的是一般用戶程序),根據(jù)CPU 發(fā)出的邏輯地址得到段號, 加上LDT 當(dāng)中的段表基地址得到一個邏輯段到物理段的映射項,讀出物理段基地址,再加上段的偏移得到 物理地址 ,總共需要做兩次加法,一次查表, 效率更低。
段頁式: 即將程序中一段再分頁,需要一個段表,一個頁表,先查段表得到頁表基地址,然后再頁式變換。
對于這種三種變換方式的優(yōu)點: 簡化 編程,簡化系統(tǒng)設(shè)計,太多了,
總結(jié): 對內(nèi)核編程人員的建議: 先對程序劃分,再定義映射,設(shè)置寄存器,地址變換由硬件完成。 |
|