使用VirtualBox来调试FreeBSD内核

使用VirtualBox来调试FreeBSD内核

1. 配置Guest的串口

更新ports,目前VirtualBox的版本为4.2.12。在VirtualBox里安装完FreeBSD后,修改/boot/device.hints:

hint.uart.0.flag=0x90

这里只用把串口的高8位置为1即可。另外,现在FreeBSD版本里的串口设备不再以sio来命名;在device.hint配置的是uart,而实际连接的/dev/cuau0。

在VirtualBox的串口配置界面里,选择使用com1,I/O端口采用默认值,端口模式选用主机管道,勾选上创建通道。对应的管道文件的路径为/tmp/vboxpipe_FreeBSD9_64(路径自行决定)。

在启动Guest系统后,就会在这个路径上创建vboxpipe_FreeBSD9_64的socket文件。

2. 安装socat

进入/usr/ports/net/socat,安装socat。这个工具目前用来代替nc,提供的功能非常强大,可以直接完成简单的NAT端口映射。我们这里用来做TCP到/tmp/vboxpipe_FreeBSD9_64连接。

3. 配置VirtualBox的Guest网络环境

这里验证了好几种方式,为了和Guest进行通讯,我们能采用的网络连接方式为:桥接和Host Only的方式。、

1.桥接

a.在Host里分别创建tap和bridge设备:

ifconfig bridge create

ifconfig tap create

上述命令会自动分配bridge0和tap0

b.建立tap0和Host的物理网卡连接

ifconfig bridge0 addm tap0 add re0 up

这里re0是我的物理网卡。上述命令建立了从re0和tap0的桥接,而bridge0只是一个桥接设备。

c.给bridge0分配IP

我采用的都是DHCP方式,直接给bridge0分配IP地址:

dhclient bridge0

如果不这样子做的话,当设置VirtualBox的Guest主机为桥接方式连接到tap0上时,是无法ping通外网的。话说这里的原因也没有时间去追究,一切以先完成目标为主。

d.配置Guest的网络

在Guest的网络配置里设置连接方式为桥接,连接的网卡为tap0

上述的bridge和tap的配置可以直接写到/etc/rc.conf里:

cloned_interfaces=tap0 bridge0

ifconfig_bridge0=addm re0 add tap0
但bridge0的IP地址只能通过手动方式来获取,即便是在上面的ifconfig_bridge0里添加SYNDHCP,结果还是一样的,手动进行DHCP方式如下:
      dhclient bridge0

2.Host Only

采用Host Only的时候,Guest的网络配置那里会出现vboxnet0,选择连接vboxnet0,此时启动Guest系统,系统默认采用DHCP来获取IP。此时能得到和vboxnet0一个网段的IP地址。但此时仍然无法ping通外网。但可以通过scp等命令把带调试信息的内核传给Guest主机。

4. 准备调试环境

编译带调试版本的FreeBSD内核,可以参考使用《qemu来调试FreeBSD系统内核》,得到带调试版本的内核后,更新到Guest系统上。

5. 开始调试

1.启动Guest系统,此时会生成对应的管道文件/tmp/vboxpipe_FreeBSD9_64

2.当Guest系统进入启动菜单项的时候,按Esc键进入命令行模式,输入boot -d进入调试模式,然后输入gdb进入gdb调试方式

3.使用socat创建TCP到管道的连接:

socat tcp4-listen:1234 /tmp/vboxpipe_FreeBSD9_64

4.使用GDB开始进行调试:

我使用的是GDB7.5.1,接入gdb后,设置当前的系统架构:

set architecture i386:x86-64:intel

加载完符号表后连接Guest主机进行调试:

target remote 127.0.0.1:1234

你可能感兴趣的:(使用VirtualBox来调试FreeBSD内核)