linux kernel 代码相关
代码版本:linux-4.9.327
(最老的一个 long term 版)
多年来第一次鼓起勇气开 linux 源码
感觉也没有那么吓人(?)
不得不感慨 open source 以及 free software 真的是好文明
想想应该早点来看的
linux kernel 绝对是软件工程上的高质量代码典范
有效注释和函数命名让代码可读性极高
开源社区的巅峰
比某些屎山代码高到不知道哪里去了
代码结构
linux
block : 块设备
blk-mq : 多队列
drivers : 一坨驱动?
android / gpu / fpga ... etc ...
include : 常用头文件
linux
list.h
types.h
blkdev.h : request_queue
lib : 常用功能函数 ?
sbitmap.c : fast and scalable bitmaps
比较奇怪的是linux中文件和目录的命名,分隔符用 -
和 _
的都有,不知道这两个方法之间有没有什么区别,个人来讲 c 写多了会更习惯下划线。查了一下两种在 linux 里面都是可接受的
defs
硬件中断处理优先级最高,因为如果不立即处理,则会引入高延迟降低用户体验,或者硬件 buffer 填满导致数据丢失
EXPORT_SYMBOL_GPL : GPL 协议的外部模块可以使用的函数
irq : interrupt request from device
BUG_ON(cond) : cond 为真时触发 bug
系统相关
wait_event(wq, condition) : 当前进程 sleep 直到 condition 为 true
percpu_ref : 引用计数,通常引用计数使用 atomic_t,在多次使用的情况下 percpu_ref 提高扩展性
数据结构
list
struct list_head {
struct list_head *next, *prev;
};
tricks
continer_of
def in tools/virtio/linux/kernel.h
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
指针 ptr 指向一个 type 类型结构体中 member 参数,返回该结构体的指针
计时相关
kernel 版本 3.10
计时函数 ktime_get
定义在 include/linux/hrtimer.h
中,实现在 kernel/time/timekeeping.c
中
在内核模块中 #include<linux/***.h>
对应 include/linux
下的头文件