在Linux下安装带调试功能的bochs

bochs 专栏收录该内容
1 篇文章 0 订阅

1.下载bochs源码

bochs下载网站

2.解压后进入该目录进行配置

sudo ./configure --enable-debugger --enable-disasm

3.编译安装

sudo make

sudo make install

bochs 使用配置文件中的信息来寻找所使用的磁盘映像文件、运行环境外围设备的配置以及其他一些虚拟机器的设置信息。

4.新建自己的目录进行配置

4.1配置文件解析

4.1.1. megs

用于设置被模拟系统所含内存量。默认值:32MB
修改示例:

megs:128

4.1.2.floppya(floppyb)

floppya表示第一个软驱,floppyb代表第二个软驱。
如果需要从一个软盘上来引导系统,floppya需要指向一个可引导的磁盘。
示例:

在这里插入图片描述

4.1.3. ata0 ata1 ata2 ata3

4个参数名用来启动模拟系统中最多4ATA通道。
对于每个启用的通道,必须指明IO基地址和一个中断请求信号。
默认只有ata0是启用的,并且参数默认如下。
在这里插入图片描述

4.1.4. ata0-master(ata0-slave)

ata0-master用来指明模拟系统中第1ATA通道(0通道)上连接的第1ATA设备(硬盘或CDROM等);
ata0-slave指明第1个通道上链接的第2ATA设备。
在这里插入图片描述
表 17 − 7    设 备 配 置 的 选 项 表17-7\;设备配置的选项 177

选项说明可取的值
type连接的设备类型[ disk | cdrom ]
path映像文件路径名
mode映像文件类型、仅对disk有效[ flat | concat | external | dll | sparse | vmware3 | undoable | growing | volatile ]
cylinders仅对disk有效
heads仅对disk有效
spt仅对disk有效
status仅对cdrom有效[ inserted | ejected ]
biosdetectbios 进行变换的类型(int 13),仅对disk有效[ none | lba | large | rechs | auto ]
model确认设备ATA命令返回的字符串

在配置ATA设备时,必须指明连接设备的类型type,可以是diskcdrom。还必须指明设备的“路径名” path。“路径名”可以是一个硬盘映像文件、CDROMISO文件或者直接指向系统的CDROM驱动器。在Linux系统中,可以使用系统设备作为Bochs的硬盘,但由于安全原因,在Windows下不赞成直接使用系统上的物理盘。
对于类型是disk的设备,选项pathcylindersheadsspt是必须的。对于类型是cdrom的设备,选项path是必须的。
磁盘变换方案(在传统int 13 BIOS功能中实现,并且用于像DOS这样的老式操作系统)可以定义为:

名称说明
none无需变换,适用于容量小于512MB1032192个扇区)的硬盘。
large标准移位算法,用于容量小于4.2GB8257536个扇区)的硬盘。
rechs修正移位算法,使用15磁头的伪物理硬盘参数,适用于容量小于7.9GB15482880个扇区)的硬盘。
lba标准lba-辅助算法。适用于容量小于8.4GB16450560个扇区)的硬盘。
auto自动选择最佳变换方案(如果模拟系统启动不了就应该改变)。

mode选项用于说明如何使用硬盘映像文件。它可以是一些模式之一。

名称说明
flat一个平坦顺序文件。
concat多个文件。
external开发者专用,通过C++类来指定。
dll开发者专用,通过DLL来使用。
sparse可堆砌、可确认、可退回的。
vmware3支持vmware3的硬盘格式。
undoable具有确认重做日志的平坦文件。
growing容量可扩展的映像文件。
volatile具有易变重做日志的平坦文件。

以上选项默认值是:
在这里插入图片描述

4.1.5. boot

boot用来定义模拟机器中用于引导启动的驱动器。
示例:
在这里插入图片描述

4.1.6.cpu

cpu用来定义模拟系统中仿真的CPU的参数。四个参数如下:
|参数|说明|
|COUNT|指明系统模拟的处理器个数。(支持SMP最多为8,否则为1)|
|QUANTUM|指定控制从一个处理器切换到另一个之前最多可执行的指令数量。|
|RESET_ON_TRIPLE_FAULT|指定当处理器发生三重错误时需要对CPU执行复位操作而不是仅仅让其停机(PANIC)。|
|IPS(Instructions Per Second)|指定每秒钟仿真的指令条数。

在这里插入图片描述

4.1.7.log

指定log的路径名可以让Bochs记录执行的一些日志信息。
在这里插入图片描述

