8. Early Printk

在 x86 系统上,使用带有 USB2 调试端口密钥和调试电缆的 earlyprintk=dbgp 启动选项的迷你 HOWTO。

您需要两台计算机、“USB 调试密钥”特殊工具和两条 USB 电缆,如下所示连接:

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

8.1. 硬件要求

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

    您可以通过查看 lspci -vvv 输出中的“调试端口”位来检查此功能

    # 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 维护人员。