
我們知道,程式運行時,CPU 會產生邏輯位址,也稱為虛擬位址。然後,這些虛擬位址由記憶體管理單元 (MMU) 轉換為實體位址。我們知道虛擬記憶體也允許使用磁碟的某些部分(稱為頁面檔案(交換空間))作為記憶體。因此,虛擬位址指向記憶體(RAM)+頁面檔案(交換空間)中的某個空間。但是,程式如何從既不在記憶體中也不在頁面檔案中的磁碟加載,因為 CPU 產生虛擬位址,並且該虛擬位址始終指向記憶體(RAM)+頁面檔案(交換空間)中的某個位址。該地址叫什麼。最初我曾經認為邏輯位址/虛擬位址是指向硬碟中實體記憶體位置的位址。
我很困惑。謝謝您的幫忙。
答案1
不在記憶體中的頁面被標記為無效,然後任何訪問都會觸發作業系統上的頁面錯誤,作業系統將搜尋可以載入頁面的位置(頁面文件,映射文件......),載入頁面,更新頁面指標並重新調度頁面暫停的過程。
在 FreeBSD 上,有一個表,其中包含每個段(一組連續頁面)的實體位址及其分頁器屬性(分頁器物件、索引、檔案描述符...)。我猜Windows也有類似的系統。
答案2
然後,這些虛擬位址由記憶體管理單元 (MMU) 轉換為實體位址。
只有當進程的記憶體內容駐留或映射時,虛擬位址才能轉換為實體記憶體位址
。必須從後備儲存(例如頁面文件)中檢索。此內容檢索由核心使用儲存裝置(例如 HDD 或 SSD)的裝置驅動程式執行。同時,進程排程器將掛起目前進程,並(嘗試)啟用準備執行的進程來使用 CPU。
我們知道虛擬記憶體也允許使用磁碟的某些部分(稱為頁面檔案(交換空間))作為記憶體。因此,虛擬位址指向記憶體(RAM)+頁面檔案(交換空間)中的某個空間。
不正確。
虛擬位址(本身)沒有任何元件或對後備儲存的引用。
後備儲存的組織(例如頁面檔案)受作業系統核心(即軟體)的控制。
此外,虛擬記憶體的記憶體內容甚至可能不會保存在頁面檔案或交換區域中。
永不改變的程式碼不必被換出,並且可以從程式檔案中再次檢索。
記憶體映射檔案將直接訪問,而不是在頁面文件或交換區域中具有重複項。
因此,虛擬地址本身不足以提供識別其物理記憶體映射的信息,更不用說任何後備存儲信息了。
但是,程式如何從既不在記憶體中也不在頁面檔案中的磁碟加載,因為 CPU 產生虛擬位址,並且該虛擬位址始終指向記憶體(RAM)+頁面檔案(交換空間)中的某個位址。
程式(或任何檔案)可以使用檔案系統介面和底層區塊設備介面透過其檔案名稱進行存取。
來自周邊設備的資料使用輸入/輸出指令/操作而不是(主)記憶體存取來傳輸。
I/O 操作的概念因記憶體映射 I/O 的實現而變得模糊,其中使用記憶體空間中的特殊位址而不是 I/O(或連接埠)空間中的位址來存取裝置暫存器。
設備驅動程式是核心中的低階軟體,用於處理此類設備的讀寫操作的複雜性。
這些是基本的數位電腦體系結構概念,不適合以簡單的問答形式進行簡要解釋。
該地址叫什麼。
大容量儲存裝置(例如 HDD 和 SSD)(也稱為區塊裝置)使用 LBA(邏輯區塊位址)(也稱為磁區號)在裝置層級進行存取。每個 LBA 引用固定大小資料的邏輯區塊,通常為 512 位元組。
最初我曾經認為邏輯位址/虛擬位址是指向硬碟中實體記憶體位置的位址。
不正確。
大容量儲存裝置(例如 HDD 和 SSD)使用 LBA(邏輯區塊位址)在裝置層級進行存取。
在更高級別,檔案系統使用檔案系統分配單元的位址(例如簇號)來引用檔案的內容。檔案系統透過按檔案名稱和目錄引用檔案來提供組織。
在更高的層級上,磁碟區或磁碟機管理處理哪些分割區和檔案系統可以存取。
LBA 和虛擬記憶體位址之間沒有固定的關係或聯繫。
後備儲存的內容(例如頁面檔案)和虛擬記憶體之間的任何關係都將受到核心使用進程資訊和頁表等資訊的控制。
請注意,現代虛擬記憶體的大多數實作都使用固定大小的頁面,但也有其他可能的方案。