
到Bochs的主页: 上下载最新的Bochs RPM安装包。 以root的身份安装:
#rpm -ivh bochs-2.2.1-1.i586.rpm
其实RPM安装包给你装上了四个新程序:bochs,bochs-dlx,bximage,bxcommit, 以及相关文档。安装完毕后,你可以先试试bochs-dlx,它是DLX Linux的一个demo。
$ bochs-dlx
---------------------------------------------------------------
DLX Linux Demo, for Bochs x86 Emulator
---------------------------------------------------------------
Checking for bochs binary...ok
Checking for DLX linux directory...ok
Checking for /usr/bin/gzip...ok
Checking for /home/wangcong/.bochsdlx directory...ok
Entering /home/wangcong/.bochsdlx
Running bochs
00000000000i[APIC?] local apic in initializing
========================================================================
Bochs x86 Emulator 2.2.1
Build from CVS snapshot on July 8, 2005
========================================================================
00000000000i[ ] LTDL_LIBRARY_PATH not set. using compile time default '/usr/lib/bochs/plugins'
00000000000i[ ] BXSHARE not set. using compile time default '/usr/share/bochs'
00000000000i[ ] reading configuration from bochsrc.txt
00000000000i[ ] lt_dlhandle is 0x8bac490
00000000000i[PLGIN] loaded plugin libbx_x.la
00000000000i[ ] installing x module as the Bochs GUI
00000000000i[ ] using log file bochsout.txt
马上,你就会看到一个X11窗口。
显示的是VGA BIOS信息,然后是加载Linux的信息。以root身份登录,试试DLX Linux。安装成功。
使用
下面是一些重要的文件:
/usr/bin/bochs
Bochs启动程序
/usr/bin/bximage
Bochs带的制作磁盘镜像文件的工具
/usr/bin/bxcommit
把redolog放进flat磁盘镜像文件中去的交互工具
/usr/share/doc/bochs/bochsrc-sample.txt
Bochs配置文件的例子
/usr/share/bochs/BIOS-bochs-*
ROM BIOS镜像文件
/usr/share/bochs/VGABIOS-*
与VGA BIOS镜像文件相关的文件
/usr/bin/bochs-dlx
启动Bochs中DLX linux的程序
/usr/share/bochs/dlxlinux/
DLX Linux的目录,包含它的磁盘镜像文件和配置文件
/usr/share/bochs/keymaps/*.map
X11和SDL的keymap列表
命令bohcs可以接受4个参数:-q 加载配置文件后跳过开始菜单;-f configfile 识别指定的配制文件;-n
不加载配置文件;-h 打印帮助信息;-qf configfile
相当于同时使用-q和-f两个选项。使用Bochs,你必须有一个配置文件,或者你通
过-f参数指定,或者让Bochs自己搜索。配置文件的作用是告诉Bochs到哪里寻找镜像 文件,模拟层如何工作等。Bochs搜索配置文件的顺序是:
.bochsrc 在当前目录中</TT CLASS="FILENAME">
bochsrc 在当前目录中
bochsrc.txt 在当前目录中</TT CLASS="FILENAME">
.bochsrc 在用户的主目录中
bochsrc 在 /etc 目录中
以dlx-linux的配置文件为例,讲一下如何定制你需要的配置文件。dlx-linux的 配置文件是/usr/share/doc/bochs目录中的bochsrc-sample.txt。它的内容 如下:
###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
# what disk images will be used
floppya: 1_44=floppya.img, status=inserted
floppyb: 1_44=floppyb.img, status=inserted
# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
# choose the boot disk.
boot: c
# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx
#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
# where do we send log messages?
log: bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so
# in the DLX Linux example I'm enabling keyboard_mapping so that paste
# will work. Cut&Paste is currently implemented on win32 and X windows only.
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-fr.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-de.map
#keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-es.map
以#开头的每一行都是注释。注释写得很明白。
megs: 32
指明想要模拟32M的内存。注意:后面的数字最大为2048,但是因为主机系统的限制,在 大多数系统上,Bochs甚至不能支持1024M。
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
指明ROM的镜像文件在哪,开机时ROM BIOS被加载到哪里。$BXSHARE是环境变量,指明 Bochs的share目录,在Linux上为/usr/share/bochs。这一般不用改动。下面的vgaromimage 指明VGA ROM的镜像文件位置。
floppya: 1_44=floppya.img, status=inserted
floppyb: 1_44=floppyb.img, status=inserted
floppya是第一软驱,floppyb是第二软驱。后面标明的是软驱镜像文件的位置,软盘 是否插入。可以根据你的需要做适当的修改。
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
打
开ata0通道,另外还有ata1,ata2,ata3。对于每一个通道,都必须指明两个IO地址和IRQ。
ata0是默认被打开的,它的ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14。ata0-master
是主ata0通道,后面指明它附带的设备是硬盘,硬盘镜像文件路径,硬盘柱面数,磁头数等参数。
boot: c
指明启动次序,可以是cdrom,floppy,disk。不过由于历史的原因a和c也能被接受。 也可以这样来写:
boot: cdrom, floppy, disk
mouse: enabled=0
指明鼠标是否可见。
keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
打开对虚拟US键盘的重映射,keymap必须被指明。
更多的配置文件选项说明见/usr/share/doc/bochs/user/bochsrc.html。 如何编写键盘的keymap列表见/usr/share/doc/bochs/user/keymap.html。
制作磁盘镜像
bximage是Bochs自带的制作磁盘镜像的工具,具有 良好的交互性,使用很方便。运行bximage,你会看到:
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c,v 1.25.2.1 2005/07/06 20:40:00 vruppert Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd]
询问我们是建立一个软盘镜像还是硬盘镜像,默认的是硬盘。我们直接按回车,选择硬盘 镜像。
What kind of image should I create?
Please type flat, sparse or growing. [flat]
我们想建立一个简单的镜像,选择默认的flat。回车。
Enter the hard disk size in megabytes, between 1 and 32255
[10]
想要多少Mbyte的大小?键入你想要的大小。
I will create a 'flat' hard disk image with
cyl=2
heads=16
sectors per track=63
total sectors=2016
total size=0.98 megabytes
What should I name the image?
[c.img]
在上一步中输入“1”后,显示相关的硬盘信息。询问想要什么镜像文件名字?默认的是 c.img。输入hd.img回车。
Writing: [] Done.
I wrote 1032192 bytes to hd.img.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="hd.img", mode=flat, cylinders=2, heads=16, spt=63
建立完毕。然后你就可以使用这个镜像,用Bochs做实验了。
当然不能真正启动就panic了,但是单步调试和理解内核在x86平台启动已经够了。bochs下运行linux3.0内核(已验证)
1. 构造调试环境
由于bochs内建调试功能, 且支持gdb, 用它调试内核会很方便.
(文章中大部分命令的运行需要root权限,以sudo方式运行)
1.1 构建磁盘镜像
Shell代码
dd if=/dev/zero of=hd0.img
count=$((63*16*100))
用这个命令可以构建一个50MB左右的磁盘镜像, 输出结果如下:
100800+0 records in
100800+0 records out
51609600 bytes (52 MB) copied, 0.734578 s, 70.3
MB/s
注意count必须为63*16的倍数, 否则bochs识别硬盘会有问题.
1.2 挂载磁盘镜像
Shell代码
losetup /dev/loop0 hd0.img
这个命令可以将文件绑定到一个loop设备. 如果/dev/loop0不存在, 可以尝试 modprobe
loop.
然后进行设备初始化:
Shell代码
cfdisk -s63 -h16/dev/loop0
只创建一个主分区就可以. 写入后, 用命令fdisk检查结果:
Shell代码
fdisk -lu /dev/loop0
Disk /dev/loop0: 51 MB, 51609600 bytes
16 heads, 63 sectors/track, 100 cylinders, total 100800
sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/loop0p1 63 100799 50368+ 83 Linux
将分区1挂载到/dev/loop1.
Shell代码
losetup /dev/loop1 hd0.img -o
$((63*512))
格式化/dev/loop1为ext3格式.
Shell代码
mkfs.ext3 /dev/loop1
在mnt下创建img目录, 做以后维护用.
Shell代码
mkdir -p /mnt/img
将loop1挂载到/mnt/img
Shell代码
mount /dev/loop1 /mnt/img/
安装引导程序. 因为我狂热倾向于模块化架构, 所以选择GRUB2.
本文以grub-1.97~beta3为示例,
读者可自行安装其他的引导系统如lilo.
Shell代码
mkdir /mnt/img/boot
cp -r /usr/lib/grub/i386-pc/
/mnt/img/boot/grub
生成一个core.img, biosdisk负责读取磁盘, part_msdos负责处理MBR,
ext2负责读取ext3分区.
Shell代码
cd /mnt/img/boot/grub/
grub-mkimage -O i386-pc -o core.img biosdisk part_msdos
ext2
Shell代码
ls -lh core.img
-rw-r--r--1 root root 25K Sep2114:28
core.img
只有区区的25K.. 里面甚至还包含一个小的应急shell, 不过作用不大.
安装grub2到(hd0), 根目录在(hd0,1)
Shell代码
echo"(hd0) /dev/loop0" >
./device.map
grub-setup -m ./device.map -d /mnt/img/boot/grub/ -r
'(hd0,1)' '(hd0)'
检查一下安装成果:
Shell代码
hexdump -C /dev/loop0 | less
如果你能看到:
Shell代码
00000180 7d e8 2e00 cd18 eb
fe4752554220004765|}.......GRUB .Ge|
00000190 6f 6d004861726420446973 6b00526561|om.Hard
Disk.Rea|
就说明安装成功.
清理一下.
Shell代码
cd
umount /mnt/img
losetup -d /dev/loop1
losetup -d /dev/loop0
1.3 启动测试.
给上面的hd0.img配一个bochsrc文件, 可以拿bochs示例dlxlinux的配置文件来改,
只需将硬盘换为:
Shell代码
ata0-master: type=disk, path="hd0.img", cylinders=100,
heads=16, spt=63
然后启动Bochs, 顺利的话, 你能看到传说中的grub2 shell.
2. 从启动到保护模式.
为我们的bochs虚拟机编译一个内核. 不必太复杂,
目前我们只关心启动部分.
2.1 安装内核
退出bochs, 挂载hd0.img:
Shell代码
mount hd0.img /mnt/img/ -o
loop,offset=$((63*512))
拷贝bzImage.
Shell代码
cp /usr/src/linux/arch/i386/boot/bzImage
/mnt/img/boot/vmlinuz-3.0.00
这两个步骤可以放到内核的Makefile中, 以后每次编译完成后,
自动更新到hd0.img里.
然后将下列配置写到/mnt/img/boot/grub/grub.cfg
Shell代码
# Timeout for menu
set timeout=10
# Set default boot entry as Entry0
set default=0
# Entry0- Load Linux kernel
menuentry"Linux-3.0.00"{
set root=(hd0,1)
linux
/boot/vmlinuz-3.0.00root=/dev/hda1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)