8. Early Printk

在 x86 系统上,使用带有 USB2 调试端口密钥和调试电缆的 earlyprintk=dbgp 引导选项的简易指南(Mini-HOWTO)。

你需要两台计算机、“USB 调试密钥”专用小装置以及两根 USB 电缆,按如下方式连接

[host/target] <-------> [USB debug key] <-------> [client/console]

8.1. 硬件要求

  1. 主机/目标系统需要具备 USB 调试端口功能。

    你可以通过查看 lspci -vvv 输出中的 “Debug port” 位来检查此功能

    # lspci -vvv
    ...
    00:1d.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 03) (prog-if 20 [EHCI])
            Subsystem: Lenovo ThinkPad T61
            Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
            Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Interrupt: pin D routed to IRQ 19
            Region 0: Memory at fe227000 (32-bit, non-prefetchable) [size=1K]
            Capabilities: [50] Power Management version 2
                    Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
                    Status: D0 PME-Enable- DSel=0 DScale=0 PME+
            Capabilities: [58] Debug port: BAR=1 offset=00a0
                         ^^^^^^^^^^^ <==================== [ HERE ]
            Kernel driver in use: ehci_hcd
            Kernel modules: ehci-hcd
    ...
    

    注意

    如果你的系统没有列出调试端口功能,那么你可能无法使用 USB 调试密钥。

  2. 你还需要一根 NetChip USB 调试电缆/密钥

    这是一个带有两个 USB 连接的小型蓝色塑料连接器;它通过其 USB 连接供电。

  3. 你需要第二个带有高速 USB 2.0 端口的客户端/控制台系统。

  4. NetChip 设备必须直接插入“主机/目标”系统上的物理调试端口。你不能在物理调试端口和“主机/目标”系统之间使用 USB 集线器。

    EHCI 调试控制器绑定到特定的物理 USB 端口,NetChip 设备只能在该端口上用作 early printk 设备。EHCI 主机控制器的电气布线决定了 EHCI 调试控制器连接到第一个物理端口,并且无法通过软件改变这一点。你可以通过在系统上尝试每个物理端口并重新启动来进行实验,从而找到该物理端口。或者你也可以尝试使用 lsusb,或者在将 USB 设备插入“主机/目标”系统的各个端口时查看由 USB 堆栈发出的内核信息。

    一些硬件厂商没有通过物理连接器暴露 USB 调试端口,如果你发现了这样的设备,请向硬件厂商投诉,因为没有任何理由不将此端口连接到物理可访问的端口之一。

  5. 同样重要的是要注意,NetChip 设备的许多版本要求“客户端/控制台”系统插入设备的右侧(产品标志朝上且可从左到右阅读)。原因在于 5 伏电源仅取自设备的一侧,并且必须是不会被重启的那一侧。

8.2. 软件要求

  1. 在主机/目标系统上

你需要启用以下内核配置选项

CONFIG_EARLY_PRINTK_DBGP=y

并且你需要添加启动命令行:“earlyprintk=dbgp”。

注意

如果你使用的是 Grub,请将其追加到 /etc/grub.conf 中的 ‘kernel’ 行。如果你在 BIOS 固件系统上使用 Grub2,请将其追加到 /boot/grub2/grub.cfg 中的 ‘linux’ 行。如果你在 EFI 固件系统上使用 Grub2,请将其追加到 /boot/grub2/grub.cfg 或 /boot/efi/EFI/<distro>/grub.cfg 中的 ‘linux’ 或 ‘linuxefi’ 行。

在拥有多个 EHCI 调试控制器的系统上,你必须指定正确的 EHCI 调试控制器编号。该顺序来自 EHCI 控制器的 PCI 总线枚举。如果没有数字参数,默认值为“0”即第一个 EHCI 调试控制器。要使用第二个 EHCI 调试控制器,你可以使用命令行:“earlyprintk=dbgp1”

注意

通常情况下,一旦常规控制台启动,earlyprintk 控制台就会被关闭 - 使用 “earlyprintk=dbgp,keep” 可以让该通道在早期启动完成后继续保持打开状态。这对于调试 Xorg 等环境下的崩溃非常有用。

  1. 在客户端/控制台系统上

你应该启用以下内核配置选项

CONFIG_USB_SERIAL_DEBUG=y

在下一次使用修改后的内核启动时,你应该会获得一个 /dev/ttyUSBx 设备。

现在,这个内核消息通道已准备好使用:启动你喜欢的终端模拟器(minicom 等)并将其设置为使用 /dev/ttyUSB0 —— 或者使用原生命令 ‘cat /dev/ttyUSBx’ 来查看原始输出。

  1. 在基于 Nvidia 南桥的系统上:内核将尝试探测并找出哪个端口连接了调试设备。

8.3. 测试

你可以通过使用 earlyprintk=dbgp,keep 并在主机/目标系统上触发内核消息来测试输出。例如,你可以通过执行以下操作来触发一条无害的内核消息

echo h > /proc/sysrq-trigger

在主机/目标系统上,你应该能在 “dmesg” 输出中看到这行帮助信息

SysRq : HELP : loglevel(0-9) reBoot Crashdump terminate-all-tasks(E) memory-full-oom-kill(F) kill-all-tasks(I) saK show-backtrace-all-active-cpus(L) show-memory-usage(M) nice-all-RT-tasks(N) powerOff show-registers(P) show-all-timers(Q) unRaw Sync show-task-states(T) Unmount show-blocked-tasks(W) dump-ftrace-buffer(Z)

在客户端/控制台系统上执行

cat /dev/ttyUSB0

在你主机系统上触发它之后不久,你应该就能看到上面显示的帮助信息。

如果它不工作,请在 linux-kernel@vger.kernel.org 邮件列表上询问或联系 x86 维护人员。