Linux 内核双向链表

双向链表在内核中是一个非常常见的存在,从数据的关联,队列的创建,每一个子系统中,都有他的影子存在,它属于内核最基本的一个部件。那么他虽然是非常的常见,但是要弄清楚他也不是那么容易,因为他与平常自己设计的双向链表还不太一样。 Contents1 一个普通的双向链表2 Linux 下双链表的基础2.1 …

Linux Magic SysRq 魔键

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

NUMA_NO_NODE 在内核中的作用

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

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

Contents1 说在前面的废话2 从系统调用 io_uring_setup 说起3 交互需要使用的缓存区3.1 到底需要映射几块内存区域3.2 为什么需要拆分 sq_ring4 关键数据结构4.1 sq_ring 数据结构4.2 cq_ring 数据结构4.3 sqes 的单元数据结构4.4 c…

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

Contents1 IO 到底怎么啦2 尴尬的 AIO3 那么应该是什么样子的呢?4 io_uring 实现了什么 IO 到底怎么啦 当前 Linux 对文件的操作有很多种方式,最古老的最基本就是 read 和 write 这样的原始接口,这样的接口简洁直观,但是真的是足够原始,效率什么自然不是第一…

Linux 各种 initcall 的调用原理

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

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

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

如何往 Linux 内核社区提交代码

总有这样一群人,不计报酬不辞辛苦的为这个世界的美好添砖加瓦,在这一类人中的某一些人,他们开创了许多伟大的开源工程,这些工程也许会随着年代的久远逐渐被替代,但仍然有一些随着时光流逝变得愈发强大,这其中就包括了 Linux 内核工程。还有一群怀揣着梦想的人,总是提醒自己不断的变得强大,变得专业,所以依托…

Linux 操作系统读写寄存器

今天与大家分享如何在 Linux 操作系统中读写寄存器,当然对于熟悉嵌入式系统的人来讲早就烂熟如心,但是还是写出来方便交流与提示后来者。 Linux 内核中操作寄存器 其实对于 Linux 内核中操作寄存器是一件特别简单的事情,首先你需要知道你要操作寄存器的地址,有可能是网卡状态寄存器,有可能是门铃…

自旋锁 spin_lock、 spin_lock_irq 以及 spin_lock_irqsave 的区别

能够停留下来认真读这篇文章的人大部分都已经了解了什么是自旋锁,至少知道自旋锁就是不停的询问资源有没有准备好的一把锁,这个从概念上很容易理解,当然他的内在也是很容易实现。 Contents1 为什么需要自旋锁1.1 为什么自旋锁会禁止抢占1.2 为什么临界区禁止睡眠2 spin_lock 系列的分别3…