导航:首页 > 程序命令 > bochs命令

bochs命令

发布时间:2022-09-10 02:59:49

Ⅰ 如何使用bochs启动linux2.6.0版本内核

当然不能真正启动就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代码

hexmp -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

Ⅱ 为什么windows下的bochs2.3。6和bochs2.4.6都没有set_cpu和mp_cpu指令

解决方案有:
1、把内存拔下来插一次

2、清理一下IE缓存,怕有病毒隐藏在这里导致的

3、下载360系统急救箱 全盘扫描一次

4、用360卫士 修复系统---修复一下系统 清理插件---清理一下插件
清理垃圾---清理一下垃圾

5、开始--运行 输入CMD 在打开的命令提示符裏面输入(可以复制粘贴)

for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1 按下回车键

就可以看到很多文件的名字在刷新 一闪闪的 不闪了就可以关闭它 重启电脑

6、软件或者游戏的BUG 你可以重新安装一次它们或者升级

7、下载驱动精灵更新显卡和声卡驱动

8、如果有备份系统 请还原一次 或者重装一次(最好是安装版的XP系统 稳定性好一点)

Ⅲ Bochs无法运行

准备个U盘pe就可以自己恢复,如果手头没有只能到维修店了。
具体步骤如下
1、简单方法就是使用U盘pe下的引导修复工具,软件修复即可。
2、如果不嫌麻烦可以到到其他电脑复制这个文件到指定目录也可以。
3、最后本身C:\Windows\System32\config\RegBack这个文件夹会备份一个system文件,只要有能进入pe系统,把备份的system文件复制到config里,就可以正常开机了。

Ⅳ 怎么安装bochs centos

要下载的软件包:
bochs-2.6.2
linux-0.11-081030.tar.gz
linux-0.11-devel-060625.zip(hdc-0.11-new.img 文件系统)
(hdc-0.11-new.img 只用这一个文件也可以时入linux 0.11系统,只需在配置bochs时稍做修改就可以,但是要调试源码的话,还是自己编译来得爽)

安装bochs之前做一些准备工作
sudo apt-get install build-essential
sudo apt-get install xorg-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install bison

一.安装bochs
1. 解包
tar xvfz bochs-2.6.2.tar.gz
2.进入bochs-2.6.2目录
cd bochs-2.6.2
3. 配置
编译两份不同的配置的版本
第一个的版本为使用bochs自带的内部调试器

./configure --prefix=/opt/bochs/debug --enable-plugins --enable-debugger --enable-disasm
注释:
* --prefix=/opt/bochs/debug 软件将被安装到哪个目录下
* --enable-plugins 是必须要的
* --enable-debugger 是打开bochs的自带调试器
* --enbale-disasm 允许反汇编
4. 编译
make

报错:
/usr/bin/ld: gui/libgui.a(gtk_enh_dbg_osdep.o): undefined reference to symbol 'pthread_create@@GLIBC_2.1'
//lib/i386-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [bochs] Error 1

解决方法:修改步骤3产生的bochs-2.6.2/Makefile文件中LIBS 一行,加上 -lpthread,然后再make
5. 安装
sudo make install

报错:libtool: install: `iodev/usb/*.la' is not a valid libtool archive
Try `libtool --help --mode=install' for more information.
make: *** [install_libtool_plugins] Error 1

解决方法一:在bochs-2.6.2/iodev/usb目录下,修改Makefile和Makefile.in中的OBJS_THAT_CAN_BE_PLUGINS加入一个usb_common.o即可。

解决方法二:./configure --prefix=/opt/bochs/gdbstub --enable-plugins --enable-disasm --enable-gdb-stub --enable-usb

6.加一个符号连接
sudo ln -s /opt/bochs/debug/bin/bochs /usr/bin/bochsdbg

第二个版本为使用gdb-stub的版本
1. 清理
在配置第二个版本之前,需要把刚才编译的东西清理掉,输入以下命令:
make clean
2. 配置
然后配置,配置命令为
./configure --prefix=/opt/bochs/gdbstub --enable-plugins --enable-disasm --enable-gdb-stub
配置注释:
* --enable-gdb-stub 打开gdb stub支持
* 其他选项同上,注意这个不同版本会安装到不同的目录下。
3. 编译
make
4. 安装
sudo make install
这样bochs使用外部调试器gdb的版本就编译好了。
5.建一个符号链接
sudo ln -s /opt/bochs/gdbstub/bin/bochs /usr/bin/bochs

