繁体   English   中英

为什么我的内存检查代码无法正常工作

[英]Why my memory check code didn't work well

我正在尝试实现简单的OS,现在必须实现内存管理。

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

我遇到的问题是此函数的结果取决于增量大小。

如果将增量设置为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;
}

您不能做那样的探测。

首先,您已经发现,内存不一定是连续的。 几乎从来没有。 640k处的漏洞是出于遗留原因,但通常会进一步拆分内存中的漏洞。 您必须向固件询问内存布局。

其次,某些存储库可能会被双重映射到物理空间中,如果您开始使用它们,最终会遇到麻烦。 这不是很常见,但是处理起来确实很痛苦。

第三,也是最重要的一点是,有一些设备映射到该空间。 通过写入随机地址,您可能正在写入重要硬件的寄存器。 写回所读取的内容对您没有好处,因为有些硬件寄存器在您写入后会立即产生副作用。 实际上,某些硬件寄存器在读取时会产生副作用。 其中某些硬件不一定受保护,您可能会遭受永久性损害。 过去,由于EEPROM /闪存未受保护,在1:1映射的内核中出现了指针错误,从而使以太网硬件变得更加笨拙。 您写到的其他地方实际上可能会更改内存本身的布局。

由于您最有可能在i386上阅读以下内容: http ://wiki.osdev.org/Detecting_Memory_(x86

另外,考虑使用引导加载程序,该加载程序可以为您检测内存,并在定义良好的API中传达您需要了解的其他重要信息。 对于所有奇怪的硬件变体,引导加载程序都经过了更好的调试。

以下任务是越野车:

    ptr = (unsigned int*) i;
    orgValue = *ptr;
    *ptr = testValue; 

ptr没有指向任何有效的内存,您不能将i的值视为可以执行某些读写操作的地址-未定义的行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM