为什么我的内存检查代码不能正常工作

joe*_*ejo 1 c memory operating-system memory-management

我正在尝试实现简单的操作系统,现在必须实现内存管理.

首先,我们输入简单的代码来检查内存大小,如下所示.

我遇到的问题是这个函数的结果取决于增量大小.

如果我将增量​​设置为1024,则此函数返回640Kb.
但是,如果我将增量​​设置为1024*1024,则此功能返回120Mb.
(我的系统(bochs)的内存设置为120MB.)

我检查了优化选项和A20门.

有谁知道为什么我的功能不能正常工作?

unsigned int memtest_sub(unsigned int start, unsigned int end)
{
    unsigned int    i;  
    unsigned int*   ptr;
    unsigned int    orgValue;   
    const unsigned int  testValue = 0xbfbfbfbf;

    for (i = start; i <= end; i += 1024*1024) {
        ptr = (unsigned int*) i;
        orgValue = *ptr;
        *ptr = testValue;
        if (*ptr != testValue) {
            break;
        }   
        *ptr = orgValue;
    }   
    return i;
}
Run Code Online (Sandbox Code Playgroud)

Art*_*Art 5

你不能做这样的探测.

首先,你已经发现的记忆不一定是连续的.它几乎从来都不是.640k的漏洞是出于传统原因,但在内存中更进一步的分裂.您必须向固件询问内存布局.

其次,一些存储库可能被双重映射到物理空间,如果你开始使用它们,你最终会遇到麻烦.这不是很常见,但处理它真的很痛苦.

第三,也许最重要的是,有一些设备映射到该空间.通过写入随机地址,您可能会写入重要硬件的寄存器.写回你读的任何内容对你都不好,因为一些硬件寄存器一旦你写它们就有副作用.事实上,一些硬件寄存器在您阅读时会产生副作用.某些硬件不一定受到保护,您可能会造成永久性损坏.我过去通过在1:1映射内核中存在指针错误而使以太网硬件变硬,因为EEPROM /闪存没有受到保护.您写入的其他位置实际上可能会更改内存本身的布局.

因为你最有可能在i386上读到这个:http://wiki.osdev.org/Detecting_Memory_(x86 )

另外,请考虑使用为您检测内存的引导加载程序,并在定义良好的API中传达您需要知道的内容和其他重要信息.对于所有奇怪的硬件变体,可以更好地调试引导加载程序.