【问题标题】:Accessing outside the memory allocated by the program. (Accessing other app's memory)访问程序分配的内存之外。 (访问其他应用程序的内存)
【发布时间】:2011-02-06 17:41:36
【问题描述】:

有没有一种方法可以访问(读取或释放)为程序分配的内存之外的内存块,而不会出现访问冲突异常。 好吧,除此之外,我真正想了解的是内存清理器(系统垃圾收集器)是如何工作的。我一直想写这样一个程序。 (语言不是问题)

提前致谢:)

【问题讨论】:

  • 语言是个问题。如果不告诉我们您所关心的操作系统和语言,就无法回答这个问题。

标签: memory garbage-collection memory-management access-violation


【解决方案1】:

实际上正确的答案是肯定的.. 有一些程序可以做到这一点(如果它们存在.. 这意味着它是可能的......) 也许你需要写一个内核驱动来完成这个,但这是可能的。

哦-我还有另一个例子...调试器附加命令...这是一个与另一个程序内存交互的程序,即使两者都作为不同的进程启动...。

当然 - 搞乱另一个程序内存..如果你不知道你在做什么可能会让它崩溃......

【讨论】:

  • @Dani:在调试器的情况下,你会发现它正在使用操作系统协助和高权限来访问其他地址空间。
  • 在某些情况下,调试器通过主机进程运行。宿主进程生成应用程序和调试器。由于主机拥有内存空间,因此它将其作为共享空间提供给应用程序和调试器,每个共享空间都能够按照它认为合适的方式操作内存(同样,这需要一个主机进程,这意味着应用程序不直接拥有该空间)
【解决方案2】:

简单的答案(我没记错),不。一般来说,这不是一个好主意,原因有两个。首先是因为它会导致您的程序和其他程序之间存在信任问题(更不用说我们人类也不会信任您的应用程序)。其次,如果您能够访问另一个应用程序的内存并在应用程序不知道的情况下进行更改,您将导致应用程序崩溃(病毒也会这样做)。

从运行时调用垃圾收集器。运行时“拥有”内存空间并允许其他应用程序“生活”在该内存空间中。这就是垃圾收集器可以存在的原因。您必须创建一个操作系统分配内存的运行时,让运行时在其权限下执行应用程序,并在其权限下使用 GC。您将需要允许一些工具或 API 允许应用程序开发人员从您的运行时(而不是操作系统)“请求”内存,并且您的运行时不仅可以响应此类请求,还可以跟踪它的内存空间分配给该应用程序。您可能需要一个框架(DLL 集),使这些调用可用于应用程序(开发人员将使用它们在其应用程序中形成请求)。

您必须确保您的垃圾收集器不会删除除正在执行的应用程序使用的内存之外的内存,因为您的运行时中可能同时运行 1 个以上的应用程序。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    没有。

    任何现代操作系统都会阻止一个进程访问属于另一个进程的内存。

    事实上,如果您了解虚拟内存,您就会明白这是不可能的。每个进程都有自己的虚拟地址空间。

    【讨论】:

    • ... true,除非您在运行时或 CLR 中运行。
    • @Philip:即使是运行时或 CLR 也无法访问另一个进程的地址空间;至少不是没有操作系统的帮助。一般而言,只有操作系统才能将属于另一个进程虚拟地址空间的物理地址映射到您的进程中。
    • 好吧,我不同意你的观点。虽然我可以说它确实需要运行时和操作系统之间的关系,但运行时通常代表应用程序请求内存空间。因为运行时是创建的调用者,所以它仍然与内存空间有联系,并且可以监视和控制它。 (通常与应用程序共享控制)但我也相信这取决于运行时本身。我从未处理过处理您解释方式的运行时,但仅仅因为我从未见过它们并不意味着它们不存在。
    • @Philip:我不相信虚拟内存的基础知识在我学习之后发生了变化。如果物理地址没有映射到进程的虚拟地址空间,则该进程无法访问它。一般来说,一个进程不能修改它自己的虚拟地址空间。只有操作系统才能做到这一点——而不是运行时。
    • 我想我被误解了。让我问这个,因为也许我的理解不正确。如果一个进程已向操作系统请求内存并且操作系统授予该进程它所请求的内存,并且该进程转身并启动另一个它是其父进程的进程,则子进程是否会自行从操作系统分配内存,或者父进程是否从操作系统已经给它的(父)自己的地址空间“给”子内存。据我了解,一个进程可以为子进程提供它自己的池中的育儿记忆。我错了吗?
    猜你喜欢
    • 2016-08-16
    • 2011-08-26
    • 2012-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2010-12-31
    • 2017-11-18
    • 2015-05-15
    相关资源
    最近更新 更多