由于官方的 NVIDIA 391.xx 驱动程序不支持 Linux 6.x,我被迫使用 noveau,但性能非常差。是否有适用于较新 Linux 内核的这些驱动程序的非官方版本?提前感谢您的回复。
我读过你不应该在中断处理程序中使用阻塞系统调用。
对于单处理器系统,这是有道理的,但是对于多处理器系统,这样的阻塞操作真的会阻塞整个系统吗?还是只阻塞它所运行的处理器?
因此,我目前正在学习如何编写内核模块/设备驱动程序,并正在研究以下实现unregister_chrdev_region
:
https://elixir.bootlin.com/linux/v6.12/source/fs/char_dev.c#L311
/**
* unregister_chrdev_region() - unregister a range of device numbers
* @from: the first in the range of numbers to unregister
* @count: the number of device numbers to unregister
*
* This function will unregister a range of @count device numbers,
* starting with @from. The caller should normally be the one who
* allocated those numbers in the first place...
*/
void unregister_chrdev_region(dev_t from, unsigned count)
{
dev_t to = from + count;
dev_t n, next;
for (n = from; n < to; n = next) {
next = MKDEV(MAJOR(n)+1, 0);
if (next > to)
next = to;
kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));
}
}
我不明白的是这一行的检查:
https://elixir.bootlin.com/linux/v6.12/source/fs/char_dev.c#L318
if (next > to) next = to;
据我所知,当循环变量等于上限时,循环已经中断to = from + count
。什么时候我们会遇到条件的情况if (next > to)
?这个条件检查的原因是什么?
我的 Linux 笔记本电脑 (openSUSE Tumbleweed) 应该休眠但却没有休眠,我不明白为什么。我曾经有过类似的系统 (Arch Linux) 在相同情况下休眠 (LUKS 上的 LVM)。这是我的配置:
- EFI-GRUB 启动
- LUKS 上的 LVM;LVM 具有根分区、主分区和交换分区
/etc/fstab
在 中启用并由 UUID 安装的交换区swapon -s
显示它处于活动状态。它的大小为 32GB,安装了 16GB RAM。- GRUB 在默认配置中有恢复语句
/boot/grub2/grub.cfg
(见下文)。
以下是检查内核和系统休眠功能的几个命令:
# zgrep HIBERN /proc/config.gz
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_HIBERNATION_SNAPSHOT_DEV=y
CONFIG_HIBERNATION_COMP_LZO=y
# CONFIG_HIBERNATION_COMP_LZ4 is not set
CONFIG_HIBERNATION_DEF_COMP="lzo"
因此内核配置为支持休眠。
此次引导(由 GRUB 完成)有:
# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.11.6-2-default root=/dev/mapper/cryptolvm-opensuse splash=silent resume=/dev/mapper/cryptolvm-swap mem_sleep_default=deep security=selinux selinux=1 enforcing=1 mitigations=auto
我尝试resume=
使用UUID=....
交换的 UUID 进行改变,但没有效果。
# cat /sys/power/state
freeze mem
这里disk
缺少了但我不知道为什么。
当然现在这行不通了:
# systemctl hibernate
Call to Hibernate failed: Sleep verb 'hibernate' is not configured or configuration is not supported by kernel
Exit 1
内核是否依赖 BIOS 来启用休眠功能?(据我所知不是。)在这种情况下,我可以在那里检查一些东西吗?
我的任务如下:需要从 BIOS 芯片读取所有 UEFI 固件数据并计算checksum
这些数据。
如何做到这一点(UEFI 固件的内存区域是什么,是否可以从 Linux 内核读取 UEFI 固件)?
我知道 dmesg 命令会打印存储在环形缓冲区中的消息。但是从 Linux 源代码来看,缓冲区的名称是什么?我想在 Linux 被终止且没有任何消息后查看缓冲区。我怀疑这不是由软件陷阱引起的(因此没有恐慌消息),但我可以检查内存(使用一些 System.map 和虚拟到物理地址的转换)。
我打算使用 Ext4 文件加密功能。一切正常,但还有一个问题。通过 删除密码后keyctl
,我仍然可以看到加密目录的内容。我尝试删除密钥、同步并清空页面缓存、卸载文件系统、重新启动 caja 文件管理器并再次挂载 fs。但它不起作用。虽然我无法再写入目录,但我仍然可以看到清晰的名称。
如何清空内核的 KeyRing 缓存?(无需重新启动或重启我的 X 会话)
资料来源:
我看到了一种非常奇怪的行为。
/proc/1154/cmdline
存在,并且kill -0 1154
成功,但是ps -ef | grep 1154
和ls /proc | grep 1154
不显示任何内容。
1154 是虚拟机重新启动时,处于关闭状态的 postgres 进程(或者日志中提到但可能没有被刷新)。
这怎么可能呢?
我已经编译并安装了 Linux 驱动程序,但现在我不确定如何在我的代码中实际使用它。
该驱动程序适用于 mcp9600 热电偶放大器,默认情况下它不在我的内核中(内核版本 6.6),但源代码可在此处获得: https://github.com/torvalds/linux/blob/master/drivers/iio/temperature/mcp9600.c
我已经成功编译并安装了驱动程序(我假设),因为我可以在 /sys 中找到文件:
>ls /sys/module/mcp9600
coresize holders initstate refcnt taint
drivers initsize notes sections uevent
>ls /sys/bus/i2c/drivers/mcp9600
bind module uevent unbind
但是 /dev 下什么都没有
我需要做什么才能从 c 代码或 shell 脚本读取该芯片的温度数据?
这是在 arm64 嵌入式设备上的 debian 上。
根据内核参数kexec_load_disabled的文档,
此值默认为 0(false:启用 kexec_load),但可以设置为 1(true:禁用 kexec_load)。一旦设置为 true,kexec 将不再可用,并且无法将切换设置回 false。
该文档说的是,如果将此参数设置为 true,即 1,则一旦加载了内核,就无法在运行时卸载它,也无法加载新内核来代替它。因此,如果在将内核参数设置为 的机器上安装了内核 6.10.13 kexec_load_disabled
,1
是否会影响将内核升级到版本 6.11.2?即使重新启动后也会阻止它吗?
此外,如果将此参数设置为 true,则不会阻止在引导加载程序(如 GRUB)中操纵条目。因此,在 GRUB 中可以创建一个条目来加载其他内核版本。我的理解正确吗?