标签: kernel-modules

如何调试出现空指针的内核模块?

我有一个从这个补丁编译的自定义内核模块,它logitech G19在其他 G 系列设备中增加了对键盘的支持。我在 Ubuntu 的特立独行内核的主分支 (2.6.35) 上编译得很好。

我可以启动并加载模块,但我遇到了一个非常奇怪的情况。一旦我加载模块(在启动时或通过 modprobe),我就会出现黑屏并且我的控制台锁定。

奇怪的是它没有锁定我的系统,它只是当前的控制台会话。我可以通过 SSH 进入我的盒子,它给了我一个终端和一个会话。我可以打字,我什至可以运行一个命令,它会给我输出。然后它绘制我的下一个提示并立即锁定。

我看到dmesg有一个空指针,我得到以下堆栈跟踪:

[  956.215836] input: Logitech G19 Gaming Keyboard as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.1/1-2.1.2/1-2.1.2:1.1/input/input5
[  956.216023] hid-g19 0003:046D:C229.0004: input,hiddev97,hidraw3: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:1d.7-2.1.2/input1
[  956.216065] input: Logitech G19 as /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2.1/1-2.1.2/1-2.1.2:1.1/input/input6
[  956.216128] Registered led device: g19_97:orange:m1
[  956.216146] Registered led device: g19_97:orange:m2
[  956.216178] Registered led device: g19_97:orange:m3
[  956.216198] Registered led device: g19_97:red:mr
[  956.216216] Registered led device: …
Run Code Online (Sandbox Code Playgroud)

linux c debugging kernel-modules assembly

10
推荐指数
2
解决办法
6717
查看次数

自定义内核:模块内置时无法加载固件

我想内置所有模块,但这失败了iwlagn

iwlagn 0000:03:00.0: request for firmware file 'iwlwifi-6000-4.ucode' failed.
iwlagn 0000:03:00.0: no suitable firmware found!
Run Code Online (Sandbox Code Playgroud)

微码文件存在于其中/lib/firmware,如果我编译iwlagn为模块,则整个过程都可以正常工作。我不知道它在哪里寻找文件或有什么问题 - 有什么想法吗?

linux kernel kernel-modules

10
推荐指数
1
解决办法
5086
查看次数

启动时加载linux内核模块的顺序是什么?他们的优先级如何?

我有一个动态编译的 Linux 内核模块。它是如何添加到启动中的?里面有很多.ko文件/lib/modules。如何设置加载这些模块的优先级?

linux startup kernel-modules

10
推荐指数
2
解决办法
2万
查看次数

内核模块可以使用多少 strip(1)-ing?

我经常为 Slackware Linux 创建包,这个过程的一部分是剥离二进制文件,以便它们占用更少的空间。我发现如果我strip --strip-all(或strip没有选项)内核模块,它们通常无法插入:

致命:插入 cloop 时出错 (/lib/modules/2.6.38.7-smp/kernel/fs/cloop/cloop.ko):模块格式无效

内核模块推荐什么级别的剥离?如果我使用--strip-debug,我是否会删除会对系统性能和/或错误记录产生负面影响的调试符号?

strip kernel-modules

9
推荐指数
1
解决办法
1万
查看次数

如何使用支持多机硬件的localmodconfig构建自定义内核?

将服务器配置为运行单个任务(如设备)时,可能需要构建自定义内核。例如节省磁盘空间。

Ubuntu Core 13.10 amd64 根文件系统是38 MB 的下载,其中包含所需依赖项的“linux-image-generic”元包将下载79 MB的档案,而 kernel-image-xyz-generic 包的大小仍然是14 MB .

要构建从硬件不使用的模块中剥离的内核,该make localmodconfig命令是完成这项工作的正确工具。但是,运行构建和测试环境的虚拟机加载的模块与目标部署硬件不同。和/或一段时间后,您的部署硬件可能会停产,并使用不同的硬件。并且在内核更新发布的频率上,为每个不同的硬件配置构建自定义内核可能会变得太麻烦。

