導航:首頁 > 程序命令 > 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命令相關的資料

熱點內容
內置函數計算絕對值python 瀏覽:88
千聊免費課程可以重新加密嗎 瀏覽:507
python能代替php嗎 瀏覽:252
phpexcel樣式 瀏覽:265
安卓手機有沒有什麼軟體可以阻止彈廣告的 瀏覽:306
linux區域網搭建伺服器 瀏覽:690
python編譯器mac 瀏覽:293
windows的doc命令 瀏覽:463
nfc全加密門禁卡 瀏覽:636
身份信息被加密 瀏覽:482
我的鹽城app怎麼添加不了家庭成員 瀏覽:493
php商城並發 瀏覽:348
熊貓繪畫app怎麼做出大佬的筆刷 瀏覽:603
雲存儲伺服器知識 瀏覽:461
伺服器cpu是什麼指令集 瀏覽:591
糖貓t10怎麼安裝app 瀏覽:992
電腦加密u盤怎麼使用 瀏覽:518
linux如何升級php版本升級 瀏覽:841
二級程序員c語言難度 瀏覽:353
批處理編譯qt 瀏覽:67