Разработка загрузчика в сборке - PullRequest
3 голосов
/ 22 января 2010

Я уже выполнил часть своей ОС на ассемблере, но теперь я хочу создать для нее и собственный загрузчик вместо GRUB. Когда я разрабатывал свою тестовую ОС на ассемблере, я помню, что загружаю ее так:

org 0x7c00
bits 16

; OS Kernel Here

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

Это я уже знаю. Теперь я хочу использовать это и запустить «настоящую» ОС, которая будет * .bin-файлом, записанным во 2-й сектор дискеты. Тогда я хочу узнать кое-что

  • Как я могу сделать загрузчик в ассемблере для выполнения того, что будет запускаться на 2-м секторе дискеты?
  • Мне нужно добавить что-нибудь к источнику Assembly, который будет помещен во 2-й сектор дискеты?

1 Ответ

4 голосов
/ 23 января 2010

Вы используете int 0x13, чтобы загрузить необходимое количество секторов и перейти к месту, где вы разместили новый код. На втором этапе вам ничего не нужно делать, но вы должны убедиться, что вы установили значение DS как действительное для всех мест загрузки кода.

Пример из моего маленького архива ОС:

  /* 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. Имена переменных должны быть понятны.

Если вы разрабатываете ОС для хобби, тогда http://forum.osdev.org/ - хорошее место, чтобы получить поддержку от других, делающих то же самое. Он немного более специализирован, чем stackoverflow, и многие вещи ОС могут быть довольно эзотерическими.

...