STEP
1 编译不含sio的kernel(注释掉device.hints和device sio), 并以附件中的sio.c编译sio.ko
2 备份当前系统的kernel和sio.ko,并更新kernel, 并重启
3 加载虚拟串口驱动
#kldload /path/to/sio.ko
4 测试串口
#ll /dev/cuad* (可以看到2个串口,如cuad2,cuad3)
终端1:#cat /dev/cuad2
终端2:#echo test > /dev/cuad3
如果在终端1上看到输出的test,则表明虚拟串口连接成功
在终端1上按CTRL+c终止cat
5 调试内核
为串口联调配置好vmware虚拟机,配置虚拟机中的串口为/dev/cuad2
在主机中执行#kgdb -r /dev/cuad3 kernel.debug进行联调 ADVANTAGE
1 超越硬件的限制
2 软件模拟串口,传输速度可以不受串口速度的限制 BUG
1 对控制信号的模拟不够精确
2 该驱动的加载会导致物理串口不能正常工作(如需使用物理串口,kldunload sio.ko后kldload备份的sio.ko即可)
3 性能尚有待改进 REFERENCE
1 zzy《Debugging with GNU Project Debugger》
2 Interfacing the Serial / RS232 Port,http://www.beyondlogic.org/serial/serial.htm
3 The RS232 Standard,http://www.camiresearch.com/Data_Com_Basics/RS232_standard.html ============================================================================= 用vmware其实是非常方便的。
首先要配置好各个虚拟机,着重要配置的各个虚拟机的串口,一个作server,一个作client,被调试的当然是server了
1. 配置调试机 2. 配置被调试机 3. 在内核中增加调试选项
options DDB makeoptions DEBUG=-g device sio0 at isa? port IO_COM1 flags 0x10 irq 4device sio1 at isa? port IO_COM2 flags 0x80 irq 3
串口1一般用作控制台,在此保留了,串口2才是调试口,注意其标志位为0x80
# config -d /tiny TINY ; cd /tiny; make depend;make 一是直接在调试机上编译内核,
二是在其他服务器上编译,然后将包含源码以及kernel.debug的目录nfs共享,调试机挂接
三是通过pxe远程引导一个系统在服务器上一目录中单独安装一个相应版本的系统(4.x和5.x是不兼容的,请注意),所有的编译操作都在这个目录下进行
当然要chroot到这个目录下。
pxe远程引导这个系统。这个目录无论在服务器上还是在pxe引导的客户机上的目录映射都是相同的,编译速度和便捷都有保证。
将kernel拷贝到被调试机上,启动。同时启动调试机。按ctrl-alt-esc,进入db状态进入调试机
# gdb -k kernel.debug
(kgdb) target remote /dev/cuaa0 连接完成后
(kgdb) c
继续执行,在以后的操作中,可以随时在被调试机上中断,进入gdb中。在调试机上就可以设置断点,跟踪调试了。