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)
你不能做这样的探测.
首先,你已经发现的记忆不一定是连续的.它几乎从来都不是.640k的漏洞是出于传统原因,但在内存中更进一步的分裂.您必须向固件询问内存布局.
其次,一些存储库可能被双重映射到物理空间,如果你开始使用它们,你最终会遇到麻烦.这不是很常见,但处理它真的很痛苦.
第三,也许最重要的是,有一些设备映射到该空间.通过写入随机地址,您可能会写入重要硬件的寄存器.写回你读的任何内容对你都不好,因为一些硬件寄存器一旦你写它们就有副作用.事实上,一些硬件寄存器在您阅读时会产生副作用.某些硬件不一定受到保护,您可能会造成永久性损坏.我过去通过在1:1映射内核中存在指针错误而使以太网硬件变硬,因为EEPROM /闪存没有受到保护.您写入的其他位置实际上可能会更改内存本身的布局.
因为你最有可能在i386上读到这个:http://wiki.osdev.org/Detecting_Memory_(x86 )
另外,请考虑使用为您检测内存的引导加载程序,并在定义良好的API中传达您需要知道的内容和其他重要信息.对于所有奇怪的硬件变体,可以更好地调试引导加载程序.