Запуск виртуальной машины Parallels с собственным загрузчиком, записанным в файле Iso

Я возился с созданием собственного загрузчика (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

Когда я пытаюсь запустить виртуальную машину Parallels из FpLoader.iso, она отказывается запускаться, сообщая, что не может загрузиться с iso (настроенного как компакт-диск в конфигурации Parallels).

Поскольку я совершенно новичок в этой теме и озадачен тем, как поступить с имеющимися у меня инструментами, я был бы признателен за любую помощь, которую вы можете мне оказать.

Я нашел несколько частичных решений для Linux, Bochs, ... но на самом деле ничто не указывало мне правильное направление.

Я не жёстко отношусь к файлу Iso. Если кто-то может показать мне путь с помощью файла img, реального загрузочного USB (в виртуальной машине Parallels) или какого-либо другого решения (совместимого с моей конфигурацией) для тестирования моих разработок, это тоже будет хорошо.

Заранее спасибо и всего наилучшего, PB

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

ISO-файл 512 байт создается. Этот 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 Мб, вторая команда перезаписывает первый сектор нашим загрузчиком.

В Parallels Desktop One можно создать виртуальную машину, аналогичную 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

Другие вопросы по тегам