assembly 为什么E801h BIOS中断15h返回的内存大小在linux上被忽略?

bqf10yzr  于 2022-11-13  发布在  iOS
关注(0)|答案(1)|浏览(134)

我正在学习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;
}
eivgtgni

eivgtgni1#

我们的想法是,如果ax < 15k,那么你要么有〈16 MB的内存,在这种情况下bx应该是零,可以忽略;要么你有〉16 MB的内存,但有一个洞开始低于16 MB,结束于16 MB以上的某处。该漏洞的大小无法确定,在这种情况下,安全的选择是忽略16 MB以上的内存,因为它不连续。

相关问题