Ⅳ 如何测试bochs 安装成功 linux

命令行输入bochs
有反映没有,如果显示没有此命令,那就没有了

Ⅵ bochs虚拟机上的sb16怎么弄

1、下载安装bochs……(这步不会的下面可以不用看了……)
2、在Bochs安装目录中创建一个WinXP文件夹(同上面的括号)
3、创建虚拟硬盘用于存放WinXP镜像
具体步骤:
进入命令提示符,使用bximage工具
生成image需要回答几个问题
一:生成硬盘还是软盘
二:镜像类型 flat sparse or growing
三:镜像大小:WinXP一般5GB足够了
四:镜像名称:这个按照您个人的喜好吧
请注意!最后会要求你复制下面一行虚拟硬盘的参数,一定要复制下来,
否则一旦cmd退出,这些参数很难找回来
下面给出我用Bximage创建虚拟硬盘的范例
C:\Program Files\Bochs-2.4.5>bximage
========================================================================

Ⅶ 如何在Linux上使用Bochs

安装

到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 mole 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做实验了。

Ⅷ ubuntu16.04怎样安装bochs

系统是:Ubuntu 14.04LTS 64位

安装的是:bochs-2.6.8

Bochs 需要在 X11 环境下运行,因此你的 Linux 系统必须已经安装了X Window 系统才能使用Bochs。

因为 Bochs 是用C++写的,所以这里要安装GNU gcc/g++编译器。
安装命令如下:

Ⅸ lbochs运行Win11

、下载Linux0.11系统包,本链接的下载包已包含Bochs软件。

点击打开链接http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040329.zip
2、解压linux-0.11-devel-040329.zip,目录结构如下图所示:

这里真正使用到的文件为:Bochs-2.1.1.exe 、bochsrc-hd.bxrc、bootimage-0.11、bootimage-0.11-hd、hdc-0.11.img

3、点击Bochs-2.1.1.exe进行安装。

4、安装完毕后,将所有linux-0.11-devel-040329下的文件,拷贝到刚才安装bochs下的根目录。原目录如下:

拷贝过后目录为:

5、拷贝完成后,运行bochsrc-hd.bxrc,若安装成功,打开即能见到如下界面:

这已经是x86PC模拟器上,搭建完成的Linux操作系统。建立linux操作平台命令,就能操作Linux。由于学习操作系统需要,我们需要在Linux下,编译操作系统以及完成简单的源码修改,从而达到理解Linux内核的能力。接下来,主要演示Linux内核源码的修改,以及内核的编译过程。由于该Linux版本的原因,我们还需要对代码做出调整,方能成功编译。

内核编译过程:

1、进入/usr/src/linux 目录下,键入命令 cd ../src/linux ,如下图所示:

2、进行编译,键入命令 make clean 和 make后。

若出现如下所示错误:gcc-cc1: Invalid option "string-insns"。这是需将Linux目录下的Makefile文件中的-mstring-insns参数去掉。除此之外,每个子目录fs,lib,kernel以及kernel目录下的三个驱动程序子目录(math, blk_drv, chr_drv)的Makefike当中的-mstring-insns参数去除掉。此处只演示根目录下的Makefile文件修改。

3、依次修改:/linux/Makefile、/linux/fs/Makefile、/linux/lib/Makefile、

/linux/kernel/Makefile、/linux/kernel/math/Makefile、/linux/kernel/blk_drv/Makefile、/linux/kernel/chr_drv/Makefile文件。linux目录下,键入:vi Makefile。如下图所示:

找到文件中的-mstring-insns 参数,并删去保存。

4、到/usr/local/bin中找到文件ar,并把ar 改名为gar,键入命令:mv ar gar。如下图所示:

5、回到linux 目录下,重新键入make clean以及 make,完成内核的编译链接。

出现上图提示,即表面程序编译成功。完成编译后,便可以开始修改内核源码,从而达到扩展操作系统功能以及学习操作系统的目的。这里,我们简单修改下,linux操作系统开机启动项bootsect.s源码,让开机后输出个性化的字符串。

6、进入/usr/src/linux/boot目录,修改bootsect.s源码,保存并退出。

