邏輯地址
邏輯地址也稱為相對(duì)地址,是編譯器根據(jù)規(guī)則生成的程序的內(nèi)部地址,在加載或執(zhí)行時(shí)通過(guò)地址映射將其轉(zhuǎn)換為物理內(nèi)存地址。邏輯地址分為兩部分:段基址和偏移量。在16位地址空間中,這兩個(gè)值的范圍是從0到0~FFFFH。最初,計(jì)算機(jī)的邏輯地址與物理地址相同。20世紀(jì)60年代以后,隨著多程序的廣泛應(yīng)用,為了防止一個(gè)程序的修改和更改影響其他程序,出現(xiàn)了基地址的方法,邏輯地址和物理地址不再一致。當(dāng)計(jì)算機(jī)處理源程序時(shí),它必須經(jīng)歷編譯、鏈接、加載和運(yùn)行等步驟。在這個(gè)過(guò)程中,需要生成一個(gè)邏輯地址,并實(shí)現(xiàn)從邏輯地址到物理地址的映射過(guò)程,從而將用戶源程序轉(zhuǎn)換為可在內(nèi)存中執(zhí)行的程序。其中,需要尋址,并且已經(jīng)開發(fā)了各種尋址方法。在地址映射的過(guò)程中,邏輯地址還涉及存儲(chǔ)管理系統(tǒng)中的各種管理方法。
在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,邏輯地址在許多方面都起著重要作用,例如閃存管理和實(shí)驗(yàn)數(shù)據(jù)提取。與邏輯地址相關(guān)的概念還包括物理地址、虛擬地址和線性地址。這些地址類型在計(jì)算機(jī)系統(tǒng)中都起著重要的作用,它們共同支持程序的運(yùn)行和內(nèi)存的有效管理。
概念定義
存儲(chǔ)單元的真實(shí)地址稱為物理地址,它是可識(shí)別的、實(shí)際存在的和可尋址的。物理地址是一個(gè)20位的數(shù)字,它定義了空間中的每個(gè)內(nèi)存位置。在微處理器中,物理地址以段基和段基偏移量的形式出現(xiàn)。
在編程中,很難確定物理地址,因此采用邏輯地址。邏輯地址不需要預(yù)生成代碼在內(nèi)存中的具體位置,只需給出一個(gè)標(biāo)簽作為邏輯地址即可。程序輸入計(jì)算機(jī)后,由機(jī)器自動(dòng)轉(zhuǎn)換成物理地址。在邏輯地址中,段基址是段寄存器(CS、ss、DS或ES)中的值,偏移量存儲(chǔ)在通用寄存器中,以此基址為參考。在16位地址空間中,這兩個(gè)值必須在0到65535(FFFFH)的范圍內(nèi)。
發(fā)展歷史
早期計(jì)算機(jī)系統(tǒng)
在原始計(jì)算機(jī)中,程序員編譯的用戶程序和數(shù)據(jù)在主存中的存儲(chǔ)位置由程序員確定和指示,它們的邏輯地址與主存的實(shí)際地址相同,由邏輯地址組成的邏輯地址空間(程序空間)與主存的實(shí)際地址組成的物理地址空間(實(shí)際內(nèi)存空間)相同。
匯編程序和編譯器的出現(xiàn)
隨著匯編程序、編譯程序和操作系統(tǒng)的出現(xiàn),主存中至少有兩個(gè)程序,即系統(tǒng)程序和用戶程序。此時(shí),源程序不是由機(jī)器指令代碼和主存儲(chǔ)器中的指令和數(shù)據(jù)尋址的,而是由運(yùn)算符、符號(hào)、標(biāo)量和數(shù)據(jù)描述編寫的。這些符號(hào)形成的空間稱為符號(hào)命名空間或命名空間。機(jī)器通過(guò)編譯程序來(lái)處理源程序。在這個(gè)階段,命名空間不會(huì)直接轉(zhuǎn)換為物理地址空間,而只是轉(zhuǎn)換為邏輯地址空間,即編譯后的輸出是從零地址開始尋址的目標(biāo)程序,然后加載程序?qū)⒛繕?biāo)程序的邏輯地址空間轉(zhuǎn)換為目標(biāo)程序的物理地址空間來(lái)執(zhí)行程序的定位。在多道程序系統(tǒng)中,多個(gè)用戶作業(yè)同時(shí)存儲(chǔ)在主存中。每次轉(zhuǎn)入運(yùn)行時(shí),操作系統(tǒng)都會(huì)根據(jù)主存的使用情況為用戶分配主存空間,用戶程序中使用的地址是邏輯地址。
多道程序系統(tǒng)的發(fā)展
20世紀(jì)60年代初,隨著多程序的廣泛應(yīng)用,一個(gè)程序可能被多個(gè)用戶程序共享。此時(shí)修改指令地址碼不方便。例如,當(dāng)用戶程序調(diào)用此程序修改地址碼時(shí),如果地址碼糾正錯(cuò)誤,不僅會(huì)影響此程序,還會(huì)使其他程序出錯(cuò)。這種指令(包括地址碼)允許修改,阻礙了程序重入的實(shí)現(xiàn),不利于診斷和程序調(diào)試,給采用重疊和流水線技術(shù)帶來(lái)困難。
引入基址尋址和保護(hù)機(jī)制
20世紀(jì)60年代以后,不再允許修改指令地址碼。此時(shí),在加載程序時(shí),除了將程序加載到主存儲(chǔ)器中之外,還需要將程序在主存儲(chǔ)器中的起始地址添加到程序的相應(yīng)地址碼中(一般用“A”表示)。基于這一思想,出現(xiàn)了基地址法。當(dāng)一個(gè)程序訪問(wèn)主存時(shí),它需要將存儲(chǔ)在基址寄存器中的程序基點(diǎn)地址相加,形成一個(gè)物理地址后才能訪問(wèn)主存。
相關(guān)技術(shù)
當(dāng)計(jì)算機(jī)處理源程序時(shí),它必須經(jīng)過(guò)與邏輯地址相關(guān)的編譯、鏈接、加載和運(yùn)行等步驟,從而將用戶源程序變成可在內(nèi)存中執(zhí)行的程序。在整個(gè)過(guò)程中,涉及到邏輯地址,這需要程序員在程序中寫入邏輯地址或?qū)⑦壿嫷刂忿D(zhuǎn)換為其他地址形式。
編譯:編譯的過(guò)程就是把用高級(jí)語(yǔ)言編寫的源程序翻譯成機(jī)器能識(shí)別的目標(biāo)程序。編譯器將源程序的每個(gè)模塊編譯成相應(yīng)的目標(biāo)模塊,每個(gè)目標(biāo)模塊中的地址從0開始尋址。一些相關(guān)的目標(biāo)模塊鏈接后,形成一個(gè)完整的目標(biāo)模塊,其地址也從0開始。這些地址空間被稱為邏輯地址空間。
互連:鏈接的作用是將編譯后生成的多個(gè)目標(biāo)模塊鏈接成一個(gè)完整的目標(biāo)模塊。在這個(gè)過(guò)程中,要解決兩個(gè)問(wèn)題:一是因?yàn)殒溄又坝泻芏嗄K,每個(gè)模塊都有自己的地址空間和邏輯地址,所以要先修改邏輯地址,使鏈接成為一個(gè)地址空間;其次,由于模塊之間原來(lái)的調(diào)用關(guān)系是通過(guò)函數(shù)調(diào)用語(yǔ)句實(shí)現(xiàn)的,而鏈接之后只有一個(gè)模塊,因此需要將調(diào)用語(yǔ)句改為跳轉(zhuǎn)語(yǔ)句。實(shí)現(xiàn)鏈接的方式有三種:靜態(tài)鏈接、加載時(shí)動(dòng)態(tài)鏈接和運(yùn)行時(shí)動(dòng)態(tài)鏈接。
包裝:在早期,編譯、鏈接、加載和運(yùn)行的步驟是依次進(jìn)行的。隨著計(jì)算機(jī)技術(shù)的發(fā)展,為了提高內(nèi)存的利用率,引入了動(dòng)態(tài)加載模式,將上述步驟交織在一起。程序加載方法分為絕對(duì)加載方法、可重定位加載方法和動(dòng)態(tài)運(yùn)行時(shí)加載方法。
絕對(duì)加載模式:編譯時(shí),如果你知道程序?qū)Ⅰv留在內(nèi)存中的什么位置,編譯器將生成帶有絕對(duì)地址的目標(biāo)代碼。絕對(duì)裝入程序根據(jù)裝入模塊中的地址將程序和數(shù)據(jù)裝入內(nèi)存。加載模塊加載到內(nèi)存后,由于程序中的邏輯地址與實(shí)際內(nèi)存地址完全相同,因此無(wú)需修改程序和數(shù)據(jù)的地址。程序中使用的絕對(duì)地址可以在編譯或匯編時(shí)給出,也可以由程序員直接給出。
浮動(dòng)裝載模式:一般來(lái)說(shuō),作業(yè)加載到內(nèi)存時(shí)分配的存儲(chǔ)空間與其地址空間不一致,因此作業(yè)要訪問(wèn)的指令和數(shù)據(jù)的物理地址與地址空間中的邏輯地址不同。當(dāng)加載或執(zhí)行作業(yè)時(shí),需要在程序中調(diào)整相關(guān)的地址部分并轉(zhuǎn)換地址。這種將邏輯地址轉(zhuǎn)換為物理地址的過(guò)程稱為地址重定位,也稱為地址映射或地址轉(zhuǎn)換。因?yàn)檫@種地址轉(zhuǎn)換只在加載時(shí)完成一次,以后不會(huì)再更改,所以稱為靜態(tài)重定位。
動(dòng)態(tài)運(yùn)行時(shí)加載模式:動(dòng)態(tài)運(yùn)行時(shí)加載程序在將加載模塊加載到內(nèi)存中后,不會(huì)立即將加載模塊中的邏輯地址轉(zhuǎn)換為物理地址,而是將這種地址轉(zhuǎn)換推遲到程序?qū)嶋H執(zhí)行時(shí)進(jìn)行。此時(shí),加載到內(nèi)存后的所有地址仍然是邏輯地址。這種地址轉(zhuǎn)換方法稱為動(dòng)態(tài)重定位。在程序執(zhí)行過(guò)程中,每當(dāng)訪問(wèn)一條指令或數(shù)據(jù)時(shí),要訪問(wèn)的程序或數(shù)據(jù)的邏輯地址就被轉(zhuǎn)換成物理地址。動(dòng)態(tài)重定位的實(shí)現(xiàn)依賴于硬件地址轉(zhuǎn)換結(jié)構(gòu)。
運(yùn)行:在一維邏輯地址空間中,每個(gè)作業(yè)的邏輯地址空間的大小是不同的,但邏輯地址從0開始。在二維邏輯地址空間中,每個(gè)用戶的作業(yè)被分成幾個(gè)段,每個(gè)段被賦予一個(gè)名稱,每個(gè)邏輯地址被表示為段號(hào)和單元號(hào)。地址中的段名表示要訪問(wèn)的目標(biāo)段,單元號(hào)表示要訪問(wèn)的段的目標(biāo)單元。
當(dāng)運(yùn)行一個(gè)寫在邏輯地址的程序時(shí),首先編譯或匯編幾個(gè)目標(biāo)代碼,然后鏈接不同模塊中的同類型段,最后形成一個(gè)可執(zhí)行程序的存儲(chǔ)鏡像文件,將其加載到內(nèi)存中運(yùn)行。
選址方式
尋址模式是指確定此指令的數(shù)據(jù)(操作數(shù))地址和下一條要執(zhí)行的指令的地址的方法。
指令尋址模式:由于現(xiàn)代計(jì)算機(jī)使用PC來(lái)跟蹤程序的執(zhí)行并知道要執(zhí)行的指令的地址,因此當(dāng)程序開始運(yùn)行時(shí),程序的起始地址通常由系統(tǒng)程序直接給出并發(fā)送給PC。當(dāng)程序執(zhí)行時(shí),PC的值可以以順序方式或跳過(guò)方式改變,以完成對(duì)下一條要執(zhí)行的指令的尋址。
按序方式:順序模式是通過(guò)PC增量形成下一個(gè)指令地址。增量取決于下一條指令占用的存儲(chǔ)單元數(shù)量。當(dāng)指令地址被順序?qū)ぶ窌r(shí),CPU可以根據(jù)PC的內(nèi)容依次從存儲(chǔ)器中讀取指令。
跳躍模式:跳過(guò)模式是在程序傳輸時(shí)根據(jù)指令的傳輸目標(biāo)地址修改PC的內(nèi)容。當(dāng)程序需要轉(zhuǎn)移時(shí),轉(zhuǎn)移指令生成轉(zhuǎn)移目標(biāo)地址并發(fā)送給PC,從而可以轉(zhuǎn)移程序。這個(gè)過(guò)程也稱為程序跳轉(zhuǎn)。
操作數(shù)尋址模式:操作數(shù)尋址是指找到操作數(shù)地址的方法。關(guān)于操作數(shù)的來(lái)源和目的地以及指令中的地址排列有多種情況。不同的指令使用不同數(shù)量、不同來(lái)源、不同用途的操作數(shù),因此地址碼字段的編碼靈活多樣,需要尋址時(shí)根據(jù)編碼原理采用不同的尋址方式。
存儲(chǔ)管理
虛擬內(nèi)存由一部分主存和輔存組成,它彌補(bǔ)了實(shí)際物理內(nèi)存的不足,為系統(tǒng)提供了比物理內(nèi)存大得多的容量,解決了程序運(yùn)行時(shí)計(jì)算機(jī)系統(tǒng)性能差的問(wèn)題。
計(jì)算機(jī)中運(yùn)行的程序通常存儲(chǔ)在磁盤上。當(dāng)程序運(yùn)行時(shí),CPU使用虛擬地址訪問(wèn)內(nèi)存。計(jì)算機(jī)系統(tǒng)由硬件和軟件組成,完成邏輯地址和真實(shí)地址之間的轉(zhuǎn)換,從而達(dá)到訪問(wèn)內(nèi)存的目的。
分段管理:段管理是將分配的內(nèi)存組織成段,存儲(chǔ)單元的地址由兩部分組成:段地址和段內(nèi)偏移量。任何內(nèi)存單元的物理地址都是段地址和偏移量的線性組合,操作系統(tǒng)為應(yīng)用程序分配和管理段地址。這樣,應(yīng)用程序只涉及段內(nèi)的偏移地址,即程序的邏輯地址。
應(yīng)用程序編譯或匯編后得到的程序代碼實(shí)際上是程序執(zhí)行時(shí)的內(nèi)存映像,可能會(huì)留下大量的相對(duì)地址。在將這些相對(duì)地址加載到內(nèi)存的過(guò)程中,操作系統(tǒng)會(huì)完全填充這些相對(duì)地址,以便它們可以順利執(zhí)行。在分段管理模式下,同一應(yīng)用程序可以在不同的計(jì)算機(jī)上運(yùn)行。
頁(yè)面管理:計(jì)算機(jī)通常可以同時(shí)運(yùn)行多個(gè)應(yīng)用程序。這些應(yīng)用程序是操作系統(tǒng)的任務(wù),它們的代碼占用大量存儲(chǔ)空間。在這個(gè)過(guò)程中,需要不斷地管理邏輯地址。操作系統(tǒng)需要將當(dāng)前使用邏輯地址數(shù)據(jù)加載到物理存儲(chǔ)器中,并將暫時(shí)未使用的邏輯地址數(shù)據(jù)保存到外部存儲(chǔ)器中。
為此,內(nèi)存需要分成幾頁(yè),如Windows操作系統(tǒng),4KB內(nèi)存為一頁(yè)。程序代碼中的地址可以是邏輯地址,并且該邏輯地址的容量可以遠(yuǎn)遠(yuǎn)大于物理地址的可訪問(wèn)范圍。在運(yùn)行時(shí),頁(yè)面管理機(jī)制將邏輯地址映射到物理地址。如果CPU訪問(wèn)的頁(yè)面已經(jīng)在物理內(nèi)存中,則可以正常運(yùn)行;當(dāng)CPU訪問(wèn)的頁(yè)面不在物理內(nèi)存中時(shí),就會(huì)發(fā)生缺頁(yè)異常。CPU執(zhí)行操作系統(tǒng)的異常處理代碼,將暫時(shí)不用的頁(yè)面保存到硬盤上的虛擬內(nèi)存中,然后將當(dāng)前請(qǐng)求的頁(yè)面轉(zhuǎn)移到內(nèi)存中,以便應(yīng)用程序可以繼續(xù)執(zhí)行。
段頁(yè)面管理:分頁(yè)系統(tǒng)可以有效地提高邏輯地址的內(nèi)存利用率,分段系統(tǒng)可以很好地滿足用戶的需求。將兩者結(jié)合起來(lái)的“段-頁(yè)管理”具有兩者的優(yōu)點(diǎn)。逐頁(yè)管理的基本原理是將用戶程序分成幾個(gè)段,然后將每個(gè)段分成幾個(gè)頁(yè)面,并給每個(gè)段取一個(gè)段名。在分段頁(yè)面系統(tǒng)中,其地址結(jié)構(gòu)由段號(hào)、段內(nèi)頁(yè)碼和頁(yè)內(nèi)地址組成。
每個(gè)段都分配有相同頁(yè)數(shù)的內(nèi)存塊,內(nèi)存塊可以是連續(xù)的也可以是不連續(xù)的。系統(tǒng)為每個(gè)段建立一個(gè)頁(yè)表以記錄每個(gè)頁(yè)對(duì)應(yīng)塊的信息,還為程序建立一個(gè)段表以記錄每個(gè)段對(duì)應(yīng)的頁(yè)表。
存儲(chǔ)保護(hù):在多任務(wù)運(yùn)行環(huán)境中,任務(wù)之間以及任務(wù)與操作系統(tǒng)之間都涉及到邏輯地址的管理,需要進(jìn)行隔離保護(hù)。例如,任務(wù)A的代碼段不能執(zhí)行任何旨在破壞任務(wù)B的指令,反之亦然,更不用說(shuō)破壞操作系統(tǒng)的運(yùn)行環(huán)境了。存儲(chǔ)保護(hù)的目的是防止用戶程序之間地址映射過(guò)程中的相互干擾。通常的保護(hù)方式有越界保護(hù)和越權(quán)保護(hù)。
跨境保護(hù):跨境保護(hù)有兩種方法。一種方法是硬件為分配給應(yīng)用程序的每個(gè)連續(xù)主內(nèi)存空間設(shè)置上限和下限寄存器,它們分別指向內(nèi)存空間的上限和下限。另一種方法是使用基址和有限長(zhǎng)度寄存器。基址寄存器存儲(chǔ)當(dāng)前正在執(zhí)行的進(jìn)程的地址空間所占用的分區(qū)的起始地址。地址空間的長(zhǎng)度存儲(chǔ)在長(zhǎng)度限制寄存器中。在操作期間,生成的邏輯地址與長(zhǎng)度限制寄存器的內(nèi)容進(jìn)行比較,如果超過(guò)長(zhǎng)度限制,則會(huì)發(fā)送越界中斷信號(hào)。
越權(quán)保護(hù):越權(quán)保護(hù)可以防止不同程序在映射邏輯地址和物理地址時(shí)相互干擾。越權(quán)保護(hù)就是讀寫屬于自己區(qū)域的信息;允許在公共區(qū)域共享的信息或授權(quán)使用的信息可以被讀取且不能被修改;未授權(quán)使用的信息不可讀、不可寫,只能執(zhí)行;其他人,什么都不做。
主要應(yīng)用
閃存轉(zhuǎn)換層(FTL):閃存轉(zhuǎn)換層(TFL)是固態(tài)硬盤的核心組件,其功能之一是實(shí)現(xiàn)邏輯地址到物理地址的映射。根據(jù)映射規(guī)模,F(xiàn)TL映射方法分為塊映射、頁(yè)映射和混合映射。地址映射過(guò)程可以分為兩級(jí):第一級(jí)映射用于平衡內(nèi)存塊的磨損,第二級(jí)映射用于處理壞塊問(wèn)題。TFL的中間邏輯地址是串聯(lián)的第一和第二層映射關(guān)系的中間地址。當(dāng)沒(méi)有壞塊時(shí),中間邏輯地址等于物理地址。
近代物理實(shí)驗(yàn)的數(shù)據(jù)提取:現(xiàn)代應(yīng)用物理學(xué)中的多單元翻轉(zhuǎn)(Multi-cell flip,MCU)是指入射到存儲(chǔ)器件上的單個(gè)粒子通過(guò)在多個(gè)敏感單元中沉積能量而導(dǎo)致多個(gè)存儲(chǔ)單元同時(shí)翻轉(zhuǎn)的現(xiàn)象。在這個(gè)過(guò)程中,隨著存儲(chǔ)器件特征尺寸的減小,MCU的頻率顯得越來(lái)越高,這將影響微電子存儲(chǔ)器件的可靠性。從SEU數(shù)據(jù)中提取MCU信息時(shí),主要問(wèn)題是缺少物理地址和邏輯地址之間的映射關(guān)系。解決這一問(wèn)題的常用方法是通過(guò)逆向工程獲得芯片的內(nèi)部布局,并進(jìn)一步分析芯片的物理地址和邏輯地址之間的映射關(guān)系。還有一種基于概率統(tǒng)計(jì)提取物理地址和邏輯地址映射關(guān)系的方法,也可以解決這個(gè)問(wèn)題。