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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值