Запуск виртуальной машины 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