《内核设计与实现》第二章读书笔记
《内核设计与实现》第二章读书笔记
第二章 :从内核出发
2.1 获取内核源码
2.1.1- Git一个新版本的控制系统管理代码
2.1.2安装内核源代码
- 内核压缩以GNUzip(gzip)和bzip两种形式发布。 - bzip:默认与首选。
2.1.3安补丁:
$ patch -p1 < ../patch-x.y.z
2.2 内核源码树
- arch:待定体系结构的源码 - init:内核引导和初始化 - ipc:进程间通信代码 - kernel:像调度程序这样的核心子系统 - usr:早期用户空间代码
2.3 编译内核
2.3.1配置内核
- 配置内核选项:1.决定哪些文件编译进内核;2通过预处理命令处理代码。 - 配置选项:1.二选一;2.三选一:yes,no,module(配置项选定,但编译时功能实现的代码 以模块形式生成) - 模块:一种可以动态安装的独立代码段。 - 配置选项不控制编译过程。指定内核源码可以访问的值,一般以**预处理宏**形式表示。 - 简化内核配置的方式: A. make menucofig (遍历所有选项) B.make gconfig C.make defconfig - 验证更新配置:make oldconfig - 最后配置,编译(make)。
2.3.2减少编译的垃圾信息
make > /dev/null 将无用的输出信息重定向到永无返回值的黑洞。
2.3.3 衍生多个编译作业
- make程序能把编译过程拆分成多个并行的作业。
- make -jn (n是衍生出的作业数)
2.3.4安装新内核
- 模块的安装时自动且独立于体系结构的。
- 符号对照表:将内核符号与其起始地址对应起来。
2.4 内核开发的特点
1. 内核编程不能访问C库和标准C头文件 2. 内核编程必须使用GNU C 3. 内核编程时难以执行浮点运算 4. 给每进程一很小的定长堆栈 5. 支持异步中断、抢占和SMP,注意同步和并发 6. 考虑可移植性
2.4.1 无LIBC库或无标准头文件
- 原因:速度和大小。完整的C库,大而低效。 - printk()允许制定一个标志设置优先级。syslogd根据优先级决定在什么地方显示这条系统信息。 - 优先级标志是预处理程序定义的一个描述性字符串。
2.4.2 GNU C
GCC是多种GNU编译器的集合。 1.内联函数,函数会在所调用的位置展 优点:消除函数调用和返回的开销; 缺点:代码会变长,占用更多的内存空间或指令缓存。 2.内联汇编: GCC支持C函数中嵌入汇编指令,asm()指令嵌入汇编代码,近体系结构的底层或对时间要求严格的地方,用汇编。 3.分支声明 SUCECESS-----1 ERROR--------0
2.4.3 没有内存保护机制
内存非法访问内存导致OOPS 内存不分页。
2.4.4不轻易使用浮点数
内核通常捕获现金并着手于整数到浮点方式的转变
2.4.5容积小而固定的栈
每个处理器都有自己的栈
2.4.6同步和并发
并发地访问共享数据,要求同步机制出现竞争条件 - Linux是抢占多任务操作系统。 - 支持SMP。 - 中断异步到来。 - Linux内核可以抢占。
方法:自旋锁和信号量。
2.4.7 可移植性
将于体系结构相关的代码从内核代码树的特定目录中适当的分离出来。