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