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

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

Linux 各种 initcall 的调用原理

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

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

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

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

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

Linux 操作系统读写寄存器

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

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

能够停留下来认真读这篇文章的人大部分都已经了解了什么是自旋锁,至少知道自旋锁就是不停的询问资源有没有准备好的一把锁,这个从概念上很容易理解,当然他的内在也是很容易实现。 为什么需要自旋锁 很多时候我们并不能采用其他的锁,比如读写锁、互斥锁、信号量等。一方面这些锁会发生上下文切换,他的时间是不可预期的…

Linux 通用块层之拥塞控制

为什么需要拥塞控制 前面已经介绍了 Linux 操作系统通用块层中作为数据流动的关键因素 BIO,从软件的角度来讲,只要代码执行得够快,理论上就可以不停的下发数据让后端去执行。当然,都知道这是不可能的,首先局限于底层的硬件限制,磁盘速率一般也不超过 300MB/s,换成 SSD 的话会更快一下但是也…

Linux 通用块层 bio 详解

Linux Block 层在 Linux 内核设计之初就作为几大子系统存在,当然这也是得益于他的前辈 Unix 等优秀的设计。作为 IO 子系统的中间层,他为上层输出接口,为下层提供数据,像个勤劳的小蜜蜂,本文介绍通用块层中的最具传奇色彩的 bio,他就像是一个原子,是在整个 block 层的最小单…

Linux 内核驱动模块强制卸载

Linux 内核尽管是一个大而全的宏内核,包括驱动、文件系统以及内存管理等都打包带走,但是其引以为豪的模块化设计也让他吸收到了微内核所带来的模块化设计思想。这里我们不讨论到底宏内核所带来的高性能和微内核带来的高稳定性等问题,仅仅从技术的角度探讨如何强制卸载一个已经不能通过正常手段卸载的 Linux …