4.2 新建配置文件bochsrc

在这里插入图片描述

4.3 新建系统调试代码boot.s

在这里插入图片描述

4.4 创建软盘floppy

4.4.1 使用bximage工具

在这里插入图片描述

4.4.2 创建名为a.img,大小为1.44MB的软盘。

在这里插入图片描述

4.5 编译boot.s

as86 -0 -a -o boot.o boot.s
ld86 -0 -s -o boot boot.o
dd bs=32 if=boot of=./a.img skip=1

4.6 部分 Bochs 调试指令

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

编译过程: 1). 解压后默认的文件夹位置是D:\Linux-0.11,如果你不是将文件解压到该目录, 你要修改MinGW32目录的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录. 2). 打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台. 3). make 一,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean" 4). 如果安装bochs,直接双击bochsrc.bxrc即可运行Linux-0.11了. 5). 也可用其它虚拟机加载Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了 6). 出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车 这就是能windows环境编译的Linux 0.11了,不是Cygwin,也不是虚拟机里,而是使用MinGW. 面是Windows编译Linux 0.11会遇到的问题和对原文件作的修改: 1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的划线去掉了,但MinGW的gcc可能是为了与其它Windows的编译器保持兼容,并不能识别这些不划线的C变量,因而还得把原先已经汇编程序中去掉划线的C变量加上划线,同时也要把被C程序引用的汇编程序中的变量加上划线. 2.MinGW中不as86编译器,因而把boot目录原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm. 3.Makefile作的主要修改: LDFLAGS中加了--image-base 0x0000 将elf_i386改成i386pe 将cd 与 make 之间的;改成&,如cd kernel ; make 改成cd kernel & make MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main函数,编译成sync.exe 因为类似的原因,make dep会出错 4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是windows的可执行文件的格式,显然是不能直接执行的,必须加以转化.我实现了通过两种方式加以转化. 1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块直接加载的.我已经将这个程序放Linux-0.11的tools目录,要微软的编译器编译. 2)自己写一个PE Loader,这种方式比较麻烦,但是想想自己也能做一个PE Loader,还是满有成就感的,尽管这是一个最简单的Loader.代码是加Linux-0.11-With-PE-Loader\boot目录的setup.asm文件里,里面有详细的注释. 5.对tools的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img 6.Link的过程中,init目录的main.c会出现以错误: boot/head.o(.text+0x540c):fake: undefined reference to `_main' init/main.o(.text+0x16f):main.c: undefined reference to `_alloca' init/main.o(.text+0x174):main.c: undefined reference to `__main' make: *** [tools/system.exe] Error 1 第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为Linux 0.11根本没有这个函数,gcc的编译选项里也有-nostdinc .有一个解释是main函数不是一个普通的函数,MinGW gcc会对它作特殊的处理.解决的办法其实也很简单,把main.c面的main函数改名为_main,或者是干脆把它改成另外一个函数,就改成start吧.记得把head.s里的_main也改了. 最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能Linux编译的书里源代码用MinGW移植到Windows编译的过程中才试着Windows编译Linux 0.11源代码的,有了Windows编译Linux 0.11源代码的经验,移植高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。 也要感谢Linux内核完全注释的作者赵炯博士,是他拉接了操作系统与操作系统爱好者的距离. 最后,我也非常想和操作系统爱好者们共同交流心得体会,也希望能多认识一些朋友. 我的网名:flyfish 我的QQ:785606288 E-mail:I2CBus@126.com 另外,要转载请保持本文件的完整性,请尊重别人的劳动果实. 修改日志: 08/3/29 修改了一Makefile,旧的Makefile某些文件更新后还会重新编译。 修改了Trans.cpp中的一个dug,该dugtranslate MinGW gcc编译的程序时可能会出错。用MinGW gcc 编译的程序的VirtualAddress的形式可能是0xFFC1000这样的形式,其实0x1000才是它的VirtualAddress 08/4/2 修改了MinGW32.bat,现已经不用重设路径了。 08/4/4 Trans.cpp还是有错,如果VirtualAddress>0xffff,那么生成的system.bin就错了,bochs调试时会一直重启。 权宜之计,把0xffff再改成0x3ffff,这样VirtualAddress就不能大于0x3ffff,不知谁有更好的解决方法, 08/4/4 实现了gdb+bochs源码级调试linux 0.11 08/4/6 添加了insight,可以GUI界面里源码调试内核了
©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值