! Print some inane message
mov ah,#0x03 ! read cursor pos
xor bh,bh
int 0x10
mov cx,#47
mov bx,#0x0007 ! page 0, attribute 7 (normal)
mov bp,#msg1
mov ax,#0x1301 ! write string, move cursor
int 0x10
msg1:
.byte 13,10
.ascii "Loading system ...this is create by demon"
.byte 13,10,13,10
.org 508

7、修改完成后,在linux目录下,重新键入make命令,完成编译。

8、make成功后生成引导启动映象文件Image。若需要输出这个Image文件, 可以首先备份bootimage-0.11-hd文件, 然后使用下面命令就会把bootimage-0.11-hd替换成新的引导启动文件,键入命令:dd bs=8192 if=Image of=/dev/fd0。如下图所示:

9点击reset重启Linux操作系统。如下图所示:

Ⅹ 怎么用gdb和bochs调试内核

gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对Linux 0.11内核进行C语言级的调试。当然,Linux 0.11内核也需要进行使用-g选项重新编译。

14.13.1 编译带gdbstub的Bochs系统{.j,
Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-2.2.tar.gz):U
使用tar对软件包解压后会在当前目录中生成一个bochs-2.2子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:
[root@plinux bochs-2.2]# ./configure --enable-gdb-stubI0B%
checking build system type... i686-pc-linux-gnu7.tY.
checking host system type... i686-pc-linux-gnuQ
checking target system type... i686-pc-linux-gnu{
...©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。M
[root@plinux bochs-2.2]# makeQ
[root@plinux bochs-2.2]# make installN?
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。ufVz
若在运行./configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。>1z<z

14.13.2 编译带调试信息的Linux 0.11内核"jmg
通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 0.11系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的0.11内核模块来调试。这两种环境下都需要对0.11内核源代码目录中所有Makefile文件进行修改,即在其中编译标志行上添加-g标志,并去掉链接标志行上的-s选项:2

LDFLAGS = -M -x // 去掉 -s 标志。XJFU)Y
CFLAGS =-Wall -O -g -fomit-frame-pointer / // 添加 -g 标志。iMN

进入内核源代码目录后,利用find命令我们可以找到以下所有需要修改的Makefile文件:_6

[root@plinux linux-0.11]# find ./ -name MakefileSn^
./fs/Makefile-
./kernel/Makefile/"`p%
./kernel/chr_drv/Makefile(pyM
./kernel/math/MakefileV
./kernel/blk_drv/Makefiles/CDu
./lib/Makefile[x~
./Makefile980
./mm/Makefile/zb
[root@plinux linux-0.11]#S9/Q

另外,由于此时编译出的内核代码模块中含有调试信息,因此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsect.s文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。pP

Image: boot/bootsect boot/setup tools/system tools/build)=1
cp -f tools/system system.tmp=-&a
strip system.tmphQ6n0S
tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > ImageA-)
rm -f system.tmpY3w[/@
sync9=P2n
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。KuEo
当然,我们也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000来处理这种情况。a?g4

14.13.3 调试方法和步骤;M]3!
下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 0.11系统上编译出的内核代码分别来说明调试方法和步骤。
1 调试现代Linux系统上编译出的Linux 0.11内核?E
假设我们的Linux 0.11内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:
使用命令“tar zxvf linux-gdb-rh9-050619.tar.gz”解开这个软件包后,可以看到其中包含以下几个文件和目录:MX{-
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。X
[root@plinux linux-gdb-rh9]# ll'*5tfq
total 1600bJT~Q
-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrcf%J2s
drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux[dM&
-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-0.11-for-orig8EIChk
-rwxr-xr-x 1 root root 35 Jun 18 16:54 run{gj
[root@plinux linux--gdb-rh9]#t|f

这里的bochs配置文件与其他Linux 0.11配置文件的主要区别是在文件头部添加有以下一行内容,表示当bochs使用这个配置文件运行时将在本地网络端口1234上侦听gdb调试器的命令:NhL

gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0J,i/6

运行这个实验的基本步骤如下:@EkQ

(1).启动X window系统后打开两个终端窗口;(mPN
(2).在一个窗口中,把工作目录切换进linux-gdb-rh9/目录中,并运行程序“./run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);1P=VI<
(3).在另一个窗口中,我们把工作目录切换到内核源代码目录中linux-gdb-rh9/linux/,并运行命令:“gdb tools/system”;iDqm8
(4).在运行gdb的窗口中键入命令“break main”和“target remote localhost:1234”,此时gdb会显示已经连接到Bochs的信息;p
(5).在gdb环境中再执行命令“cont”,稍过一会gdb会显示程序停止在init/main.c的main()函数处。v3L2

下面是运行gdb和在其中执行的一些命令示例。[2;jS

[root@plinux linux]# gdb tools/system hI/
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)!mC}
Copyright 2003 Free Software Foundation, Inc.|3
GDB is free software, covered by the GNU General Public License, and you areC$NY4
welcome to change it and/or distribute copies of it under certain conditions.boNdAL
Type "show ing" to see the conditions.3[nfHW
There is absolutely no warranty for GDB. Type "show warranty" for details.'1-V
This GDB was configured as "i386-redhat-linux-gnu"...Oq&*[
(gdb) break main }<;
Breakpoint 1 at 0x6621: file init/main.c, line 110.+%!.]{
(gdb) target remote localhost:12342 .yc
Remote debugging using localhost:1234X6X&7
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481(
481 namei.c: No such file or directory.5QU
in namei.c&%P'
(gdb) cont Pv'/S$
Continuing.P:O_{
Breakpoint 1, main () at init/main.c:110 *
110 ROOT_DEV = ORIG_ROOT_DEV;T7PkpD
(gdb) list 5XT
105 { /* The startup routine assumes (well, ...) this */2L$
106 /*_c
107 * Interrupts are still disabled. Do necessary setups, then)Z0k
108 * enable themjZ@+wn
109 */u
110 ROOT_DEV = ORIG_ROOT_DEV;d&!*`
111 drive_info = DRIVE_INFO;#yRW,
112 memory_end = (1<<20) + (EXT_MEM_K<<10);9Uaw
113 memory_end &= 0xfffff000;`v8fAR
114 if (memory_end > 16*1024*1024)lA#
(gdb) next DH.zM
111 drive_info = DRIVE_INFO;X
(gdb) next ?+S:q
112 memory_end = (1<<20) + (EXT_MEM_K<<10);iXdDt
(gdb) print /x ROOT_DEV <W<
$3 = 0x21d }{%Q
(gdb) quit |
The program is running. Exit anyway? (y or n) yt
[root@plinux linux]#lixBs
=====================================================
14.1 利用bochs调试内核%UU
Bochs具有非常强大的操作系统内核调试功能。这也是本文选择Bochs作为首选实验环境的主要原因之一。有关Bochs调试功能的说明参见前面14.2节,这里基于Linux 0.11内核来说明Windows环境下Bochs系统调试操作的基本方法。m[2

14.1.1 运行Bochs调试程序.g8O
我们假设Bochs系统已被安装在目录“C:/Program Files/Bochs-2.1.1/”中,并且Linux 0.11系统的Bochs配置文件名称是bochsrc-hd.bxrc。现在在包含内核Image文件的目录下建立一个简单的批处理文件run.bat,其内容如下:R

"C:/Program Files/Bochs-2.1.1/bochsdbg" -q -f bochsrc-hd.bxrcjFypV+

其中bochsdbg是Bochs系统的调试执行程序。运行该批处理命令即可进入调试环境。此时Bochs的主显示窗口空白,而控制窗口将显示以下类似内容:D8v~

C:/Documents and Settings/john1/桌面/Linux-0.11>"C:/Program Files/Bochs-2.1.1/boRW6RNY
chsdbg" -q -f bochsrc-hd.bxrc2
========================================================================`)2?os
Bochs x86 Emulator 2.1.13$O@R
February 08, 2004x2
========================================================================/26c3(
00000000000i[ ] reading configuration from bochsrc-hd.bxrcq4
00000000000i[ ] installing win32 mole as the Bochs GUI4UW
00000000000i[ ] Warning: no rc file specified.1dsv
00000000000i[ ] using log file bochsout.txtmM
Next at t=0*
(0) context not implemented because BX_HAVE_HASH_MAP=0c
[0x000ffff0] f000:fff0 (unk. ctxt): jmp f000:e05b ; ea5be000f0g$
<bochs:1>i/

此时Bochs调试系统已经准备好开始运行,CPU执行指针已指向ROM BIOS中地址0x000fffff0处的指令处。其中'<bochs:1>'是命令输入提示符,其中的数字表示当前的命令序列号。在命令提示符'<bochs:1>'后面键入'help'命令,可以列出调试系统的基本命令。若要了解某个命令的具体使用方法,可以键入'help'命令并且后面跟随一个用单引号括住的具体命令,例如:“help 'vbreak'”,如下面所示。V7

<bochs:1> help@n{L(
help - show list of debugger commands5&6^
help 'command'- show short command description~B
-*- Debugger control -*-e!/;l
help, q|quit|exit, set, instrument, show, trace-on, trace-off,u7J
record, playback, load-symbols, slistr2:
-*- Execution control -*-pOHjE
c|cont, s|step|stepi, p|n|next, modebpj
-*- Breakpoint management -*-|EQ
v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,dL/rBI
bpe, bpd, d|del|deleteyR%|
-*- CPU and memory contents -*-xsMy
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, mp_cpu,@|'p
set_cpu, ptime, print-stack, watch, unwatch, ?|calc7
<bochs:2> help 'vbreak'_t*<#o
help vbreak/?
vbreak seg:off - set a virtual address instruction breakpoint0
<bochs:3>flx+

为了让Bochs直接模拟执行到Linux的引导启动程序开始处,我们可以先使用断点命令在0x7c00处设置一个断点,然后让系统连续运行到0x7c00处停下来。执行的命令序列如下:.Xfk

<bochs:3> vbreak 0x0000:0x7c00hDzuWy
<bochs:4> cfMH/'X
(0) Breakpoint 1, 0x7c00 (0x0:0x7c00))W&
Next at t=4409138<-0m5
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0 ; b8c007b 03*
<bochs:5>3R28Q

此时,CPU执行到boot.s程序开始处的第1条指令处,Bochs主窗口将显示出“Boot From floppy...”等一些信息。现在,我们可以利用单步执行命令's'或'n'(不跟踪进入子程序)来跟踪调试程序了。在调试时可以使用Bochs的断点设置命令、反汇编命令、信息显示命令等来辅助我们的调试操作。下面是一些常用命令的示例:J'P

<bochs:8> u /10 # 反汇编从当前地址开始的10条指令。,S/2
00007c00: ( ): mov ax, 0x7c0 ; b8c007Wvl
00007c03: ( ): mov ds, ax ; 8ed8)1f*
00007c05: ( ): mov ax, 0x9000 ; b80090WmD1
00007c08: ( ): mov es, ax ; 8ec0(`|
00007c0a: ( ): mov cx, 0x100 ; b90001iW1|1
00007c0d: ( ): sub si, si ; 29f6ze_QZY
00007c0f: ( ): sub di, di ; 29ffZStl
00007c11: ( ): rep movs word ptr [di], word ptr [si] ; f3a5=yF
00007c13: ( ): jmp 9000:0018 ; ea18000090!s?PR9
00007c18: ( ): mov ax, cs ; 8cc8(
<bochs:9> info r # 查看当前CPU寄存器的内容aM>/D
eax 0xaa55 436057a@`_
ecx 0x110001 1114113/$3$K"
edx 0x0 00j3G?
ebx 0x0 0gE
esp 0xfffe 0xfffee7{
ebp 0x0 0x0]*lX
esi 0x0 0m
edi 0xffe4 65508TD}Zo
eip 0x7c00 0x7c00e
eflags 0x282 642Wlg
cs 0x0 0b s=]
ss 0x0 0=Z'
ds 0x0 02R;%
es 0x0 0!
fs 0x0 0BX/
gs 0x0 0D*)}n{

阅读全文

与bochs命令相关的资料

热点内容
批处理编译qt 浏览:65
铁友app怎么查询机票订单 浏览:197
myeclipselinux破解版 浏览:417
批处理命令语法不正确 浏览:889
pdf合并成一个pdf在线 浏览:383
柱加密区构造要求 浏览:514
地板木龙骨标准跟加密区别 浏览:150
解压放松的好地方河南 浏览:965
搜狗怎么移动到文件夹 浏览:617
文件自动选择到文件夹 浏览:794
赠送的app怎么在ipad下载 浏览:508
颈椎解压后神经恢复 浏览:849
怎么看app订阅扣费 浏览:314
linux系统的负载均衡 浏览:419
遇到挫折解压视频 浏览:778
什么指令看服务器运行负载 浏览:84
因硕智能门锁卡片是加密的么 浏览:336
为什么会服务器不可用 浏览:290
wow宏命令设置 浏览:264
解压神器一张纸折叠魔术球 浏览:23