我最近得到了一个有缺陷的RAM,尽管已经找到了this我想尝试一个更容易的概念 - 编写一个程序来分配错误的RAM区域并永远不会释放它们。如果在程序运行之前分配它们可能不会很好,但是在失败时重新启动比使用补丁构建内核要容易得多。
所以问题是:
答案 0 :(得分:2)
这会有问题。要了解原因,您必须了解物理和虚拟内存之间的关系。
在任何现代操作系统中,程序将为自己获得一个非常大的地址空间,其余的地址空间用于操作系统本身。其他程序根本不可见:没有找到它们的地址。这怎么可能?简单:进程使用虚拟地址。虚拟地址不直接对应物理RAM。相反,有一个由操作系统管理的地址转换表。当您的进程运行时,该表仅包含分配给您的RAM的映射。
现在,这意味着操作系统决定为您的程序分配的物理RAM。它可以(并且将会)在runtimke上改变它。例如,使用相同的机制实现交换。换出时,会将一页RAM写入磁盘,并从转换表中删除其映射。当您尝试使用虚拟地址时,操作系统会检测缺少的映射,将页面从磁盘还原到RAM,然后放回映射。您不可能返回相同的物理RAM页面,但虚拟地址在整个换出/交换期间不会改变。所以,即使您碰巧分配了一页坏内存,也无法保留它。程序没有RAM,它们拥有一个虚拟地址空间。
现在,Linux确实提供了一些特定的内核函数,它们以稍微不同的方式分配内存,但似乎你想完全绕过内核。您可以在http://lwn.net/images/pdf/LDD3/ch08.pdf
中找到更详细的说明答案 1 :(得分:1)
查看BadRAM:它似乎完全符合您的要求。
答案 2 :(得分:0)
嗯,这不是关于如何编写程序的答案,但它修复了编译内核的问题:
使用memmap或mem参数: http://gquigs.blogspot.com/2009/01/bad-memory-howto.html
我将在运行时编辑此答案并提供详细信息。
答案 3 :(得分:0)
事情就是编写自己的内核模块,它可以分配物理地址。并使用mlock(2)进行noswap。 我从未尝试过。没有保修。