Young's Blog

包子铺

使用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的串口配置界面里,选择使用com1I/O端口采用默认值,端口模式选用主机管道,勾选上创建通道。对应的管道文件的路径为/tmp/vboxpipe_FreeBSD9_64(路径自行决定)。

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

2. 安装socat

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

3. 配置VirtualBoxGuest网络环境

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

1.桥接

a.Host里分别创建tapbridge设备:

ifconfig bridge create

ifconfig tap create

上述命令会自动分配bridge0tap0

b.建立tap0Host的物理网卡连接

ifconfig bridge0 addm tap0 add re0 up

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

c.bridge0分配IP

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

dhclient bridge0

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

d.配置Guest的网络

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

上述的bridgetap的配置可以直接写到/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

posted on 2013-05-12 08:47 Young 阅读(4119) 评论(0)  编辑 收藏 引用 所属分类: FreeBSD


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理