8. Early Printk

使用 USB2 调试端口密钥和调试电缆,在 x86 系统上使用 earlyprintk=dbgp 引导选项的 Mini-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 设备只能在此端口中用作早期 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 维护人员。