2009年6月20日土曜日

copy_boot_params

今回はmain関数から最初に呼び出している「copy_boot_params」を見てみます。

====
static void copy_boot_params(void)
{
  struct old_cmdline {
   u16 cl_magic;
   u16 cl_offset;
  };
  const struct old_cmdline * const oldcmd =
   (const struct old_cmdline *)OLD_CL_ADDRESS;

  BUILD_BUG_ON(sizeof boot_params != 4096);
  /* ブートパラメータをコピーする */
  /* コピー元のhdrは「header.S」にて定義されているもの */
  memcpy(&boot_params.hdr, &hdr, sizeof hdr);

    /* 以下はカーネルバージョンが古いとき(2.02以前?)に通る処理 */
  if (!boot_params.hdr.cmd_line_ptr &&
     oldcmd->cl_magic == OLD_CL_MAGIC) {
  /* Old-style command line protocol. */
  u16 cmdline_seg;

   /* Figure out if the command line falls in the region
     of memory that an old kernel would have copied up
     to 0x90000... */
  if (oldcmd->cl_offset < boot_params.hdr.setup_move_size)
    cmdline_seg = ds();
   else
   cmdline_seg = 0x9000;

   boot_params.hdr.cmd_line_ptr =
   (cmdline_seg  << 4) + oldcmd->cl_offset;
  }
}

====

カーネルバージョンが新しければブートパラメータを「boot_params.hdr」へコピーしているだけです。
コピー元のhdrは先日見た「header.S」で定義しています。

====
.section ".header", "a"
.globl hdr
hdr:
setup_sects: .byte SETUPSECTS
root_flags: .word ROOT_RDONLY
syssize: .long SYSSIZE
ram_size: .word RAMDISK
vid_mode: .word SVGA_MODE
root_dev: .word ROOT_DEV
boot_flag: .word 0xAA55
====

各々の意味については下記のドキュメントが参考になります。
Linux JF (Japanese FAQ) Project.

0 件のコメント:

コメントを投稿