如何快速构建运行在几个不同硬件盒上的自定义 Linux 内核?

make kernel-modules linux-kernel

9
推荐指数
1
解决办法
8780
查看次数

在 /proc/modules 中标记 (F) 的模块

在我的 3.10 系统上,/proc/modules 中列出的一些模块被标记为 (F)。我想找到这个(F)的原因。我确信模块没有被强制加载并且是用内核构建的。能否请您指出是什么内核代码创建了 /proc/modules?

usb_storage 56610 0 - Live 0xffffffffa005d000 (F)
Run Code Online (Sandbox Code Playgroud)

如果我卸载并重新加载这个模块,(F)就会消失。

kernel-modules

9
推荐指数
1
解决办法
2789
查看次数

lsmod 在“Used by”列中显示 -2

当我在内核 4.3.0 上运行的 arm board(banana pi)上运行 lsmod 时会发生这种情况

# lsmod
Module                  Size  Used by
async_raid6_recov       1434  -2
async_pq                5548  -2
async_xor               3771  -2
async_memcpy            1665  -2
sha512_generic          8213  -2
rsa_generic             3235  -2
asn1_decoder            2667  -2
mpi                    13730  -2
poly1305_generic        3386  -2
pcbc                    2396  -2
michael_mic             2051  -2
md4                     3536  -2
ghash_generic           1908  -2
gcm                    10511  -2
fcrypt                  8128  -2
echainiv                2110  -2
crypto_user             4316  -2
crc32                   1581  -2
cmac                    2657  -2
chacha20poly1305        6641  -2
chacha20_generic        2902  -2
ccm                     7537  -2 …
Run Code Online (Sandbox Code Playgroud)

linux kernel-modules

9
推荐指数
1
解决办法
3634
查看次数

如何阻止内核内置的驱动程序,即不是模块的驱动程序

我使用nouveau内置于内核中的驱动程序配置和编译了 Linux 内核,即与在 Linux 内核源目录中执行时<*>相反。<M>make menuconfig

现在,我打算使用另一个驱动程序而不是nouveau. 如果nouveau是一个模块,我会blacklist nouveau在里面添加一行/etc/modprobe.d/blacklist.conf

我现在该怎么办。

drivers kernel kernel-modules modprobe linux-kernel

9
推荐指数
2
解决办法
6112
查看次数

当 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
Run Code Online (Sandbox Code Playgroud)

从各种来源 ( 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
Run Code Online (Sandbox Code Playgroud)

所以我不得不在恐慌时使内核重新启动:

# 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
Run Code Online (Sandbox Code Playgroud)

(其中的奇怪路径/proc/cmdline是因为我直接从 UEFI …

linux arch-linux kernel-modules

9
推荐指数
2
解决办法
6913
查看次数

从内核模块调用 Linux 内核方法

从 Linux 中的内核模块调用 C 文件中的内核函数的正确方法是什么?

我想打电话给exit_task_namespaceslinux/nsproxy.c从我第一次内核模块

我正在这样做:

#include <linux/nsproxy.h>
…

static ssize_t device_read(struct file *flip, char *buffer, size_t len, loff_t *offset)
{
    struct task_struct *task = current;
    …
    exit_task_namespaces(task);
    …
}
Run Code Online (Sandbox Code Playgroud)

当我尝试时,make出现以下错误:

ERROR: "exit_task_namespaces" [/home/.../lkm_example.ko] undefined!
make[2]: *** [scripts/Makefile.modpost:94: __modpost] Error 1
make[1]: *** [Makefile:1673: modules] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-73-generic'
make: *** [Makefile:3: all] Error 2
Run Code Online (Sandbox Code Playgroud)

我可以在文件中看到/usr/src/linux-headers-5.4.0-73-generic/include/linux/nsproxy.h该方法存在。

这是我的 Makefile:

obj-m += lkm_example.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

c kernel-modules

9
推荐指数
1
解决办法
1234
查看次数