这是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
手动进入内核调试有很多种方式,所有的方式都与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
转载于:https://blog.51cto.com/4989715/1420110