0

我正在摆弄创建自己的引导加载程序(MBR)。这是我更好地了解操作系统的第一步。

我的配置是:

MacBook Air、OsX 10.8.4、Parallels Desktop、Xcode、XCode 命令行工具、Nasm、LD、gcc、...

我编写了一个引导加载程序:

;
;  FpLoader.s
;  

                bits    16                  ; 16-bit Real Mode
                org     0x7c00              ; Set origin to BIOS boot origin


;
; Bootloader entry-code
;
Main:           cli                         ; Enable interrupts
                mov     ax, cs              ; Setup stack segments
                mov     ds, ax
                mov     es, ax
                mov     ss, ax
                sti                         ; Enable interrupts

                mov     si, Message_1       ; Print string
                call PrintLn

                mov     si, Message_2       ; Print string
                call PrintLn

                call PrintCrLf
                call PrintCrLf

                call Reboot


;
; Read keypress
;
ReadKeypress:
                mov     ah, 0               ; BIOS function - Wait for and read keyboard
                int     0x16                ; Call BIOS Keyboard Service

                ret                         ; Return from procedure


;
; PrintLn string
;
PrintLn:
                lodsb                       ; Load [Si] in Al and increment Si

                or      al, al              ; Check if end of string reached (Al == 0)
                jz      .PrintLnEnd

                mov     ah, 0x0e            ; BIOS function - Print character on screen
                int     0x10                ; Call BIOS Screen Service

                jmp     PrintLn             ; Loop
.PrintLnEnd     call PrintCrLf


;
; Print Cr/Lf
PrintCrLf:      mov     ah, 0x0E            ; BIOS function - Print character on screen

                mov     al, 0x0D            ; Character to print: Cr
                int     0x10                ; Call BIOS Screen Service

                mov     al, 0x0A            ; Character to print: Lf
                int     0x10                ; Call BIOS Screen Service

                ret                         ; Return from procedure


;
; Reboot the machine
;
Reboot:         mov     si, AnyKey          ; Print string
                call PrintLn
                call ReadKeypress

                db      0x0ea               ; Sends us to the end of the memory causing reboot
                dw      0x0000
                dw      0xffff 


;
; Data
;
                ; Program data
Message_1       db "Hello World...", 0x0
Message_2       db "Painted Black bootloader.", 0x0
AnyKey          db "Press any key to reboot...", 0x0

                ; Filler bytes
                times 510 - ($-$$) db 0

                ; Trailer bytes
                dw 0xAA55                   ;Boot signature

我正在组装这段代码:

nasm -f bin FpLoader.s -o FpLoader.img
sudo dd if=FpLoader.img of=FpLoader.iso bs=2k

当我尝试从 FpLoader.iso 启动 Parallels 虚拟机时,它拒绝启动,告诉我它无法从 iso 启动(在 Parallels 配置中配置为 CD)。

由于我对该主题完全陌生,并且对如何继续使用我可用的工具感到困惑,因此我将不胜感激您能给我的任何帮助。

我已经找到了一些适用于 Linux、Bochs 的部分解决方案……但没有什么能真正为我指明正确的方向。

我对 Iso 文件并不严格。如果有人可以向我展示一种使用 img 文件、真正的可启动 USB(在 Parallels 虚拟机中)或其他一些解决方案(与我的配置兼容)来测试我的开发的方法,那也很好。

在此先感谢和亲切的问候, PB

4

1 回答 1

1

为了更广泛地了解我找到的解决方案(仅使用 Mac OSx 和 Parallels Desktop)

引导加载程序,虽然源代码 (FpLoader.s) 可能更优雅一些(保留堆栈区域,设置 sp,...),但还可以。编译可以通过:

   nasm -f bin FpLoader.s -o FpLoader.bin

这应该会给你一个 512 字节的二进制文件。

使用时(最终使用 sudo)

   dd if=FpLoader.bin of=FpLoader.iso bs=2k

创建一个 512 字节的 iso 文件。此 iso 不包含第二个,也不包含以下“磁盘”扇区。我认为 Parallels Desktop 验证会检查这一点并阻止使用此类 iso 文件。

因此,我们需要另一种解决方案:创建一个完整的空磁盘(在本例中为软盘),在其上写入二进制文件的内容(在第一个扇区中)。

这可以按如下方式完成:

dd if=/dev/zero of=FpLoader.img bs=1024 count=1440

diskutil eraseVolume MS-DOS FPLOADER `hdiutil attach -nomount FpLoader.img`

dd if=FpLoader.bin of=FpLoader.img bs=1 count=512 conv=notrunc"

第一个命令填充 1.4 Mb 的空软盘映像,第二个命令用我们的引导加载程序覆盖第一个扇区。

在 Parallels Desktop 中,您可以使用很少的资源创建类似 Ms-Dos 的虚拟机:

   Memory: 4 Mb
   Hard disk: 2 Gb
   Devices: Hard disk and Floppy disk (even Cd drive can be removed)

为了安全起见,可以将虚拟机与 Mac 隔离(在安全设置中)。我有以下三个步骤的打印屏幕,但由于我的声誉仍然很低,我无法发布它们。对此感到抱歉

FpLoader.img 可以连接到软盘驱动器。

最后,可以调整引导设置,以免浪费时间扫描硬盘以查找引导扇区。

如果您想使用 Mac 和 Parallels 开发操作系统,我希望此描述能够提供足够的信息来帮助您入门。

亲切的问候,PB

于 2013-08-31T19:54:55.817 回答