**:
32位cpu 位址線擴充套件成了32位,這和資料線的寬度是一致的。因此,在32位機裡其實並不需要採用「實體地址=段:偏移」這種位址表達方式。原來在16位機裡規定的每乙個段不大於64kb在32位機裡也不是必要的。所以,對於32位機來講,最簡單的方法就是用乙個32位數來標識乙個位元組的儲存位址,定址時只要給出乙個32位數就可以直接找到位址。這種位址儲存模型就屬於「平展儲存模型」。
但是,新產品一般都希望遵循「向下相容」這個原則。所以,32位機裡完整的保留了16位定址模式。即:定址能力為1m;分段機制;每段不超過64kb。這就是通常所說的」實模式」。在位址儲存模型中屬於「實位址儲存模型」。
其次,考慮到程式通常都是功能化的模組,所以分段雖然不是必要的,但分段卻能大大提高程式設計者管理程式的效率。故而32位機也採用了段+偏移的模式來定址。但與實模型不同的是,由於位址線和資料線寬度一致,因而,每個段最大可以到4g,並且段基址也是32位的無需進行左移處理。在位址儲存模型中這屬於「段位址儲存模型」。然而需要注意的是,在32位機裡,雖然通用暫存器,標誌暫存器等都擴充套件成了32位,但是段暫存器卻依然是16位的(為什麼不做改變??我猜可能是這樣便於向下相容)。所以在32位定址時,段暫存器裡放的不再是段基址(位數不夠,放不下)而是乙個選擇子。這個選擇子對應了乙個64-bit長的描述符,64-bit的描述符裡有32-bit是段基址。所以原來在16位機裡通過段暫存器一步就可以找到段基址,而現在在32位機裡分成了兩步:先找選擇子,然後通過選擇子找段基址。段基址找到了,再加上偏移位址,實體地址就找到了。看樣子,32位段模式定址已經介紹清楚了。其實,這裡頭的故事還遠沒有講完。
在上面簡述的過程中,很容易發現有兩個問題沒有交待。(1)cpu是如何將選擇子與描述符對應起來的?(2)既然是64-bit的描述符,32位用來表示基位址,那麼餘下的32位是幹什麼用的?另外,當32位機發展起來的同時,作業系統也有了長足進步,單任務模式的dos被多工的windows所取代。也就是說,現在駐留在記憶體中的往往不止是乙個程式,而很可能是多個程式同時在記憶體中。現在又沒有了段大小的限制,程式之間便很有可能相互搶位址,如果核心程式被破壞,計算機就會崩潰。這就好比在馬路上走車,如果只有一輛車開,怎麼開都可以,但是如果車多了不制定個交通規則,車便會搶道,道路就會癱瘓。所以,在多工的情況下,必須給定址也制定乙個「交通規則」,這樣才能保證多工系統有序的工作。制定什麼樣的規則呢?首先,既然程式是在無意識的情況下搶占了別的程式的位址,那麼如果在定址時包含乙個查詢的過程就可以有效的避免搶位址的情況發生。也就是說,先得問一問那個位址是不是已經有程式段占用了?同時已佔上位址的程式段除了告知cpu自己的基位址外還應該告訴cpu自己的長度資訊。這樣別的程式段才能方便地查詢。第二,多工定址最好應該包含優先順序別的內容,已備緊急情況下為核心程式讓道。這好比在馬路上,一般情況下車是遵守規則的,但如果是警車或救護車執行任務時,就可以優先搶占別的車的道。所以,還應該定義乙個優先順序。然後,由佔上位址的程式段告訴cpu自己的優先級別。總的來講,原來在16位機裡很單純的乙個「段」的概念現在變得複雜了。如同人的成長過程,剛開始的時候思維總是很幼稚的,相應的也只能解決簡單的問題,只有當你的思維擺脫幼稚的時候,才有能力解決更為複雜的事情。現在cpu擺脫了幼稚的16位,它在描述「段」的時候當然不應該像16位時那麼膚淺。在32位機裡,「段」有三個要素:基位址,長度,屬性(屬性裡包含了優先順序和其它的一些內容)。為了能一次完整的引用或者給出這三個要素,需要新定義乙個資料結構。這個結構就是前面所提到的描述符,每乙個描述符都占有64-bit,有足夠的長度來包含段的三個要素。當然,現在記憶體中不止乙個程式,而且程式也不止乙個段,所以描述符也不會有乙個,而是很多個。最簡單的管理方法,就是將所有的描述符集中起來放在一塊連續的儲存空間裡,然後給各個描述符排上序號。當要找某乙個特定的描述符時,只要先找到這塊連續的儲存空間然後給出序號就可以了。這些集中起來的描述符形成了一張表,所以通常被叫做描述符表。所以,想找到乙個段的資訊,首先要找到描述符表。也就是說,找特定的描述符先要知道描述符表的基位址。在32位cpu中,有乙個48位的專用暫存器用來存放全域性描述符表的資訊,這個暫存器叫做gdtr。其中,高32位給出了全域性描述符表的基位址,低16位給出了描述符表的長度限制。所以,一張全域性描述符表最長可以是64kb。那麼,最多可以放64kb/8b=8k個描述符。所以如果想在其中選擇任意乙個描述符,用13位就可以辦到了。在32位cpu中,16位段暫存器的高13位就用來存放特定描述符的序號。其實,現在段暫存器的功能就是選擇描述符,正因為如此,通常也把段暫存器叫做選擇器。那麼,經過冗長的介紹,現在32位段定址的過程已經大體依稀浮現在眼前了:在段暫存器裡找到序號,在 gdtr中找到全域性描述符表的基位址,然後就可以找到目的描述符。再從描述符中取出段的基位址,然後加上偏移位址,這樣就得到了段的「實體地址」。
真是令人興奮,這樣的定址過程為執行多工提供了有力的保障,可以想象這是計算機執行效能上的一次飛躍!從此高速的cpu再也不會為無用武之地發愁了,它可以最大限度的發揮自己速度快的優勢,同時處理好多個任務。是的,當我們眼前出現了新的景象的時候,我們有理由興奮。但是,我們不應該就此滿足。我們應該沿著新天地撇給我們的一絲亮光,繼續前行,去找到這片新天地。人就是在這樣的前行中不斷讓事情變得更完美。到這裡,我們對於定址過程的了解,只是開了乙個頭而已,但這是乙個好頭,我們體會到了32位cpu的強大優勢。這足以讓我們對完整的32位cpu定址充滿了期待。讓我們鼓舞士氣,沿著前人的足跡繼續前行吧!
我們知道,程式**和資料必須駐留在記憶體中才能得以執行,然而系統記憶體數量很有限,往往不能容納乙個完整程式的所有**和資料,更何況現在是多工系統,想讓記憶體駐留所有任務程式顯然不太可能。老式系統就是將程式分割成小份,只讓當前系統執行它所有需要的那部分留在記憶體,其它部分都留在硬碟。當系統處理完當前任務片段後,再從外存中調入下乙個待執行的任務片段,而且這個工作是由程式設計師自行完成。顯然這增加了程式設計師的負擔。
由此針對多工系統發展了一種虛擬記憶體技術。虛擬記憶體技術就是一種由作業系統接管的按需動態記憶體分配的方法,它允許程式不知不覺中使用大於實際物理空間大小的儲存空間(其實是將程式需要的儲存空間以頁的形式分散儲存在物理記憶體和磁碟上)。虛擬記憶體是將系統硬碟空間和系統實際記憶體聯合在一起供程序使用,給程序提供了乙個比記憶體大得多的虛擬空間。在程式執行時,把虛擬位址空間的一小部分對映到記憶體,其餘都儲存在硬碟上(也就是說程式虛擬空間就等於實際物理記憶體加部分硬碟空間)。當被訪問的虛擬位址不在記憶體時,則說明該位址未被對映到記憶體,而是被存貯在硬碟中,因此需要的虛擬儲存位址隨即被調入到記憶體;同時當系統記憶體緊張時,也可以把當前不用的虛擬儲存空間換出到硬碟,來騰出物理記憶體空間。 這樣,為了提高系統效能,發展了虛擬記憶體技術,那麼相應的,32位cpu也應該發展新的定址技術來管理虛擬記憶體。這是通過頁機制來實現的。
因為使用頁機制的原因,前面提到的通過段機制轉換得到的位址僅僅是作為乙個中間位址——線性位址了,該位址不代表實際實體地址,而是代表整個程序的虛擬空間位址。還得有乙個將虛擬位址轉換成實體地址的過程。
讓我們來認識一下頁機制。它就是把記憶體分成乙個乙個連續的頁,每頁大小4kb。與段不同,頁不是程式功能塊的體現。乙個程式功能塊可能占用好多個頁。現在記憶體就像一本書了,一頁一頁的,每頁的容量都是相等的。當然,我們很快可以聯想到,要想能夠很快的找到某頁,最好給這本書分個章或者節什麼的,然後逐級地向下查詢。這就是32位cpu裡頁目錄和頁表所起的作用。頁目錄的長度是4kb,它最多可以包含1024個頁目錄項,每個頁目錄項32-bit,包含了頁表的位址和有關資訊。所以,頁目錄把4gb空間分成了1024個頁組,每個頁組4mb的大小。頁表的長度也是4kb,1024個頁表項,每個頁表項32- bit,包含頁的位址和其它資訊。這樣,4mb的頁組又被分成了1024個頁面,每個頁面大小4kb。所以找到某乙個頁就是先查頁目錄再查頁表這麼乙個過程。為了找到頁目錄,我們需要知道其基位址。在32位cpu裡,cr3暫存器裡高20位放的就是頁目錄的位址,因為頁目錄的低12位總是0,這樣保證頁目錄始終是頁對齊的(每頁大小4kb)。再來看一看前面通過32位段機制找到的線性位址。其高10位是頁目錄的偏移位址,一共1024個頁目錄用10位就可以標識可能的最大偏移了。加上cr3,就可以找到頁目錄,然後再通過頁目錄找到頁表的基位址,線性位址的中間10位放的是頁表的偏移量,這樣就找到了頁表。最後頁表的基位址再加上cr3最低12位所表徵的頁表的偏移位址就找到了頁,這個頁的位址就是最終的實體地址。
前面提到,之所以採用頁機制是為了虛擬記憶體技術。所以頁目錄也好,頁表也好,除了位址資訊外還有一些屬性資訊,比如,當前頁表是不是在記憶體中等等。這樣才能方便系統管理虛擬記憶體實施換進換出的功能。這裡就不詳述了。
總的來講,32位定址先通過32位段機制找到乙個32位位址,如果沒有採用分頁,那麼它就是實體地址。否則,只是乙個線性位址,然後再通過cr3,頁目錄,頁表找到頁的位址,它才是最終的實體地址。其實,還用很多細節沒有涉及到,比如這裡提到的描述符表是全域性描述符表,實際上還有區域性描述符表,再比如描述符只重點介紹了位址位,優先順序位和其它屬性位都沒有介紹。但是,乙個完整的定址影象已經展現在我們眼前了。它包含了32位cpu裡的所有重要機制。剩下的問題不妨採取暫不過問,現用現學的方法
Android 如何判斷CPU是32位還是64位
可以利用三種方式來判斷cpu是32位還是64位 1.讀取android 的system property ro.product.cpu.abilist64 來判斷 2.讀取 proc cpuinfo 檔案的第一行來判斷 3.讀取libc.so檔案的elf頭部e indent陣列,根據陣列第e ind...
32位CPU暫存器常用知識彙總
2 資料暫存器 3 變址暫存器 4 指標暫存器 5 段暫存器 6 指令指標暫存器 7 標誌暫存器 eflag 7.2 狀態控制標誌位 7.3 32位cpu新增的標誌位 4個資料暫存器 eax ebx ecx和edx 2個變址和指標暫存器 esi和edi 2個指標暫存器 esp和ebp 6個段暫存器 ...
如何識別64位和32位CPU
硬體環境 ia 64 amd athlon tm 64 pentium iii linux環境 redhat el as 3 mandrake linux 10 for amd 64 redhat linux 7.3 前段時間做系統實施的時候,因為事先沒有對伺服器的配置做詳細說明和檢查,導致應用伺服...