gnu screen 自动修改窗口标题

screen中自动修改窗口标题,一般配置方案使用ANSI转义序列(或配合shelltitle),但是看了网上搜到的配置不太满意,尤其对于fg命令恢复进程到前台的情况。这里给出一个比较简单的配置,支持fg将进程恢复到前台执行后正确设置screen窗口标题。同时这个配置也便于灵活自定义修改特定命令的窗口标题设置。

阅读全文

stop_machine 实现

stop_machine用于停止整个机器,并在该状态下由一个CPU或指定范围的多个CPU执行指定的函数。可以看作一个很重的锁,这个锁对应的读临界区是所有关闭抢占的代码区域(比如自旋锁的临界区就是关闭抢占的)。
该调用会在每个CPU上调度一个内核线程,每个内核线程都会占据该CPU且禁用中断,并在所有CPU都被占据且禁用中断状态下由一个或指定范围的多个CPU执行由参数传入的函数指针。函数指针执行时,所有的CPU都不会持有自旋锁或处于关闭抢占区域。

阅读全文

static key & jump label

static keys通过gcc特性和代码补丁技术的支持,可以在性能敏感的快速路径内核代码中包含很少使用的特性,使得在该特性不开启的情况下,尽可能降低对正常代码分支运行性能的影响。比如分支预测和缓存交换的性能损失。一句话就是性能损耗小。

阅读全文

initcall 机制

linux内核各个子系统和内置模块都有自己的初始化函数,比如init_tracepoints,但是看不到这个函数是如何被调用的,只有__initcall(init_tracepoints)这样一条语句。这里的__initcall被宏定义为device_initcall,类似还有early_initcallpure_initcallcore_initcall等等。这些就是initcall机制,使得各个初始化函数可以按一定先后顺序被调用执行。

阅读全文

cn_proc 进程事件连接器

cn_proc(process events connector)是linux上一个直接编译进内核的驱动模块,不需要额外加载,用于发送进程事件,依赖connector模块。这里主要看一下cn_proc的工作原理和使用方式。
connector是一个依赖netlink连接用户态和内核态的通用模块。比如可以编写内核驱动和用户态程序通过connector通信,看起来与geniric netlink差不多,可以参考内核源码中的例子,这里不关心这种使用方式。

阅读全文

可执行的动态链接库

一般来说一个动态链接库是不可以直接执行的,但是也有一些例外,比如linux下libpthread,以此为例看一下动态链接库是如何做到可执行的。
至于这有什么用处,可能也就是方便输出一些版本信息编译信息吧。

阅读全文

一次无源码Linux内核模块bug分析

本文记录一次无源码的Linux内核模块bug分析与复现,定位并确认dirpro模块使用了错误的方式查找task_struct,最后给出正确的查找方式。

阅读全文

为什么生产环境服务器不应该使用ELRepo内核

互联网上有大量推荐CentOS系统更新到ELRepo内核的文章和教程,也有不在少数的生产环境服务器被更新为ELRepo内核,但是这种行为明显背离了使用CentOS发行版稳定的初衷,也不符合ELRepo的目标,生产环境使用ELRepo内核也会有明显的隐患。

阅读全文

内存一致性模型、内存屏障与同步

本文记录个人对于内存一致性、内存屏障和一些同步操作以及它们之间关系的理解,并列举linux内核中对应的部分实现。

阅读全文

抢占式RCU与RCU使用

之前在Linux RCU 内核同步机制中对RCU基本流程做了记录,这里记录一下抢占式RCU和RCU使用方面更多的理解。

由于高版本整合了抢占和非抢占RCU更新端的API,不再有synchronize_rcu/synchronize_sched/synchronize_rcu_bh这种区分了,只在临界区API中保留了不同RCU的区别。因此本文在抢占式RCU段落以外的内容,均假定为未开启抢占配置。

阅读全文