ubuntu qemu/kvm试玩helloos


最近在翻日本人川合秀实的30天自制操作系统,看起来自己写一个不是很难,难在动手,工具的使用,还要了解ibm x86兼容机架构的种种规则。里面用到的虚拟机软件是qemu(我读ki:mu:)。


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指令是:



很棒!

qemu有一个图形化管理界面,virt-manager,没有了解。


相关内容