Linux内核设计与实现(2)第二章:内核开发的准备
第二章: 内核开发的准备
1. 获取内核源码
通过 http://www.kernel.org 获取
http://www.kernel.org
2. 内核源码的结构
目录 说明
arch 特定体系结构的代码
block 块设备I/O层
crypo 加密API
Documentation 内核源码文档
drivers 设备驱动程序
firmware 使用某些驱动程序而需要的设备固件
fs VFS和各种文件系统
include 内核头文件
init 内核引导和初始化
ipc 进程间通信代码
kernel 像调度程序这样的核心子系统
lib 同样内核函数
mm 内存管理子系统和VM
net 网络子系统
samples 示例,示范代码
scripts 编译内核所用的脚本
security Linux 安全模块
sound 语音子系统
usr 早期用户空间代码(所谓的initramfs)
tools 在Linux开发中有用的工具
virt 虚拟化基础结构
3. 内核开发特点:
1. 不能访问C库,也不能访问标准的C头文件
(原因是库大,会影响大小和效率。不过大部分常用的c函数在内核中都有实现)
2. 必须使用GUN C
3. 没有向用户态那样的内存保护机制,要注意非法访问内存地址
(内存错误导致oops 直接死机)
因为内核是最低层的程序,所以如果内核访问的非法内存,那么整个系统都会挂掉
4. 不要轻易使用浮点数,要人工保存和恢复浮点寄存器
5. 内核的每个进程堆栈很小(32为机器为8kb,64为16kb)
6. 内核很容易产生竞争条件,注意同步和并发
因为内核支持异步中断,抢占和SMP,所以必须时刻关注同步和并发
4. likely unlikely
如果能事先判断一个if语句时经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码。
if(likely(something)) //等价于 if(something) 类似于 if(1)
//表示 something 为真 情况经常发生likely
if(unlikely(!something)) //等价于 if(!something) 类似于 if(!0)
//表示 !something 为真 情况很少发生 可以忽略掉 unlikely
参考:关于likely的详细文章:likely unlikely
https://blog.csdn.net/lqy971966/article/details/105392228
5. 内联函数 inline
内联函数inline为了解决C语言中的宏#define存在的问题而诞生。
优点是:获得宏带来的效率,即免除了函数调用成本;又解决了宏的缺点,inline函数具有类型安全检查;
原理:编译器直接将内联函数插入到函数调用的地方
参考:关于inline的详细文章:通俗易懂说内联函数 inline
https://blog.csdn.net/lqy971966/article/details/88987667
6. syslog
syslog广泛应用于系统日志。可存本地或服务器上。
例子:
May 17 13:55:56 192.88.8.121 May 17 05:55:37 2021 HANI %%10
AUDIT/6/AUDIT_IPV4_LOG: -Slot=2.1; Protocol(1001)=TCP;
SrcIPAddr(1003)=1.1.1.1;SrcPort(1004)=1111;
……
Linux C中提供一套系统日记写入接口,包括三个函数:openlog,syslog和closelog。
参考:关于syslog的详细文章:linux syslog
https://blog.csdn.net/lqy971966/article/details/119449213