使用终端的Helloworld Bootloader over USB(非软盘,CD-ROM或仿真器)

时间:2017-02-09 13:22:55

标签: unix assembly bootloader usb-drive dd

我是引导程序的新手,我阅读了数十篇关于引导程序的文章,但似乎没有人在为我竞争。

他们都提到了传统的步骤:

  • umount
  • dd
  • sync

与提到的here

相同

首先让我告诉您,使用unetbootin,我尝试了TinyCore Linux并且效果很好。然后,除了isohybrid工具之外,我尝试使用dd工具将它从ISOLINUX转换为SYSLINUX,从终端运行它,它也可以。

接下来,我尝试使用汇编代码制作一个启动加载器,在屏幕上打印出“Hello world”。当然,我开始使用像MikeOS这样的工作。

我作为root所做的是以下内容:

  • 使用FAT32格式化闪存:mkdosfs -n 'USB-Drive-Name' -I /dev/sdb -F 32
  • 确保已卸载umount /dev/sdb*其中/dev/sdb是我的USB驱动器。
  • 汇总代码:nasm -f bin -o myfirst.bin myfirst.asm
  • 将其安装到USB的MBR中:dd if=myfirst.bin of=/dev/sdb bs=512
  • sync
  • 重新启动

注意到我没有安装任何内核,我期望在启动时获得“Hello world”,但我得到的是“No Operating System”。

我有什么遗漏的吗?

让我谈谈这个assembly code

;----------------------------------------------;
;
; A minimal bootloader that prints a hello world
; then halts.
;
; nasm -f bin hello-boot.asm -o hello-boot.bin
;
; @YouriAckx
;
;----------------------------------------------;

                org        0x7c00               ; BIOS loads at this address

                bits       16                   ; 16 bits real mode

; Print a welcome message.
; We have no DOS nor Linux kernel here.
; Therefore, we will use bios int 0x10.

start:
                cli                             ; disable interrupts

                mov     si, msg                 ; SI points to message
                mov     ah, 0x0e                ; print char service
.loop           lodsb                           ; AL <- [DS:SI] && SI++
                or      al, al                  ; end of string?
                jz      halt
                int     0x10                    ; print char
                jmp     .loop                   ; next char

halt:           hlt                             ; halt


msg:            db        "Hello, World!", 0


;----------------------------------------------;
; Bootloader signature must be located
; at bytes #511 and #512.
; Fill with 0 in between.
; $  = address of the current line
; $$ = address of the 1st instruction
;----------------------------------------------;

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

0 个答案:

没有答案