这是KDB使用I/O接口驱动,代码位于/drivers/tty/serial/kgdboc.c.对应于CONFIG_KGDB_SERIAL_CONSOLE.该驱动是目前配置与kdb shell交互

的设备的最主要的驱动程序。

kgdboc驱动依赖于底层硬件驱动程序。在kgdboc的最初的实现中,serial_core 暴露了一个UART钩子执行轮询操作,在原子上下文中读写一个单字节。当kgdb向调试器发出IO请求时,kgdboc唤醒一个回调函数,该回调函数又唤醒UART驱动。

如果通过UART使用kgdboc,UART驱动必须实现两个回调函数(位于STRUCT uart_ops)

示例代码:/drivers/tty/serial/8250/8250.c

spacer.gif

手动进入内核调试有很多种方式,所有的方式都与sysrq-g相关,因此必须开启CONFIG_MAGIC_SYSRQ配置项。触发kdb需要执行下面的操作

echo g > /proc/sysrq-trigger

有很多运行态的内核参数影响内核调试器的配置。

1)kdgboc

对于kdb而言,kgdboc告诉内核怎样跟kdb进行交互。可以通过串口进行交互,也可以通过键盘进行交互。当然,也可以选择集成kms(kernel mode setting)。当使用kgdboc支持的kms时,就可以以图形化界面的方式进入控制台。如果内核的执行重新开始了,之前的图像化模式将会被保存。这种方式旨在使用图形化控制台界面的方式使用kdb诊断内核crash或者对内存进行诊断。

kgdboc:

kgdboc=[kms][[,]kbd][[,]serial_device][,baud]

如果使用上面参数的某些组合,那么必须遵守顺序。

可以将kgdboc配置为使用键盘或者串口,这依赖于使用kdb/kgdb。

1、通过串口使用kdb和kgdb。

kgdboc=<serial_device>[,baud]

Example: kgdboc=ttyS0,115200

2、通过串口和键盘使用kdb和kgdb

kgdboc=kbd,<serial_device>[,baud]

Example: kgdboc=kbd,ttyS0,115200

3、使用键盘使用kdb

kgdboc=kbd

4、使用集成了kms的kdb

kgdboc=kms,kbd

5、kdb集成了kms同时kgdb通过串口连接

kgdboc=kms,kbd,ttyS0,115200

如果将kgdboc驱动编入内核:kgdboc=<tty-device>,[baud]

如果将kgdboc驱动作为内核模块: modprobe kgdboc kgdboc=<tty-device>,[baud]

在运行阶段通过sysfs配置kgdboc

1、开启/关闭 kgdboc

echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc

echo "" > /sys/module/kgdboc/parameters/kgdboc