4

我已经在 Assembly 中完成了我的操作系统的一部分,但现在我也想为它构建一个自己的引导加载程序,而不是使用 GRUB。当我在 Assembly 中开发我的测试操作系统时,我记得我是这样引导它的:

org 0x7c00
bits 16

; OS Kernel Here

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

这个我已经知道了。现在我想使用它并执行“真正的”操作系统,它将是一个写入软盘第二扇区的 *.bin 文件。然后我想知道一些事情

  • 如何在 Assembly 中执行引导加载程序以执行将在软盘的第二个扇区开始的内容?
  • 我需要将任何东西添加到将放置在软盘第二扇区的程序集源中吗?
4

2 回答 2

5

您用于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 格式,因此您需要反转操作数顺序,因为看起来您正在使用times指令中的 NASM。变量名称应该是不言自明的。

如果您正在开发一个爱好操作系统,那么http://forum.osdev.org/这是获得其他人做同样事情的支持的好地方。它比 stackoverflow 更专业一些,而且很多操作系统的东西都非常深奥。

于 2010-01-23T01:10:02.033 回答
1

在 16 位模式下,您可以使用以下代码将内核从磁盘加载到内存中:

disk_load:
    push dx

    mov ah, 0x02
    mov al, dh
    mov ch, 0x00
    mov dh, 0x00
    mov cl, 0x02

    int 0x13

    jc disk_error

    pop dx
    cmp dh, al
    jne disk_error
    ret

disk_error:

    mov bx, DISK_ERROR_MSG
    call print_string
    jmp $

DISK_ERROR_MSG db "Disk read error !", 0

    load_kernel:
        mov bx, MSG_LOAD_KERNEL
        call print_string
        mov bx, KERNEL_OFFSET
        mov dh, 54
        mov dl, [BOOT_DRIVE]
        call disk_load
        ret
于 2020-01-31T16:37:00.000 回答