文章也同時在個人博客 http://kimihe.com/更新
引言
本文將作為第四章的收尾拐云,主要介紹三種主要的匯編編程模型罢猪,并順帶提及64位長模式。
摘錄
實模式平面模型
- 在實模式平面模型下叉瘩,程序和它處理的所有數(shù)據(jù)都必須位于一個64KB大小的內(nèi)存塊中膳帕。
- 所有的段寄存器都被設(shè)置為指向你能使用的64KB內(nèi)存塊的起始位置,操作系統(tǒng)會設(shè)置這些寄存器薇缅,它們指向同一個地方危彩,而且永遠(yuǎn)也不會改變,你可以完全忘記它們泳桦。
- 由于16位寄存器(如BX)可以容納從0到65535之間的任意值恬砂,所以它能夠精確定位程序使用的64KB空間中的任一字節(jié),你不必以任何方式訪問段寄存器蓬痒。
實模式段模型
- 在實模式段模型下泻骤,程序可以看到在實模式下CPU可用的整個1MB內(nèi)存漆羔。
- 段地址指定了段到底從65536個可用“插槽”中的哪一個開始,從內(nèi)存底部到頂端每16個字節(jié)都有一個這種插槽狱掂⊙菅鳎可以通過把一個段地址乘以16來將其翻譯成一個真實的20位內(nèi)存地址。
- 段寄存器指定從哪一個段落邊界開始一個段趋惨。段寄存器并不包含內(nèi)存地址本身鸟顺。
- 你可以同時訪問兩個數(shù)據(jù)段,因為有兩個段寄存器可以做這項工作:DS和ES器虾。(在386及更高版本處理器中讯嫂,還有兩個附加段寄存器:FS和GS)。
- 但是你只有一個代碼段寄存器:CS兆沙。CS總是指向當(dāng)前的代碼段欧芽,IP寄存器指向下一條即將執(zhí)行的指令的地址。[CS:IP]葛圃。
- 任意一個單獨的程序都只有一個堆棧段千扔,它由堆棧段寄存器SS來指定,堆棧指針寄存器SP指向下一條堆棧操作即將發(fā)生的內(nèi)存地址库正。
保護(hù)模式平面模型
- 在保護(hù)模式下曲楚,應(yīng)用程序(就是你寫的程序,與操作系統(tǒng)或設(shè)備驅(qū)動程序相對)不能破壞操作系統(tǒng)或其他在內(nèi)存中運行的應(yīng)用程序褥符。
- 在保護(hù)模式平面模型中龙誊,程序看到的是一塊地址從0到4G-1的內(nèi)存。每個地址都是一個32位的量喷楣,所有通用寄存器的大小都是32位载迄,因此一個通用寄存器可以指向整個4GB地址空間的任何位置。
- 在保護(hù)模式下抡蛙,段寄存器仍然存在护昧,但以一種完全不同的方式工作,它們的新工作是定義你的4GB內(nèi)存空間出現(xiàn)在物理內(nèi)存或者虛擬內(nèi)存的什么地方粗截。一個32位寄存器只能表示4294967296(2的32次方)個不同的位置惋耙。如果你的計算機擁有超過4GB的內(nèi)存,操作系統(tǒng)必須在內(nèi)存中安排出4GB區(qū)域熊昌,你的程序僅限于操縱該區(qū)域內(nèi)的內(nèi)存绽榛。
- 任何一個32位寄存器完全依靠自己就可以訪問這40億內(nèi)存中的任一位置,但并非所有4GB內(nèi)存你的程序都可以支配婿屹,有些內(nèi)存你不但不能使用灭美,甚至連看都不能看(受保護(hù)的)。
展望未來:64位長模式
x86-64體系結(jié)構(gòu)定義了三個一般模式:實模式昂利,保護(hù)模式和長模式届腐。
- 實模式下铁坎,CPU像8086或其他x86 CPU在實模式下一樣工作,并且支持實模式平面模型和實模式段模型犁苏。
- 保護(hù)模式也是一種兼容模式硬萍,并且是的CPU看起來就像是一個IA-32 CPU。
- 長模式是實64位模式:當(dāng)CPU在長模式下围详,所有寄存器都是64位寬朴乖,所有工作于64位的機器指令都是可用的。
- 2的64次方的空間非常巨大助赞,目前似乎根本無法用完买羞。管理所有這64位地址需要CPU位架構(gòu)內(nèi)部的晶體管,但是芯片制造商們不是浪費芯片上的晶體管來管理在CPU(甚至x86-64體系結(jié)構(gòu)本身)有生之年都不會用到的內(nèi)存地址線雹食,而是限制了當(dāng)前CPU實現(xiàn)中的真正功能性地址線的數(shù)量畜普。今天可以買到的x86-64 CPU芯片能夠?qū)崿F(xiàn)48位虛擬內(nèi)存地址,但是只能實現(xiàn)40位物理內(nèi)存地址婉徘。
感想
說64位足夠用的今后或許會打臉,就和當(dāng)年說32位夠用一樣咐汞。