使用在Iso文件上编写的自己的引导加载程序启动Parallels虚拟机

时间:2013-08-31 10:12:23

标签: macos assembly iso bootloader parallels

我正在摆弄创建自己的引导加载程序(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

1 个答案:

答案 0 :(得分: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