【说明】本文的所有命令和输出均在Ubuntu 20.04.4中实现

在上一篇文章 Win10 USB转串口连接Linux主机调试_qq_42000667的博客-CSDN博客CSDNicon-default.png?t=M5H6https://mp.csdn.net/mp_blog/creation/editor/125585717里介绍了如何用USB转串口连接Win10 PC和Linux主机(或开发板),实现串口调试的功能。但是,做到文中的几步,还是只能设置一个普通的串口终端,虽然可以实现ssh等pts所拥有的全部功能,kernel消息还是无法在连接串口的Win10 Putty上显示。如运行如下Magic SysRq命令(见参考文献3):

$sudo sh -c 'echo c > /proc/sysrq-trigger'

可以让kernel奔溃,如果此时主console(通过Alt+Ctrl+F3切换)是tty3,可以看到kernel panic的stacktrace消息。

[    7.952685] sysrq: Trigger a crash
[    7.952850] Kernel panic - not syncing: sysrq triggered crash
[    7.953098] CPU: 0 PID: 71 Comm: linuxrc Not tainted 5.19.0-rc2 #1
[    7.953259] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
[    7.953655] Call Trace:
[    7.954133]  <TASK>
[    7.954332]  dump_stack_lvl+0x34/0x44
[    7.954651]  panic+0x102/0x27b
[    7.954756]  ? _printk+0x53/0x6a
[    7.954847]  sysrq_handle_crash+0x11/0x20
[    7.954953]  __handle_sysrq.cold+0x43/0x11b
[    7.955065]  write_sysrq_trigger+0x1f/0x30
[    7.955167]  proc_reg_write+0x4c/0x90
[    7.955267]  vfs_write+0xb4/0x290
[    7.955362]  ksys_write+0x5a/0xd0
[    7.955453]  do_syscall_64+0x3b/0x90
[    7.955553]  entry_SYSCALL_64_after_hwframe+0x46/0xb0
[    7.955773] RIP: 0033:0x4a8531
[    7.955999] Code: e0 ff ff ff f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b3 0f 1f 80 00 00 00 00 8b 05 d2 26 1e 00 85 c0 75 16 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 57 c3 66 0f 1f 44 00 00 8
[    7.956427] RSP: 002b:00007ffde8168508 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
[    7.956625] RAX: ffffffffffffffda RBX: 000000000101a8a0 RCX: 00000000004a8531
[    7.956787] RDX: 0000000000000002 RSI: 00000000010201e0 RDI: 0000000000000001
[    7.956949] RBP: 0000000000000001 R08: fefefefefefefeff R09: fefefefefefeff62
[    7.957113] R10: 00000000000001b6 R11: 0000000000000246 R12: 00000000010201e0
[    7.957275] R13: 0000000000000002 R14: 00007ffde8168701 R15: 00007ffde8168578
[    7.957467]  </TASK>
[    7.957806] Kernel Offset: 0x34a00000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[    7.958215] ---[ end Kernel panic - not syncing: sysrq triggered crash ]---

但是,这个时候在连接串口的Putty上看不到任何消息。

所以,这个时候该串口的Putty连接,还只是一个普通终端,不是一个console.  那么它用于调试,在系统崩溃时依然无法抓到宝贵的kernel消息,也无法进入kdb等Debug环境。

我们先来看当前Linux主机的console是什么。可以通过运行如下命令:(见参考文献1)

$cat /sys/devices/virtual/tty/console/active

tty0

可以看出,输出是tty0,即连接Linux主机的显示器,键盘鼠标接口,通常有图形界面。可以Ctr+Alt+Fn(n=1-6)切换到纯文本console(command line) ttyn。

要想设置串口为console, 首先必须把serial port这个模块编译到Linux内核中(compiled in),而不能是以可加载module的形式。$make menuconfig 进入Kernel配置菜单,在Device driver ‣ Character devices ‣ Serial drivers ‣ 8250/16550 and compatible serial support ‣ Console on 8250/16550 and compatible serial port 选择built-in。(见参考文献2) 

如果已经选择了则无需理会,如果原来不是built-in, 则需要修改配置,保存后重新编译内核,然后重启。

这时候我们需要修改Linux Kernel启动时command line参数,在里面加入console=ttyS1(我选择的是COM2,如果COM1选择ttyS0)。(见参考文献3)

$sudo vim /etc/default/grub

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

只需要修改GRUB_CMDLINE_LINUX_DEFAULT=后面的内容,只要是Linux正常启动都会使用该配置。加上console=ttyS1,115200 kgdboc=ttyS1,115200, 因为我要使用串口进行kgdb调试,所以加上了它,后面可以看到效果。不需要的同学无需添加和理会。kgdb支持需要内核配置,我可能后面会另写文章阐述。

修改后该行变成:

GRUB_CMDLINE_LINUX_DEFAULT="quiet console=ttyS1,115200 kgdboc=ttyS1,115200 splash"

保存退出,再运行:(记住一定要,否则修改无效)

 $sudo update-grub

 $sudo reboot

这时候再查看当前console:

$ cat /sys/devices/virtual/tty/console/active
ttyS1

已经换成ttyS1(COM2)了。

此时,把串口连上,Win10 的Putty启动(如何配置见上一篇文章),在Linux主机上再调用getty。

$sudo /sbin/getty -L ttyS1 115200 vt102

这时候Putty端就会收到Logon提示信息,输入用户名,密码等信息,就进入了console交互界面。

在Linux主机上触发kgdb,使用Magic SysRq key(需要配置,见参考文献3).

$ sudo sh -c 'echo g > /proc/sysrq-trigger'

这时候Linux主机进入kgdb转态,Putty界面显示:

minipc@minipc-H81U:~$ [  611.439892] sysrq: DEBUG

Entering kdb (current=0xffff9b534ab06500, pid 1614) on processor 3 due to NonMaskable Interrupt @ 0xffffffffb25a3c64
[3]kdb>

以上就是配置串口为console的全过程,要点是kernel启动时command line的参数配置。把全部环节打通我还是花了近2天的时间,google了很多资料。感谢各路大侠在网上的无私奉献,大家有什么问题也可以在下面留言,我尽可能解答。

1. 

https://www.baeldung.com/linux/monitor-keyboard-driversicon-default.png?t=M5H6https://www.baeldung.com/linux/monitor-keyboard-drivers

2. Linux Serial Console — The Linux Kernel documentationicon-default.png?t=M5H6https://docs.kernel.org/admin-guide/serial-console.html 3. Linux Magic System Request Key Hacks — The Linux Kernel documentationicon-default.png?t=M5H6https://www.kernel.org/doc/html/v4.17/admin-guide/sysrq.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