我正在学习linux-3.9.9内存检测代码。我看不懂代码:
} else if (oreg.ax == 15*1024) {
boot_params.alt_mem_k = (oreg.bx << 6) + oreg.ax;
Q1为什么只有在满足条件(oreg.ax == 15*1024)
时,内存大小才存储到 * Boot _params.alt_mem_k*?
} else {
boot_params.alt_mem_k = oreg.ax;
}
问题2为什么在else
条件下忽略16 MB以上的内存?
虽然有评论解释了原因,但我对此无法理解,因为我找不到任何有关“记忆洞”的信息。
这个函数位于〈linux-3.9.9/arch/x86/boot/memory. c〉中。
整个源代码如下:
static int detect_memory_e801(void)
{
struct biosregs ireg, oreg;
initregs(&ireg);
ireg.ax = 0xe801;
intcall(0x15, &ireg, &oreg);
if (oreg.eflags & X86_EFLAGS_CF)
return -1;
/* Do we really need to do this? */
if (oreg.cx || oreg.dx) {
oreg.ax = oreg.cx;
oreg.bx = oreg.dx;
}
if (oreg.ax > 15*1024) {
return -1; /* Bogus! */
} else if (oreg.ax == 15*1024) {
boot_params.alt_mem_k = (oreg.bx << 6) + oreg.ax;
} else {
/*
* This ignores memory above 16MB if we have a memory
* hole there. If someone actually finds a machine
* with a memory hole at 16MB and no support for
* 0E820h they should probably generate a fake e820
* map.
*/
boot_params.alt_mem_k = oreg.ax;
}
return 0;
}
1条答案
按热度按时间eivgtgni1#
我们的想法是,如果
ax < 15k
,那么你要么有〈16 MB的内存,在这种情况下bx
应该是零,可以忽略;要么你有〉16 MB的内存,但有一个洞开始低于16 MB,结束于16 MB以上的某处。该漏洞的大小无法确定,在这种情况下,安全的选择是忽略16 MB以上的内存,因为它不连续。