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 維護人員。