簡體   English   中英

如何在虛擬內存 - Linux 中查看每個進程維護的頁表?

[英]How can I see a page-table maintained by each process in Virtual Memory - Linux?

在虛擬內存概念中 - 每個進程維護自己的頁表。 該頁表將虛擬地址映射到內核虛擬地址。 該內核虛擬地址將地址轉換為物理 RAM。 我知道有一個內核虛擬地址 - vm area 結構。 這個 vm area 結構體最終將這個地址映射到物理地址。 當我執行 cat /proc//maps 時 - 我看到了虛擬地址到物理地址的直接映射。 因為它將地址映射到文件 - 使用 inode。 因此,它看起來是硬盤上的地址、文件描述符、主要次要編號。 RAM上有幾個地址。 所以,我可以說我看不到虛擬地址映射到內核虛擬地址的表。 我想看看那張桌子。 我怎么能看到呢? 它不應該在內核空間中。 因為當進程訪問時讓我們說內存 - 0x1681010 那么這應該被轉換為內核虛擬內存地址。 最后,這個地址應該被轉換成物理內存地址。

不, Linux 內核維護進程頁表(但不維護進程本身)。 進程只能通過它們的地址空間看到虛擬內存 進程使用一些系統調用,例如mmap(2)execve(2) ,來改變它們的地址空間。

物理地址和頁表以及處理和管理MMU是內核的業務,它實際上為用戶應用程序提供了一些“抽象機器”(具有虛擬地址空間、系統調用作為原子基本操作等)。 應用程序看不到原始 (x86) 硬件,而只能看到內核給出的用戶模式 一些硬件資源和指令對他們來說是不可用的(他們只能在用戶空間運行)。

頁表由內核管理,實際上不同的進程可能使用不同的——有時是相同的——頁表。 (因此由內核管理的上下文切換可能需要重新配置 MMU)。 你不在乎,(用戶進程看不到頁表)內核會管理它們。

不, /proc/self/maps不顯示任何有關物理地址的信息,只顯示虛擬地址。 內核可以隨時將進程從一個內核移動到另一個內核,將頁面從一個物理(非虛擬)地址移動到另一個,等等……; 應用程序通常看不到這一點(他們可能會使用mincore(2)getcpu(2)proc(5) ...

應用程序不應該關心物理內存或中斷,如頁面錯誤(只有內核關心這些;有時通過發送信號)。

虛擬地址到物理地址的轉換發生在 MMU 中。 通常,它是成功的(可能是透明地訪問頁表),處理器在總線上將轉換后的物理地址(對應於用戶模式機器指令處理的某個虛擬地址)發送到 RAM 中。 當 MMU 無法處理它時,會發生頁面錯誤,由內核處理(可以交換某些頁面、發送SIGSEGV 、執行上下文切換等...)

另請參閱處理器體系結構指令集頁表分頁翻譯后備緩沖區緩存x86x86-64維基頁面(並遵循我給您的所有鏈接)。

暫無
暫無

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

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