2017-06-16 49 views
0

我已閱讀here如下:內核如何訪問其他進程的內存?

內核可以訪問所有的內存

我想知道的是,怎麼做內核訪問其他進程的內存。

我幾乎可以肯定的是內核不能訪問物理內存,它只能訪問虛擬內存。

現在每個進程都有一個頁表,用於將虛擬地址轉換爲物理地址。並且由於內核可以訪問所有進程的所有頁表(頁表存在於內核空間中,我猜想),那麼如果內核想要訪問進程A的內存,則可以使用頁面表進程A和訪問進程A的內存通過此頁表。

我正確嗎?

+0

內核當然可以訪問物理內存,如果它想。但是你是如何訪問過程記憶是正確的。 – Barmar

+1

這不是一個真正的SO問題。 SO是針對你正在編寫的程序的問題,而不是關於操作系統的設計。 – Barmar

+0

@Barmar *「內核當然可以訪問物理內存,如果它想要」*我相信CPU不能訪問保護模式下的物理地址,所以爲了讓內核訪問物理內存,它必須切換CPU先保護模式,對嗎? – user247763

回答

2

在這種情況下,「其他過程」是什麼?

如果一個線程正在執行,並且出於某種原因進入內核並且內核想要讀取其內存,那麼它可以「只」在體系結構中執行此操作,其中用戶空間和內核空間都映射到一個巨大的地址空間。特別是x86上的情況。

通常情況下,內核不會訪問由切換到內核的線程所映射的內存映射的內存。

如果需要這樣的訪問,內核將「手動」走過相關的頁表。它發現需要什麼樣的物理頁面,並將其映射,以便它可以讀取。它肯定不會爲此目的切換頁面表。

作爲一個有趣的事實,由於x86-64上的地址空間與物理上可安裝的memroy相比非常龐大(256TB),因此整個物理內存總是被映射的。因此,在這個架構上,內核只是計算相關頁面在這個區域內的位置。

+0

*「它找到需要的物理頁面,並將其映射爲可以讀取」*您的意思是說,例如,如果**進程A **有分配的內存虛擬地址爲500到1000,並且內核想要訪問這些地址,那麼內核可以將**進程A **的'500到1000'的物理地址映射到例如虛擬地址'2000到2500'內核空間? – user247763

+0

你說得有點奇怪,所以我不知道你是否知道。在這裏它被重寫:覆蓋進程A的地址空間中的虛擬範圍500-1000的物理頁面可以映射到內核空間中的某處。 –

+0

是的,這是我的意思,我說他們將被映射到例如內核空間的虛擬地址'2000到2500'。你說*「物理頁面」*,你的意思是**物理地址**? – user247763