<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          32位cpu尋址小結(jié)

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          32位cpu 地址線擴(kuò)展成了32位,這和數(shù)據(jù)線的寬度是一致的。因此,在32位機(jī)里其實(shí)并不需要采用“物理地址=段:偏移”這種地址表達(dá)方式。原來(lái)在16位機(jī)里規(guī)定的每一個(gè)段不大于64kb在32位機(jī)里也不是必要的。所以,對(duì)于32位機(jī)來(lái)講,最簡(jiǎn)單的方法就是用一個(gè)32位數(shù)來(lái)標(biāo)識(shí)一個(gè)字節(jié)的存儲(chǔ)地址,尋址時(shí)只要給出一個(gè)32位數(shù)就可以直接找到地址。這種地址儲(chǔ)存模型就屬于“平展儲(chǔ)存模型”。

          但是,新產(chǎn)品一般都希望遵循“向下兼容”這個(gè)原則。所以,32位機(jī)里完整的保留了16位尋址模式。即:尋址能力為1M;分段機(jī)制;每段不超過(guò)64kb。這就是通常所說(shuō)的"實(shí)模式"。在地址儲(chǔ)存模型中屬于“實(shí)地址儲(chǔ)存模型”。

          本文引用地址:http://www.ex-cimer.com/article/201611/322767.htm

          其次,考慮到程序通常都是功能化的模塊,所以分段雖然不是必要的,但分段卻能大大提高編程者管理程序的效率。故而32位機(jī)也采用了段+偏移的模式來(lái)尋址。但與實(shí)模型不同的是,由于地址線和數(shù)據(jù)線寬度一致,因而,每個(gè)段最大可以到4G,并且段基址也是32位的無(wú)需進(jìn)行左移處理。在地址儲(chǔ)存模型中這屬于“段地址儲(chǔ)存模型”。然而需要注意的是,在32位機(jī)里,雖然通用寄存器,標(biāo)志寄存器等都擴(kuò)展成了32位,但是段寄存器卻依然是16位的(為什么不做改變??我猜可能是這樣便于向下兼容)。所以在32位尋址時(shí),段寄存器里放的不再是段基址(位數(shù)不夠,放不下)而是一個(gè)選擇子。這個(gè)選擇子對(duì)應(yīng)了一個(gè)64-bit長(zhǎng)的描述符,64-bit的描述符里有32-bit是段基址。所以原來(lái)在16位機(jī)里通過(guò)段寄存器一步就可以找到段基址,而現(xiàn)在在32位機(jī)里分成了兩步:先找選擇子,然后通過(guò)選擇子找段基址。段基址找到了,再加上偏移地址,物理地址就找到了。看樣子,32位段模式尋址已經(jīng)介紹清楚了。其實(shí),這里頭的故事還遠(yuǎn)沒(méi)有講完。

          在上面簡(jiǎn)述的過(guò)程中,很容易發(fā)現(xiàn)有兩個(gè)問(wèn)題沒(méi)有交待。(1)CPU是如何將選擇子與描述符對(duì)應(yīng)起來(lái)的?(2)既然是64-bit的描述符,32位用來(lái)表示基地址,那么余下的32位是干什么用的?另外,當(dāng)32位機(jī)發(fā)展起來(lái)的同時(shí),操作系統(tǒng)也有了長(zhǎng)足進(jìn)步,單任務(wù)模式的DOS被多任務(wù)的windows所取代。也就是說(shuō),現(xiàn)在駐留在內(nèi)存中的往往不止是一個(gè)程序,而很可能是多個(gè)程序同時(shí)在內(nèi)存中?,F(xiàn)在又沒(méi)有了段大小的限制,程序之間便很有可能相互搶地址,如果核心程序被破壞,計(jì)算機(jī)就會(huì)崩潰。這就好比在馬路上走車,如果只有一輛車開(kāi),怎么開(kāi)都可以,但是如果車多了不制定個(gè)交通規(guī)則,車便會(huì)搶道,道路就會(huì)癱瘓。所以,在多任務(wù)的情況下,必須給尋址也制定一個(gè)“交通規(guī)則”,這樣才能保證多任務(wù)系統(tǒng)有序的工作。制定什么樣的規(guī)則呢?首先,既然程序是在無(wú)意識(shí)的情況下?lián)屨剂藙e的程序的地址,那么如果在尋址時(shí)包含一個(gè)查詢的過(guò)程就可以有效的避免搶地址的情況發(fā)生。也就是說(shuō),先得問(wèn)一問(wèn)那個(gè)地址是不是已經(jīng)有程序段占用了?同時(shí)已占上地址的程序段除了告知CPU自己的基地址外還應(yīng)該告訴CPU自己的長(zhǎng)度信息。這樣別的程序段才能方便地查詢。第二,多任務(wù)尋址最好應(yīng)該包含優(yōu)先級(jí)別的內(nèi)容,已備緊急情況下為核心程序讓道。這好比在馬路上,一般情況下車是遵守規(guī)則的,但如果是警車或救護(hù)車執(zhí)行任務(wù)時(shí),就可以優(yōu)先搶占別的車的道。所以,還應(yīng)該定義一個(gè)優(yōu)先級(jí)。然后,由占上地址的程序段告訴CPU自己的優(yōu)先級(jí)別??偟膩?lái)講,原來(lái)在16位機(jī)里很單純的一個(gè)“段”的概念現(xiàn)在變得復(fù)雜了。如同人的成長(zhǎng)過(guò)程,剛開(kāi)始的時(shí)候思維總是很幼稚的,相應(yīng)的也只能解決簡(jiǎn)單的問(wèn)題,只有當(dāng)你的思維擺脫幼稚的時(shí)候,才有能力解決更為復(fù)雜的事情?,F(xiàn)在CPU擺脫了幼稚的16位,它在描述“段”的時(shí)候當(dāng)然不應(yīng)該像16位時(shí)那么膚淺。在32位機(jī)里,“段”有三個(gè)要素:基地址,長(zhǎng)度,屬性(屬性里包含了優(yōu)先級(jí)和其它的一些內(nèi)容)。為了能一次完整的引用或者給出這三個(gè)要素,需要新定義一個(gè)數(shù)據(jù)結(jié)構(gòu)。這個(gè)結(jié)構(gòu)就是前面所提到的描述符,每一個(gè)描述符都占有64-bit,有足夠的長(zhǎng)度來(lái)包含段的三個(gè)要素。當(dāng)然,現(xiàn)在內(nèi)存中不止一個(gè)程序,而且程序也不止一個(gè)段,所以描述符也不會(huì)有一個(gè),而是很多個(gè)。最簡(jiǎn)單的管理方法,就是將所有的描述符集中起來(lái)放在一塊連續(xù)的存儲(chǔ)空間里,然后給各個(gè)描述符排上序號(hào)。當(dāng)要找某一個(gè)特定的描述符時(shí),只要先找到這塊連續(xù)的存儲(chǔ)空間然后給出序號(hào)就可以了。這些集中起來(lái)的描述符形成了一張表,所以通常被叫做描述符表。所以,想找到一個(gè)段的信息,首先要找到描述符表。也就是說(shuō),找特定的描述符先要知道描述符表的基地址。在32位cpu中,有一個(gè)48位的專用寄存器用來(lái)存放全局描述符表的信息,這個(gè)寄存器叫做GDTR。其中,高32位給出了全局描述符表的基地址,低16位給出了描述符表的長(zhǎng)度限制。所以,一張全局描述符表最長(zhǎng)可以是64kb。那么,最多可以放64kb/8b=8k個(gè)描述符。所以如果想在其中選擇任意一個(gè)描述符,用13位就可以辦到了。在32位cpu中,16位段寄存器的高13位就用來(lái)存放特定描述符的序號(hào)。其實(shí),現(xiàn)在段寄存器的功能就是選擇描述符,正因?yàn)槿绱?,通常也把段寄存器叫做選擇器。那么,經(jīng)過(guò)冗長(zhǎng)的介紹,現(xiàn)在32位段尋址的過(guò)程已經(jīng)大體依稀浮現(xiàn)在眼前了:在段寄存器里找到序號(hào),在GDTR中找到全局描述符表的基地址,然后就可以找到目的描述符。再?gòu)拿枋龇腥〕龆蔚幕刂?,然后加上偏移地址,這樣就得到了段的“物理地址”。

          真是令人興奮,這樣的尋址過(guò)程為執(zhí)行多任務(wù)提供了有力的保障,可以想象這是計(jì)算機(jī)執(zhí)行性能上的一次飛躍!從此高速的cpu再也不會(huì)為無(wú)用武之地發(fā)愁了,它可以最大限度的發(fā)揮自己速度快的優(yōu)勢(shì),同時(shí)處理好多個(gè)任務(wù)。是的,當(dāng)我們眼前出現(xiàn)了新的景象的時(shí)候,我們有理由興奮。但是,我們不應(yīng)該就此滿足。我們應(yīng)該沿著新天地撇給我們的一絲亮光,繼續(xù)前行,去找到這片新天地。人就是在這樣的前行中不斷讓事情變得更完美。到這里,我們對(duì)于尋址過(guò)程的了解,只是開(kāi)了一個(gè)頭而已,但這是一個(gè)好頭,我們體會(huì)到了32位cpu的強(qiáng)大優(yōu)勢(shì)。這足以讓我們對(duì)完整的32位CPU尋址充滿了期待。讓我們鼓舞士氣,沿著前人的足跡繼續(xù)前行吧!

          我們知道,程序代碼和數(shù)據(jù)必須駐留在內(nèi)存中才能得以運(yùn)行,然而系統(tǒng)內(nèi)存數(shù)量很有限,往往不能容納一個(gè)完整程序的所有代碼和數(shù)據(jù),更何況現(xiàn)在是多任務(wù)系統(tǒng),想讓內(nèi)存駐留所有任務(wù)程序顯然不太可能。老式系統(tǒng)就是將程序分割成小份,只讓當(dāng)前系統(tǒng)運(yùn)行它所有需要的那部分留在內(nèi)存,其它部分都留在硬盤(pán)。當(dāng)系統(tǒng)處理完當(dāng)前任務(wù)片段后,再?gòu)耐獯嬷姓{(diào)入下一個(gè)待運(yùn)行的任務(wù)片段,而且這個(gè)工作是由程序員自行完成。顯然這增加了程序員的負(fù)擔(dān)。
          由此針對(duì)多任務(wù)系統(tǒng)發(fā)展了一種虛擬內(nèi)存技術(shù)。虛擬內(nèi)存技術(shù)就是一種由操作系統(tǒng)接管的按需動(dòng)態(tài)內(nèi)存分配的方法,它允許程序不知不覺(jué)中使用大于實(shí)際物理空間大小的存儲(chǔ)空間(其實(shí)是將程序需要的存儲(chǔ)空間以頁(yè)的形式分散存儲(chǔ)在物理內(nèi)存和磁盤(pán)上)。 虛擬內(nèi)存是將系統(tǒng)硬盤(pán)空間和系統(tǒng)實(shí)際內(nèi)存聯(lián)合在一起供進(jìn)程使用,給進(jìn)程提供了一個(gè)比內(nèi)存大得多的虛擬空間。在程序運(yùn)行時(shí),把虛擬地址空間的一小部分映射到內(nèi)存,其余都存儲(chǔ)在硬盤(pán)上(也就是說(shuō)程序虛擬空間就等于實(shí)際物理內(nèi)存加部分硬盤(pán)空間)。當(dāng)被訪問(wèn)的虛擬地址不在內(nèi)存時(shí),則說(shuō)明該地址未被映射到內(nèi)存,而是被存貯在硬盤(pán)中,因此需要的虛擬存儲(chǔ)地址隨即被調(diào)入到內(nèi)存;同時(shí)當(dāng)系統(tǒng)內(nèi)存緊張時(shí),也可以把當(dāng)前不用的虛擬存儲(chǔ)空間換出到硬盤(pán),來(lái)騰出物理內(nèi)存空間。 這樣,為了提高系統(tǒng)性能,發(fā)展了虛擬內(nèi)存技術(shù),那么相應(yīng)的,32位cpu也應(yīng)該發(fā)展新的尋址技術(shù)來(lái)管理虛擬內(nèi)存。 這是通過(guò)頁(yè)機(jī)制來(lái)實(shí)現(xiàn)的。
          因?yàn)槭褂庙?yè)機(jī)制的原因,前面提到的通過(guò)段機(jī)制轉(zhuǎn)換得到的地址僅僅是作為一個(gè)中間地址——線性地址了,該地址不代表實(shí)際物理地址,而是代表整個(gè)進(jìn)程的虛擬空間地址。還得有一個(gè)將虛擬地址轉(zhuǎn)換成物理地址的過(guò)程。

          讓我們來(lái)認(rèn)識(shí)一下頁(yè)機(jī)制。它就是把內(nèi)存分成一個(gè)一個(gè)連續(xù)的頁(yè),每頁(yè)大小4kb。與段不同,頁(yè)不是程序功能塊的體現(xiàn)。一個(gè)程序功能塊可能占用好多個(gè)頁(yè)。現(xiàn)在內(nèi)存就像一本書(shū)了,一頁(yè)一頁(yè)的,每頁(yè)的容量都是相等的。當(dāng)然,我們很快可以聯(lián)想到,要想能夠很快的找到某頁(yè),最好給這本書(shū)分個(gè)章或者節(jié)什么的,然后逐級(jí)地向下查詢。這就是32位cpu里頁(yè)目錄和頁(yè)表所起的作用。頁(yè)目錄的長(zhǎng)度是4kb,它最多可以包含1024個(gè)頁(yè)目錄項(xiàng),每個(gè)頁(yè)目錄項(xiàng)32-bit,包含了頁(yè)表的地址和有關(guān)信息。所以,頁(yè)目錄把4Gb空間分成了1024個(gè)頁(yè)組,每個(gè)頁(yè)組4MB的大小。頁(yè)表的長(zhǎng)度也是4kb,1024個(gè)頁(yè)表項(xiàng),每個(gè)頁(yè)表項(xiàng)32-bit,包含頁(yè)的地址和其它信息。這樣,4MB的頁(yè)組又被分成了1024個(gè)頁(yè)面,每個(gè)頁(yè)面大小4kb。所以找到某一個(gè)頁(yè)就是先查頁(yè)目錄再查頁(yè)表這么一個(gè)過(guò)程。為了找到頁(yè)目錄,我們需要知道其基地址。在32位cpu里,CR3寄存器里高20位放的就是頁(yè)目錄的地址,因?yàn)轫?yè)目錄的低12位總是0,這樣保證頁(yè)目錄始終是頁(yè)對(duì)齊的(每頁(yè)大小4kB)。再來(lái)看一看前面通過(guò)32位段機(jī)制找到的線性地址。其高10位是頁(yè)目錄的偏移地址,一共1024個(gè)頁(yè)目錄用10位就可以標(biāo)識(shí)可能的最大偏移了。加上CR3,就可以找到頁(yè)目錄,然后再通過(guò)頁(yè)目錄找到頁(yè)表的基地址,線性地址的中間10位放的是頁(yè)表的偏移量,這樣就找到了頁(yè)表。最后頁(yè)表的基地址再加上CR3最低12位所表征的頁(yè)表的偏移地址就找到了頁(yè),這個(gè)頁(yè)的地址就是最終的物理地址。

          前面提到,之所以采用頁(yè)機(jī)制是為了虛擬內(nèi)存技術(shù)。所以頁(yè)目錄也好,頁(yè)表也好,除了地址信息外還有一些屬性信息,比如,當(dāng)前頁(yè)表是不是在內(nèi)存中等等。這樣才能方便系統(tǒng)管理虛擬內(nèi)存實(shí)施換進(jìn)換出的功能。這里就不詳述了。

          總的來(lái)講,32位尋址先通過(guò)32位段機(jī)制找到一個(gè)32位地址,如果沒(méi)有采用分頁(yè),那么它就是物理地址。否則,只是一個(gè)線性地址,然后再通過(guò)CR3,頁(yè)目錄,頁(yè)表找到頁(yè)的地址,它才是最終的物理地址。其實(shí),還用很多細(xì)節(jié)沒(méi)有涉及到,比如這里提到的描述符表是全局描述符表,實(shí)際上還有局部描述符表,再比如描述符只重點(diǎn)介紹了地址位,優(yōu)先級(jí)位和其它屬性位都沒(méi)有介紹。但是,一個(gè)完整的尋址圖像已經(jīng)展現(xiàn)在我們眼前了。它包含了32位CPU里的所有重要機(jī)制。剩下的問(wèn)題不妨采取暫不過(guò)問(wèn),現(xiàn)用現(xiàn)學(xué)的方法。



          關(guān)鍵詞: 32位cpu尋址小

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();