此标记用于解决Linux内核本身的内部问题 - 特别是关于编写在内核上下文中运行的代码(如内核模块或驱动程序)。关于在Linux中编写用户空间代码的问题通常应该标记为[linux]。由于Linux内核的内部不断变化,因此包含您感兴趣的精确内核版本会很有帮助。
我想更新系统调用表以使用我的自定义打开函数。我写了以下代码: #包括 #包括 MODULE_LICENSE(“GPL”); 字符*
Linux Perf PMU 事件在 Sapphire Rapids 中没有 UNCORE_CXL 事件
我在Xeon 6438上使用Linux 6.5.0,我注意到tools/perf/pmu-events/arch/x86/sapphirerapids/下有一个uncore_cxl.json文件,它定义了许多cxl相关事件,但是我找不到...
我刚刚更新了我的ubuntu,它的内核已经更新了: > uname -r 6.8.0-40-通用 然后,我拉一个简单的图像: docker pull alpine:最新 我收到以下错误: 最新:来自
我正在尝试在 Linux Mint (6.8.0-38-generic #38-Ubuntu) 上从 https://github.com/jeremyb31/rtl8822bu 编译驱动程序。我已经解决了几个问题(例如 sudo apt-get install gcc-multilib
使用 Linux 内核密钥环(keyctl 或 keyutils),如何不仅在会话之间而且在用户之间共享密钥? 我希望创建一次密钥,然后系统上的每个人都可以访问...
我已经开始阅读《Essential Linux Device Drivers》这本书。我正在遵循编译和引导到新内核的过程。但是我无法启动到新编译的内核 - I
我正在尝试为 ARM linux 编译 AODV。我使用 SabreLite 作为内核版本为 3.0.35_4.1.0 的主板。值得一提的是,我正在使用 openembedded 为我的主板创建 Linux 发行版....
我知道预读是 Linux 内核中预取的一种形式,但我认为预取更多的是关于硬件(缓存)预加载,而预读是操作系统级别的行为
x86_64 汇编:为什么当 char *buf 大于 size_t count 时会发生这种情况?
我正在我的 Linux 机器上尝试 x64 汇编中的一些东西。然而我遇到了一个小错误或意外的行为。 在 .bss 部分中,我在内存中保留了 16 个字节,我称之为“name&q...
cgroups v2 不支持elasticsearch 2.2.x
Elasticsearch < 5.2.x has a bug that prevents it to work with Linux kernel > 4.5 自 cgroup v2 引入以来 https://www.kernel.org/doc/Documentation/cgroup-v2.txt 它不会被修复,因为我...
最近,我的Linux机器上的Tomcat进程突然被杀死了。经过调查,我在 /var/log/messages 文件中发现以下错误消息: 内核:[1799319.246494]内存不足:杀死进程 2...
我是 Linux 内核模块编程的新手,许多关于该主题的入门指南都很少包含有关如何构建将在许多版本和 CPU 平台上运行的内核模块的信息...
我正在尝试编写内核模块,用于在给定地址设置硬件断点并在读/写访问时触发回调,寄存器看起来还不错,但访问时不会触发回调...
(initramfs)退出 /dev/sda2 包含一个有错误的文件系统,强制检查。 发现属于损坏的孤立链表的一部分的索引节点。 /dev/sda2:意外的不一致;手动运行 fsck。 (...
为什么 bootsect 在 linux(x86) 中将自身移至 0x90000?
我正在研究x86系统启动的过程 这是启动流程: BIOS 将 bootsect 从磁盘 MBR 加载到 0x7c00 内存地址 booect 将自身复制到 0x90000 内存地址并跳转到
使linux内核函数在ftrace中显示available_filter_function
我想使用 ftrace 跟踪 perf_event_open,但它没有显示在 available_filter_function 中。事实上,似乎只显示了模块中加载的函数。 是否有默认的黑名单...
我正在尝试学习Linux并用我的简单驱动程序编译内核。 不幸的是,我在日志中没有看到驱动程序,并且未创建编译文件。 #包括 #inc...
如何在 x86 上通过 Linux KVM API 实例化基于 ARM 的虚拟机?
假设我有一台 x86 机器。通过 Linux KVM API 可以轻松创建 x86 VM。 请参阅:kvm-host 中的 vm_init(): if ((v->kvm_fd = open("/dev/kvm", O_RDWR)) < 0) return throw_err(&q...
我正在尝试为我的小米 Mi4i 的内核编译 wlan 驱动程序。 我能够成功编译 wlan.ko 文件。 我还在手机上使用了我编译过的相同内核......
我想用mod_timer来定时器10毫秒,但是结果总是20毫秒
我的驱动测试代码,我想用mod_timer来定时器10毫秒,但结果总是20毫秒。它出什么问题了? .. #包括 #包括 我的驱动测试代码,我想用mod_timer来定时器10毫秒,但结果总是20毫秒。它出什么问题了? .. #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/timer.h> #include <linux/jiffies.h> #include <linux/unistd.h> #include <linux/delay.h> static struct timer_list my_timer; void my_timer_callback(struct timer_list *timer) { printk("my_timer_callback called (%lu).\n", jiffies); mod_timer(&my_timer, jiffies + msecs_to_jiffies(10)); } static int __init my_init(void) { printk("Timer module loaded\n"); timer_setup(&my_timer, my_timer_callback, 0); mod_timer(&my_timer, jiffies + msecs_to_jiffies(10)); return 0; } static void __exit my_exit(void) { printk("Timer module unloaded\n"); del_timer(&my_timer); } module_init(my_init); module_exit(my_exit); MODULE_AUTHOR("[email protected]"); MODULE_LICENSE("GPL"); MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); dmesg 结果: [ 70.391971] my_timer_callback called (4294944328). [ 70.411947] my_timer_callback called (4294944330). [ 70.431944] my_timer_callback called (4294944332). [ 70.451961] my_timer_callback called (4294944334). 内核版本:5.10 .配置: CONFIG_HZ=100 根据 OP 的经验,以及本电子邮件消息中所述,在调用计时器到期函数时,由于某些 CPU 正在读取旧的 jiffies 值,而另一个 CPU 正在更新它,因此可能会出现一 jiffy 延迟。 由于 OP 的计时器回调函数会在 jiffies 上添加一个相对量来设置下一个到期时间,因此回调之间的时间可能比所需的时间长一瞬间。可以通过将下一个到期时间设置为相对于前一个到期时间来缓解这种情况。如果一瞬间延迟一致,则所有回调函数将延迟一瞬间运行。但是,有些回调函数可能会按时运行,有些会延迟运行,这可能是不希望的。 如果用例需要更精确的计时,最好使用 hrtimer API,如下面 OP 代码的修改版本所示: #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/hrtimer.h> #include <linux/unistd.h> #include <linux/delay.h> static struct hrtimer my_timer; static enum hrtimer_restart my_timer_callback(struct hrtimer *timer) { s64 now = ktime_to_ns(hrtimer_cb_get_time(timer)); s64 expires = ktime_to_ns(hrtimer_get_softexpires(timer)); s64 diff = now - expires; printk("my_timer_callback called (now %lld, expired %lld, diff %lld).\n", now, expires, diff); hrtimer_add_expires_ns(timer, 10 * NSEC_PER_MSEC); return HRTIMER_RESTART; } static int __init my_init(void) { printk("Timer module loaded\n"); hrtimer_init(&my_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); my_timer.function = my_timer_callback; hrtimer_start(&my_timer, ktime_add_ms(hrtimer_cb_get_time(&my_timer), 10), HRTIMER_MODE_ABS); return 0; } static void __exit my_exit(void) { printk("Timer module unloaded\n"); hrtimer_cancel(&my_timer); } module_init(my_init); module_exit(my_exit); MODULE_AUTHOR("[email protected]"); MODULE_LICENSE("GPL"); MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); 模块的 dmesg 输出示例如下所示: [ 7119.967286] my_timer_callback called (now 7119822903369, expired 7119822900229, diff 3140). [ 7119.977294] my_timer_callback called (now 7119832911804, expired 7119832900229, diff 11575). [ 7119.987347] my_timer_callback called (now 7119842964493, expired 7119842900229, diff 64264). [ 7119.997286] my_timer_callback called (now 7119852903102, expired 7119852900229, diff 2873). [ 7120.007348] my_timer_callback called (now 7119862964879, expired 7119862900229, diff 64650). [ 7120.017348] my_timer_callback called (now 7119872964924, expired 7119872900229, diff 64695). [ 7120.027347] my_timer_callback called (now 7119882964377, expired 7119882900229, diff 64148). [ 7120.037333] my_timer_callback called (now 7119892950004, expired 7119892900229, diff 49775). [ 7120.047348] my_timer_callback called (now 7119902964627, expired 7119902900229, diff 64398). [ 7120.057348] my_timer_callback called (now 7119912964748, expired 7119912900229, diff 64519). [ 7120.067337] my_timer_callback called (now 7119922952994, expired 7119922900229, diff 52765). [ 7120.077350] my_timer_callback called (now 7119932966586, expired 7119932900229, diff 66357). [ 7120.087348] my_timer_callback called (now 7119942964245, expired 7119942900229, diff 64016). [ 7120.097334] my_timer_callback called (now 7119952950074, expired 7119952900229, diff 49845). [ 7120.107351] my_timer_callback called (now 7119962966616, expired 7119962900229, diff 66387).