簡體   English   中英

什么是分頁?

[英]What is paging?

此處解釋了分頁,幻燈片 #6:

http://www.cs.ucc.ie/~grigoras/CS2506/Lecture_6.pdf

在我的講義中,但我終生無法理解它。 我知道這是一種將虛擬地址轉換為物理地址的方法。 所以磁盤上的虛擬地址被分成 2^k 的塊。 這之后我真的很困惑。 有人可以簡單地向我解釋一下嗎?

正如您所指出的,分頁是一種虛擬內存。 要回答@約翰屈膝禮提出的問題:它是從虛擬內存分別涵蓋一般,因為其他類型的虛擬內存,雖然分頁現在是(迄今為止)最為常見。

分頁虛擬內存非常簡單:您將所有物理內存分成塊,大部分大小相等(盡管在實踐中選擇兩個或三個大小是相當普遍的)。 使塊大小相同使它們可以互換。

然后你有尋址。 您首先將每個地址分成兩部分。 一個是頁面內的偏移量。 您通常使用該部分的最低有效位。 如果您使用(例如)4K 頁面,則需要 12 位作為偏移量。 有了(比如說)一個 32 位的地址空間,剩下 20 位。

從那里開始,事情真的比最初看起來簡單得多。 您基本上構建了一個小的“描述符”來描述內存的每一頁。 這將有一個線性地址(客戶端應用程序用來尋址該內存的地址),一個內存的物理地址,以及一個 Present 位。 會有(至少通常)一些其他的東西,比如權限來指示該頁面中的數據是否可以被讀取、寫入、執行等。

然后,當客戶端代碼使用一個地址時,CPU 開始從地址的其余部分分解頁面偏移量。 然后它獲取線性地址的其余部分,並查看頁面描述符以找到與該線性地址對應的物理地址。 然后,為了尋址物理內存,它使用物理地址的高 20 位和線性地址的低 12 位,它們一起形成實際的物理地址,從處理器引腳出去並從內存芯片獲取數據.

現在,我們進入了獲得“真實”虛擬內存的部分。 當程序使用的內存多於實際可用內存時,操作系統會獲取其中一些描述符的數據,並將其寫入磁盤驅動器。 然后清除該內存頁的“存在”位。 內存的物理頁現在可以用於其他目的。

當客戶端程序嘗試訪問該內存時,CPU 檢查是否設置了 Present 位。 如果不是,CPU 將引發異常。 當這種情況發生時,CPU 如上所述釋放一塊物理內存,從磁盤讀回當前頁面的數據,並用它現在所在的物理頁面的地址填充頁面描述符。 當它完成所有這些后,它從異常中返回,CPU 重新開始執行導致異常開始的指令——除了現在,Present 位被設置,所以使用內存將起作用。

還有一個你可能需要知道的細節:頁面描述符通常被安排到頁表中,並且(重要的部分)你通常為系統中的每個進程(以及另一個用於操作系統內核)擁有一組單獨的頁表本身)。 每個進程擁有單獨的頁表意味着每個進程可以使用相同的線性地址集,但根據需要將它們映射到不同的物理地址集。 您還可以通過創建包含相同物理地址的兩個單獨的頁面描述符(每個進程一個)將相同的物理內存映射到多個進程。 大多數操作系統都使用它,例如,如果你有兩個或三個相同程序的副本在運行,它實際上在內存中只有一個該程序的可執行代碼副本——但它會有兩個或三個指向相同代碼的頁面描述符集,因此它們所有人都可以使用它,而無需為每個描述符制作單獨的副本。

當然,我做了很多簡化——關於虛擬內存的書籍很多(而且通常相當大)。 機器之間也有相當多的變化,添加了各種裝飾,對參數進行了細微的更改(例如,頁面是 4K 還是 8K)等等。 盡管如此,這至少是發生的事情的核心的一般概念(並且它仍然處於足夠高的水平,可以大致同等地應用於 ARM、x86、MIPS、SPARC 等)

簡而言之,它是一種保存比地址空間通常允許的多得多的數據的方法。 即,如果您有 32 位地址空間和 4 位虛擬地址,則可以容納 (2^32)^(2^4) 個地址(遠遠超過 32 位地址空間)。

分頁是一種存儲機制,它允許操作系統以頁面的形式將進程從輔助存儲器檢索到主存儲器中。 在 Paging 方法中,主內存被划分為小的固定大小的物理內存塊,稱為幀。 幀的大小應與頁面的大小保持相同,以最大限度地利用主內存並避免外部碎片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM