[LWN 新闻] Linux 原子写入:向原子缓冲 I/O 迈进

[LWN 新闻] Linux 原子写入:向原子缓冲 I/O 迈进

I/O 许多应用程序需要能够将多块数据原子性地写入磁盘,确保操作要么完全成功要么完全失败。虽然某些文件系统已支持原子直接I/O,但原子缓冲I/O仍是一项挑战。Pankaj Raghav等内核开发者正在推进使用write-through语义实现原子缓冲写入,这将允许通过pwritev2()和RWF_ATOMIC标志发起原子写入请求,内核会立即启动写入过程并保持页面固定,防止数据在操作过程中被修改。

[LWN 新闻] sched_ext 子调度器让单一系统运行多个 CPU 调度器

[LWN 新闻] sched_ext 子调度器让单一系统运行多个 CPU 调度器

BPF Tejun Heo 发布的 sched_ext 子调度器补丁允许在单个系统上运行多个 CPU 调度器。该功能通过控制组(cgroup)机制实现,可以为不同的工作负载选择不同的调度算法。父调度器控制何时运行工作负载,子调度器控制进程如何访问 CPU,而 CPU 控制器负责分配时间片。这一改进使"一种调度器适用于所有场景"成为历史。

[LWN 新闻] Linux eBPF 程序暂无硬件内存隔离

[LWN 新闻] Linux eBPF 程序暂无硬件内存隔离

BPF 2025年2月,Yeoreum Yun 在内核邮件列表中发布了一项关于提升 BPF 安全性的建议:使用内存保护密钥(Memory Protection Keys)来防止 BPF 程序对内存的未授权访问。该提案建议在内核中添加 kmalloc_pkey() 和 vmalloc_pkey() 函数,让 BPF 程序只访问内核内存的特定子集。然而,内核开发者对此存在分歧:Dave Hansen 认为该方案对部分子系统可能可行,而 Alexei Starovoitov 认为这些只是 bug 而非安全问题…

Linux 内核双向链表

Linux 内核双向链表

Linux 双向链表在内核中是一个非常常见的存在,从数据的关联,队列的创建,每一个子系统中,都有他的影子存在,它属于内核最基本的一个部件。那么他虽然是非常的常见,但是要弄清楚他也不是那么容易,因为他与平常自己设计的双向链表还不太一样。 一个普通的双向链表 对于一个普通的双向链表而言,我们多数会这么设计。 struct person { int age; char name[1024]; struct pers…

Linux Magic SysRq 魔键

Linux Magic SysRq 魔键

kernel SysRq 魔键是一组由 Linux 内核解析的组合键,他使得用户可以直接执行各种低级指令,这些操作与当时的系统状态无关。例如从冻结中恢复,或者在不破坏文件系统的情况下重启系统,他的效果类似与直接按住了计算机的硬件重置按钮(电源开关),但是它具有更多的选项和更多的控制权。 通过这个组合键,为用户提供用于软件开发和灾难恢复的强大功能。他主要用于强制卸载文件系统、杀死进程、恢复键盘状态以及将未写入磁盘…

NUMA_NO_NODE 在内核中的作用

NUMA_NO_NODE 在内核中的作用

kernel 最近在研究 NUMA Node 对于内存申请的影响,发现有一些网卡驱动会去主动探测其网卡设备所在的 PCIe 节点所在的 NUMA Node,然后通过 alloc_pages_node 去该节点附近进行内存申请。理论上来说,这种方式比较好,也是麒麟内核在做网络优化时常用的一种手段之一,但是这种手段难道就没有弊端了吗? 不是没有,通过 alloc_pages_node 捆绑某一个节点之后,无论核外程…

io_uring(2)- 从创建必要的文件描述符 fd 开始

io_uring(2)- 从创建必要的文件描述符 fd 开始

io_uring 说在前面的废话 本章开始,我会深入代码进行分析,逐步的剖析最新版本(5.3 版本)的 io_uring 代码实现逻辑1,内核代码并不是那么容易就描述得清晰的,每一个小小的判断或者小小的 flag 都有自己的历史,最终导致的就是代码逻辑上晦涩难懂,尤其是没有从原始代码开始理解的小伙伴,看到最终的状态就会是:我擦,这是为什么?这特么的又是为啥要搞一下?如果你没有发出这样的感叹,除非两类人,第一类就是完…

io_uring(1) – 我们为什么会需要 io_uring

io_uring(1) – 我们为什么会需要 io_uring

io_uring IO 到底怎么啦 当前 Linux 对文件的操作有很多种方式,最古老的最基本就是 read 和 write 这样的原始接口,这样的接口简洁直观,但是真的是足够原始,效率什么自然不是第一要素,当然为了符合 POSIX 标准,我们需要它。一段时间之后,程序员们发现,人们需要更为简单的 API,于是出现了 pread 和 pwrite 它允许我们在读写时直接传递 offset,显而易见它表现的更为优秀,…

Linux 各种 initcall 的调用原理

Linux 各种 initcall 的调用原理

Linux 很早以前就想写一下关于 initcall 的相关知识点,但是一直苦于没有特别强烈的需求以及自己的懒惰才拖到现在,其实一直在想要不要写一篇这样的文章,毕竟目前网上能够查阅到几乎所有的资料,不过也没有什么关系,就当是为了记忆把之前的一些理解写下来。 module_init 与其他的 __initcall 很早以前,不理解模块是如何插入到内核中的,特地的分析了一次 module_init 是如何工作的,…

使用 Qemu 虚拟 ARM64 平台演示 kdump 崩溃转存

使用 Qemu 虚拟 ARM64 平台演示 kdump 崩溃转存

ARM64 为什么想起写这篇文章呢?第一是最近在研究 kdump/kexec 等系列的内核崩溃现场保护能力,所以有相关的技术积累,但是这篇文章不打算什么分析,因为接下来的文章我会分析什么是 kdump 以及如何实现内核崩溃现场保护;第二是因为方便记忆,我自己平常不太喜欢写 Word 这种类型的工作总结,比较喜欢 Markdown 这种标记性语言,他方便我很快的排版以及很好的代码展示,所以我写到了这里,既方便了…

加载更多