链接地址2000 8000 7C00的意义;

逆向工程 linux
2021-06-30 11:29:12

你能解释一下链接地址 2000 8000 7C00 的意义吗?它位于 GRUB 配置脚本的 MACRO 中,用于检查 OBJCOPY 是否适用于绝对地址。

这是代码的片段:

AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
[AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
[cat > conftest.c <<\EOF
void
cmain (void)
{
   *((int *) 0x1000) = 2;
}
EOF

if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
else
  AC_MSG_ERROR([${CC-cc} cannot compile C source code])
fi
grub_cv_prog_objcopy_absolute=yes
for link_addr in 2000 8000 7C00; do
  if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then :
  else
    AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
  fi
  if AC_TRY_COMMAND([${OBJCOPY-objcopy} -O binary conftest.exec conftest]); then :
  else
    AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files])
  fi
  if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
    mv -f conftest conftest.old
  else
    grub_cv_prog_objcopy_absolute=no
    break
  fi
done
1个回答

摘自gnu.org - Hacking GRUB

GRUB 由两个不同的组件组成,称为阶段,它们在引导过程中的不同时间加载。因为它们是互斥的,所以有时一个内存区域会与另一个内存区域重叠。而且,即使在一个阶段,单个内存区域也可以用于各种目的,因为它们的用途是相互排斥的。

0x7C00 阶段 1 由 BIOS 或其他引导加载程序在此处加载

0x2000 可选的 Stage 1.5 在这里加载/多重引导内核和模块的命令行缓冲区

0x8000 Stage2 在这里加载