有没有办法转储所有的物理内存值?

时间:2011-02-07 07:46:04

标签: c memory assembly

据我所知,每个用户进程都有一个虚拟地址空间,可以转储。但有没有办法转储物理地址空间?假设我有32位系统和4GB内存,我可以编写一个程序来打印每个物理内存位置。

我理解它违反了内存保护等但是如果可能的话怎样才能将它转换为内核进程或更低级别的进程以允许我访问整个内存..?

我想知道如何在Windows / Linux平台(或内核)上编写这样的代码(如果可能的话)。或者如果我要使用Assembly或类似的东西,如何转移到该权限级别

5 个答案:

答案 0 :(得分:2)

在Linux中,您可以打开并映射设备文件/dev/mem(如果您具有读取权限)。这对应于物理内存。

答案 1 :(得分:0)

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

我认为没有操作系统可以让用户访问物理内存位置。所以,你不能。您所看到的是操作系统生成的虚拟地址。

答案 2 :(得分:0)

在Windows上,可以直接访问物理内存。你可以做的一些事情:

  • 使用Device \ PhysicalMemory对象 - 您无法访问所有物理内存,并且从Windows Server 2003 SP1开始限制对用户模式的访问。
  • 使用地址窗口化扩展 - 您可以控制自己的虚拟到物理地址映射,因此从某种意义上说,您是直接访问物理内存,但仍然通过页表。
  • 编写内核模式驱动程序 - 有内核模式API直接访问物理内存,分配物理内存页等。其中一个原因是DMA(直接内存访问)。

这些方法都不会为您提供对任何物理内存位置的轻松,不受限制的访问权限。 如果我可能会问,你想要完成什么?

答案 3 :(得分:0)

我认为你可以用kernel mode driver做到这一点,但结果将是乱码,因为当你抓住它时RAM的用户部分中的内容将是操作系统分页的内容,它可能是一个应用程序的一部分或整个群体的混合。之前的SO问题也可能有所帮助:How does a Windows Kernel mode Driver, access paged memory ?

答案 4 :(得分:0)