从事Nand driver的开发已经三个月有余,由于nand是存储数据的载体,涉及它的维护工作不仅仅局限在了nand控制器的读写操作和mtd层,但凡涉及数据读写操作的都会有它的存在。比如系统启动的诸多过程,升级操作,串口通讯工具等等。心血来潮,想追溯到OS物种的起源,逐步来学习计算机的心智——操作系统,并完成自己的一步步实现。小弟初来乍到,有很多的知识和方法,以及思想不够成熟和全面,希望能得到达人们的指导,在此表示由衷的感谢!
就是这样的一个小盒子,从这里获得http://sourceforge.net/projects/bochs/
1. What is Bochs?
Bochs是使用C++编写的开源IA-32(x86)PC模拟器,由凯文·劳顿最先编写可用于仿真386、486、Pentium/PentiumII/PentiumIII/Pentium4或x86-64位的CPU,包括可选的MMX,SSEx和3DNow指令环境。与此同时还有辅助Bochs版本>= 2.3.7的GUI调试器peter-bochs-debugger,在这里下载http://code.google.com/p/peter-bochs/
在windows版本下有个DLX,位于dlxlinux目录下,是微型的Linux demo硬盘镜像,能够跑有限的Linux命令。

2. How to Config?
安装在windows下的bochs,用bochsrc.bxrc作为配置文件,比如DLX的配置文件是在dlxlinux/bochsrc.bxrc,我们可以类似的去写:
###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################
# how much memory the emulated machine will have
megs: 32 #内存大小
# filename of ROM images
romimage: file=../BIOS-bochs-latest #rom code 即BIOS
vgaromimage: file=../VGABIOS-lgpl-latest #VGA BIOS
# 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信息
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
或者参考bochsrc-sample.txt文件。
# MAGIC_BREAK:
# This enables the "magic breakpoint" feature when using the debugger.
# The useless cpu instruction XCHG BX, BX causes Bochs to enter the
# debugger mode. This might be useful for software development.
#
# Example:
# magic_break: enabled=1
#=======================================================================
#magic_break: enabled=1
这个配置在调试的作用很大,可以在一个专门的位置查看寄存器,能够使bochs进入debug模式:
在gcc上的命令为:__asm__("xchgw %bx. %bx"); /* (this is GAS) */
TC上为:__emit__(0x87,0xDB); /* XCHG BX,BX */
XCHG BX,BX是windows上指令
替代这个命令的方法是在code上插入“hlt”,或者在控制台上Ctrl+C
一般我们用bochs -f bochsrc指定配置文件,如果不指定,则按照下面的方式寻找配置文件:
.bochsrc(隐藏文件)
bochsrc
bochsrc.txt
bochsrc.bxrc(仅对windows有效)
3. Create new image?
(1) 拷贝bochsrc-sample.txt成一个新文件bochsrc.bxrc,配置您需要的配置选项,否则注释掉
(2) 利用bximage.exe应用程序,创建硬盘镜像

(3) 把上面最后提示的写入bochsrc.bxrc文件中
ate0-master: type=disk, path="myfirst.img", mode=flat, cylinders=40, heads=16, spt=63
(4) 这个新建的image是没有format和partition table的,所以需要fdisk和format命令
可以在这里面http://bochs.sourceforge.net/diskimages.html获得a.img为floppy,在这里有需要的dos命令,提供fdisk和format
floppya: 1_44=a.img, status=inserted
注意boot配置:
boot: floppy, disk
(5)Start Bochs 选择Start simulation
首先运行floppy,执行"format c: /s",再boot disk
具体请参见安装目录下Bochs - a Guide and Tutorial for Windows II.pdf,或者在http://code.google.com/p/peter-bochs/下载相关资料
4. Running Bochs?

(1) 可以load您已经配置好的bochsrc.bxrc,可以通过Edit Options去修改您的配置文件的内容,然后start
(2) bochs -q命令显示窗口
5. Debug OS
在安装目录下有一个bochsdbg.exe,能够具有调试OS内核的功能
在PC上,BIOS load boot disk的MBR到内存0x7C00位置,可以执行如下命令进行调试:
| 行为 | 指令 | 举例 | 说明 |
|---|---|---|---|
| 在物理地址上设置断点 | b addr | b 0x17300 | |
| 在线性地址上设置断点 | lb addr | lb 0x7C00 | |
| 在虚拟地址上设置断点 | vb segment:offset | vb 0x0000:0x7C00 | CS:IP |
| 显示当前所有断点信息 | info break | info break | |
| 继续执行直到遇上断点 | c | c | |
| 单步执行 | s | s | |
| 单步执行,遇到函数则跳过 | n | n | |
| 查看寄存器信息 | info cpu | info cpu | help info |
| 查看堆栈 | print-stack | print-stack | |
| 查看物理地址内容 | xp /nuf addr | xp /40bx 0x70346 | help xp |
| 查看线性地址内容 | x /nuf addr | x /40bx 0x346 | help x |
| 反汇编一段内存 | u start end | u 0x700000 0x 70012D | |
| 反汇编执行的每一条指令 | trace-on | trace-on | |
| 每执行一条指令就打印CPU信息 | trace-reg | trace-reg on |





一些简单的解释:
disassemble 0x009880 0x00988f 相当于列表中的u start end
info gdt 查看global descriptor table信息
info idt 查看interrupt descriptor table信息
x /28hx 0x0a436 用28个十六进制字显示
扩展:
(1)Peter-Bochs Debugger 图形化Debug工具http://code.google.com/p/peter-bochs/,使用说明见http://code.google.com/p/peter-bochs/wiki/features
(2)Bochs内置的增强Debug工具,在配置文件上
display_library: x, options="gui_debug" # use GTK debugger gui
display_library: win32, options="gui_debug" # use Win32 debugger gui
本文介绍了如何搭建和配置Bochs,一个开源的IA-32(x86)PC模拟器,用于学习和调试操作系统。内容涵盖Bochs的基本功能、配置文件设置、创建硬盘镜像以及使用调试工具进行OS调试。
1620

被折叠的 条评论
为什么被折叠?



