Linux
當 I2C Designware 未建構為模組時,如何禁用它?
我有一台執行 Arch Linux 的 Alienware Aurora R7。關閉時,核心會出現恐慌,恐慌消息中會出現類似這樣的內容(省略時間戳):
BUG: Unable to handle kernel NULL pointer dereference at (null) IP: i2c_dw_isr+0x3ef/0x6d0 PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP PTI
從各種來源(1、2)來看,這似乎與
i2c-designware-core
模組有關,解決方法是將其列入黑名單。但是,對於最近的核心(似乎是 4.10 及更高版本),這似乎不是作為模組建構的:# uname -srv Linux 4.15.2-2-ARCH #1 SMP PREEMPT Thu Feb 8 18:54:52 UTC 2018 # zgrep DESIGNWARE /proc/config.gz CONFIG_I2C_DESIGNWARE_CORE=y CONFIG_I2C_DESIGNWARE_PLATFORM=y CONFIG_I2C_DESIGNWARE_SLAVE=y CONFIG_I2C_DESIGNWARE_PCI=m CONFIG_I2C_DESIGNWARE_BAYTRAIL=y CONFIG_SPI_DESIGNWARE=m CONFIG_SND_DESIGNWARE_I2S=m CONFIG_SND_DESIGNWARE_PCM=y
所以我不得不在恐慌時重啟核心:
# cat /proc/cmdline root=UUID=e5018f7e-5838-4a47-b146-fc1614673356 rw initrd=/intel-ucode.img initrd=/initramfs-linux.img panic=10 sysrq_always_enabled=1 printk.devkmsg=on
(其中的奇怪路徑
/proc/cmdline
是因為我直接從 UEFI 啟動,並使用創建的條目efibootmgr
。路徑植根於/boot
ESP 安裝的位置。)這似乎是觸摸板的東西,但我沒有觸摸板,也不會得到。我能做些什麼來禁用這個東西?我必須建構自定義核心嗎?
由於
linux-lts
也比 4.10(目前為 4.14)更新,似乎也沒有一種簡單的方法來安裝較舊的核心,黑名單可能會起作用。使用
nolapic
作為核心參數解決了關機恐慌問題,但它會導致系統在啟動後凍結幾分鐘,所以我不能使用它。
在閱讀核心原始碼後,我發現了一個我們需要黑名單的功能!
感謝Stephen Kitt的提示
initcall_blacklist
。添加
initcall_blacklist=dw_i2c_init_driver
到核心命令行。這適用於核心 4.15.0。對於任何會找到這個答案的人。您可以通過編輯來做到這一點
/etc/default/grub
:
- 在終端中執行:
sudo -H gedit /etc/default/grub
.- 將黑名單字元串附加到
GRUB_CMDLINE_LINUX_DEFAULT
:GRUB_CMDLINE_LINUX_DEFAULT="… initcall_blacklist=dw_i2c_init_driver"
。- 保存文件,關閉編輯器。
- 在終端中執行:
sudo update-grub
.- 重啟並測試!