最近在翻日本人川合秀实的30天自制操作系统,看起来自己写一个不是很难,难在动手,工具的使用,还要了解ibm x86兼容机架构的种种规则。里面用到的虚拟机软件是qemu(我读ki:mu:)。
git clone git://git.qemu-project.org/qemu.git
cd qemu/./configure
提示需要安装glib2,先安装:
sudo apt-get install libglib2.0-dev
还要安装pixman,dtc,:
sudo apt-get install libpixman-1-dev
git submodule update --init dtc
cd dtc
git fetch origin # 不更新最新代码,会报一个奇怪的错误。
git rebase origin/master
make
这样可以编译了,终于:
cd ..
make # 大概编译了有半个小时
sudo make install
也可以直接sudo apt-get install qemu。
这样编译之后跑linux-0.2(http://wiki.qemu.org/download/linux-0.2.img.bz2),总是提示起了vnc server,却没有其他任何反应,搜了一下是没有安装libsdl-dev,
sudo apt-get install libsdl-dev
这样跑linux-0.2时就没有提示vnc了,弹出一个窗口。
可是搞好这一切,就一直只是一个blank sdl screen,bios和操作系统死活不出来。找了很久,发现直接用kvm命令(sudo apt-get install qemu-kvm,CPU本身支持虚拟化,内核自带kvm module),代替qemu-system-i386跑就可以了(从后来的结果看直接跑qemu也是可以的,不过非常非常非常慢!!),看来qemu wiki并不完整。
kvm linux-0.2.img
看到sea bios界面,然后进入了llinux 0.2命令行界面,ls,sleep都可以,good,再试试freedos
安装:
wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/fdbasecd.iso
kvm-img create -f raw freedos.img 100M
kvm -localtime freedos.img -cdrom fdbasecd.iso -boot d # 从cdrom启动安装freedos,其中需要reboot
kvm -localtime freedos.img # 安装完成,直接启动!
可见kvm现在可以工作了,现在来跑我们的helloos吧,它实际上只是FAT12文件系统的启动扇区(ipl, initial program loader),占512字节:
; hello-os
; 启动区信息
ORG 0x7c00
start: JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区名称
DW 512 ; 每个扇区的大小
DB 1 ; 簇的大小(1个扇区)
DW 1 ; FAT的起始位置
DB 2 ; FAT的个数
DW 224 ; 根目录的大小
DW 2880 ; 该磁盘的大小
DB 0xf0 ; 磁盘的种类
DW 9 ; FAT的长度(必须是9扇区)
DW 18 ; 1个磁道有几个扇区
DW 2 ; 磁头数
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明,固定
DB 0xffffffff ; 可能是卷标号码
DB "HELLO-OS " ; 磁盘的名称(11字节)
DB "FAT12 " ; 磁盘的格式名称
RESB 18 ; 先空出18字节
; 程序核心
entry:
MOV AX, 0
MOV SS, AX
MOV SP, 0x7c00
MOV DS, AX
MOV ES, AX
MOV SI, msg
putloop:
MOV AL, [SI]
ADD SI, 1 ; 给SI加1
CMP AL, 0
JE fin
MOV AH, 0x0e ; 显示一个文字
MOV BX, 15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS
JMP putloop
fin:
HLT ; 让CPU停止,等待指令
JMP fin ; 无限循环
msg:
DB 0x0a,0x0a
DB "hello,world"
DB 0x0a
DB 0 ; 字符串结束
marker: RESB 0x01fe-(marker-start)
DB 0x55, 0xaa
保存为ipl.asm,之前最后一个RESB指令是:RESB 0x7dfe-$,但编译不过。
使用nasm编译:
nasm -f bin -o ipl.ima ipl.asm,
生成原始的二进制文件,文件刚好是512字节,可见ORG是伪指令,不编译成机器码。
直接启动kvm:
kvm -localtime -m 128 -fda ipl.ima
不需要额外的bios,默认使用sea bios。-fda表示指定软盘,而bios一般会首先从软盘启动。以下是启动之后的helloos截图:
很棒!
qemu有一个图形化管理界面,virt-manager,没有了解。