[英]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.