2011-02-07 123 views
4

我知道每個用戶進程都有一個虛擬地址空間,並且可以被轉儲。但有沒有辦法轉儲物理地址空間?假設我有32位系統和4GB內存,我可以編寫一個程序來打印每個物理內存位置。有沒有辦法轉儲所有的物理內存值?

我知道它違反了內存保護等,但如果它可能如何將其轉換爲內核進程或更低級別的進程,讓我訪問整個內存..?

我想知道如何在Windows/Linux平臺(或內核)上編寫這樣的代碼(如果可能的話)。或者如果我要使用Assembly或類似的東西,如何切換到該特權水平。

+0

你也許可以(我個人從來沒有嘗試過),但它需要至少一些OS調用。用戶進程無權訪問物理內存。如果在代碼中沒有一種已知的方式來執行此操作,則可能會導致操作系統崩潰並以此方式獲取內存轉儲。 – 2011-02-07 07:52:07

回答

0

can i write a program to print each physical memory location.

我覺得沒有操作系統提供了物理內存位置的用戶訪問。所以,你不能。什麼,你看到的是由操作系統產生的虛擬地址。

0

在Windows上,可以直接訪問物理內存。您可以執行的一些操作:

  • 使用Device \ PhysicalMemory對象 - 無法訪問所有物理內存,並且從Windows Server 2003 SP1開始,用戶模式對其的訪問受到限制。
  • 使用地址窗口化擴展 - 您可以控制自己的虛擬到物理地址映射,因此從某種意義上說,您直接訪問物理內存,儘管仍然通過頁表。
  • 編寫內核模式驅動程序 - 有內核模式API來直接訪問物理內存,分配物理內存頁面等。其中一個原因是DMA(直接內存訪問)。

以上這些方法都不會讓您輕鬆訪問任何物理內存位置,也可以不受限制地訪問任何物理內存位置。 如果我可能會問,你想完成什麼?

2

在Linux中,您可以打開並映射設備文件/dev/mem(如果您有讀取權限)。這對應於物理內存。

相關問題