我有一个从这个补丁编译的自定义内核模块,它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) 我想内置所有模块,但这失败了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 内核模块。它是如何添加到启动中的?里面有很多.ko文件/lib/modules。如何设置加载这些模块的优先级?
我经常为 Slackware Linux 创建包,这个过程的一部分是剥离二进制文件,以便它们占用更少的空间。我发现如果我strip --strip-all(或strip没有选项)内核模块,它们通常无法插入:
致命:插入 cloop 时出错 (/lib/modules/2.6.38.7-smp/kernel/fs/cloop/cloop.ko):模块格式无效
内核模块推荐什么级别的剥离?如果我使用--strip-debug,我是否会删除会对系统性能和/或错误记录产生负面影响的调试符号?
将服务器配置为运行单个任务(如设备)时,可能需要构建自定义内核。例如节省磁盘空间。
Ubuntu Core 13.10 amd64 根文件系统是38 MB 的下载,其中包含所需依赖项的“linux-image-generic”元包将下载79 MB的档案,而 kernel-image-xyz-generic 包的大小仍然是14 MB .
要构建从硬件不使用的模块中剥离的内核,该make localmodconfig命令是完成这项工作的正确工具。但是,运行构建和测试环境的虚拟机加载的模块与目标部署硬件不同。和/或一段时间后,您的部署硬件可能会停产,并使用不同的硬件。并且在内核更新发布的频率上,为每个不同的硬件配置构建自定义内核可能会变得太麻烦。
如何快速构建运行在几个不同硬件盒上的自定义 Linux 内核?
在我的 3.10 系统上,/proc/modules 中列出的一些模块被标记为 (F)。我想找到这个(F)的原因。我确信模块没有被强制加载并且是用内核构建的。能否请您指出是什么内核代码创建了 /proc/modules?
usb_storage 56610 0 - Live 0xffffffffa005d000 (F)
Run Code Online (Sandbox Code Playgroud)
如果我卸载并重新加载这个模块,(F)就会消失。
当我在内核 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) 我使用nouveau内置于内核中的驱动程序配置和编译了 Linux 内核,即与在 Linux 内核源目录中执行时<*>相反。<M>make menuconfig
现在,我打算使用另一个驱动程序而不是nouveau. 如果nouveau是一个模块,我会blacklist nouveau在里面添加一行/etc/modprobe.d/blacklist.conf
我现在该怎么办。
我有一个运行 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 中的内核模块调用 C 文件中的内核函数的正确方法是什么?
我想打电话给exit_task_namespaces在linux/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) kernel-modules ×10
linux ×5
c ×2
kernel ×2
linux-kernel ×2
arch-linux ×1
assembly ×1
debugging ×1
drivers ×1
make ×1
modprobe ×1
startup ×1
strip ×1