4

アセンブリで OS の一部を既に作成しましたが、GRUB を使用する代わりに、OS 用の独自のブートローダーも構築したいと考えています。アセンブリでテスト OS を開発していたとき、次のように起動したことを覚えています。

org 0x7c00
bits 16

; OS Kernel Here

times 510 - ($-$$) db 0
dw 0xAA55

これはもう知っています。これを使用して、フロッピーの 2 番目のセクターに書き込まれる *.bin ファイルとなる「実際の」OS を実行します。それから私は何かを知りたいです

  • アセンブリでブートローダーを実行して、フロッピーの 2 番目のセクターで開始されるものを実行するにはどうすればよいですか?
  • フロッピーの 2 番目のセクターに配置されるアセンブリ ソースに何かを追加する必要がありますか?
4

2 に答える 2

5

int 0x13必要な数のセクターをロードし、新しいコードを配置した場所にジャンプするために使用します。第 2 段階で行う必要があることは何もありませんがDS、コードをロードする場所に対して有効になるように設定する必要があります。

私の小さな OS アーカイブからの例:

  /* BIOS loads the sectors into es:bx */
  pushw    $STAGE1_WORKSEG
  popw     %es
  movw     $STAGE1_OFFSET, %bx

read_stage1:

  /* Try to read in a few sectors */
  movb     $0x2, %cl      /* Sector */
  movb     $0x0, %ch      /* Cylinder */
  movb     $0x0, %dh      /* Head */
  movb     $0x0, %dl      /* Drive */
  movb     $0x2, %ah      /* BIOS read function */

  /* How many sectors to load */
  movb     $STAGE1_SIZE, %al 
  int      $0x13
  jnc      read_stage1_done

  /* Reset drive */
  xorw     %ax, %ax
  int      $0x13
  jmp      read_stage1


read_stage1_done:

  /* Perform a long jump into stage1 */
  ljmp     $STAGE1_WORKSEG, $STAGE1_OFFSET

  call     halt

halt:
    /*
    * Function: halt
    * Synopsis: Sends the processor into a permanent halted status
    * Notes:
    *    The only way out of this is to manually reboot
    */
    hlt                     /* Halt the processor */
    jmp      halt

これは GAS 形式であるため、命令から NASM を使用しているように見えるため、オペランドの順序を逆にする必要がありますtimes。変数名は一目瞭然です。

趣味の OS を開発している場合http://forum.osdev.org/は、同じことをしている他の人からサポートを得るのに適した場所です。これは、stackoverflow よりも少し専門的であり、OS の多くは非常に難解です。

于 2010-01-23T01:10:02.033 に答える