簡體   English   中英

什么是計算機科學中的分段和分頁?

[英]What is segmentation and paging in Computer Science?

我用Google搜索了很長時間,但我仍然不明白它是如何工作的,因為大多數解釋都是非常技術性的,沒有任何插圖可以讓它更清晰。 我的主要困惑是它與虛擬內存有什么不同?

我希望這個問題在這里有一個非常好的解釋,以便其他提出相同問題的人可以在谷歌時找到它。

我不得不承認,這兩個概念在開始時看起來很復雜和相似。 有時他們也會被混淆地教導。 我認為可以在osdev.org上找到一個很好的參考: Segmentation Paging

為了完成,我也試着在這里解釋一下,但我無法保證正確性,因為我已經開發了幾個月的操作系統。

在舊的16位天分段

分段是這兩個概念中較老的一個,在我看來,它更令人困惑。 分段工作 - 如名稱所示 - 分段 段是特定大小的連續內存塊。 要訪問每個段內的內存,我們需要一個偏移量 這使得總共有兩個地址組件,實際上存儲在兩個寄存器中。 分割的一個想法是擴大僅具有16位寄存器的存儲器。 另一種是某種保護,但不像尋呼那樣復雜。

因為我們現在使用兩個寄存器來訪問內存,所以我們可以將內存分成塊 - 如上所述,即所謂的段。 考慮1MB(2 ^ 20)的內存。 這可以分成每個16字節的65536(2 ^ 16,因為16位寄存器)段。 當然,我們還有16位寄存器用於偏移。 用16位尋址16個字節是沒用的,所以決定段可以重疊(我認為當時還有性能和編程原因)。

以下公式用於通過分段訪問1MB內存:

Physical address = (A * 0x10) + B

這意味着該段將是偏移量的16倍。 這也意味着可以通過多種方式訪問​​地址0x0100,例如,通過A = 0x010和B = 0x0,還可以通過A = 0x0和B = 0x0100。

這是舊的16bit天的細分。

如果你看一下匯編程序或自己嘗試一些東西,你會發現它們甚至在匯編程序中都有所謂的寄存器:CS和DS(代碼段和數據段)。

分段為32bit天

后來引入了一個所謂的全局描述表 (GDT)。 這是一個全局表(在RAM中的特定位置),其中給出了段號和內存地址以及每個段的其他幾個選項。 這使我們更接近分頁的概念,但它仍然不一樣。

所以現在程序員自己可以決定段應該從哪里開始。 一個新的概念也是在GDT中可以決定一個細分應該有多長。 因此,不是每個段必須是64kB長(2 ^ 16,因為16位寄存器),但是限制可以由程序員定義。 您可以有重疊的段或純粹的分隔段。

當現在訪問A:B時(仍然有兩個寄存器用於訪問存儲器),A將是GDT中的條目。 因此,我們將在GDT中查找第A個條目,並查看該段開始的內存位置以及它的大小。 然后我們檢查B(偏移)是否在允許的內存區域內。

分頁

現在,分頁與新的分段方法沒有太大差別,但在分頁時,每個頁面都有固定的大小。 因此限制不再可編程,每頁都有(當前)4kb。 此外,與分段不同,邏輯地址空間可以是連續的,而物理地址不是連續的。

分頁還使用表來查找內容,您仍然將邏輯地址拆分為多個部分。 第一部分是頁表中的條目號,第二部分是偏移量。 但是,現在偏移量具有12位的固定長度以訪問4kb。 您還可以擁有兩個以上的部分,然后將使用多個頁面表。 兩級頁表很常見,對於64位系統,我認為甚至三級頁表也很常見。

結尾

我希望我能夠至少解釋一下,但我認為我的出版也令人困惑。 最好的辦法是深入研究內核編程,並嘗試在啟動操作系統時實現最基本的東西。 然后你會發現一切,因為由於向后兼容性,一切仍然在我們的現代PC上。

我指示你

http://en.wikipedia.org/wiki/Virtual_memory

http://en.wikipedia.org/wiki/Segmented_memory

細分已經開始消亡。 我懷疑未來的分頁也會如此。

編輯:讓我補充說明

分段和分頁是內存管理的兩種不同方式,但它們通常做兩件事。 存在過度簡化的風險:

  1. 分段允許進程訪問比自然指針大小允許的更多內存。

  2. 分頁允許進程訪問比系統物理支持更多的內存。

段:

PDP-11是一個16位系統。 這允許尋址64K的內存。 晚期的PDP-11系統擁有更多的內存。 進程可以將不同的物理內存段映射到64K。 一個進程只能訪問64K的內存,但它可以改變它在64K內可以訪問的內存。

8086和后繼者將細分市場帶入了高雅藝術。 使用更復雜的基本寄存器系統,進程可以訪問更大的內存區域。

分頁:是一個系統,其中進程看到連續(或相對如此)的內存地址范圍被分成頁面。 例如,VAX處理器具有32位地址(理論上允許訪問4GB內存),而計算機通常具有8,16 32MB內存。 進程可以訪問比系統實際擁有的內存(加上多個進程)。

這些系統為進程(虛擬內存)提供了連續的內存范圍,分為頁面(大約512-2048字節),由一組表定義並映射到磁盤存儲。 如果進程訪問了不在內存中的頁面,則會觸發硬件異常。 操作系統將攔截該異常,分配新的物理內存頁,並從磁盤加載內存然后重新啟動該指令。

如果操作系統需要更多內存來處理這些請求,它將分頁出已經加載的內存。 如果數據是只讀的,通常這將從可執行映像加載,而不必分頁。 頁面可能只是標記為無效。 如果它是讀/寫內存,則頁面將被寫入頁面文件以便存儲,直到再次需要為止。

32位英特爾芯片引入了一個奇怪的系統,結合了分段和分頁。 細分用於數據保護。 64位處理器模式可以消除這種情況。

暫無
暫無

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

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