Linux内核分析——第二章 从内核出发
第二章 从内核出发
一、获取内核源码
1、Git是分布式的;下载和管理Linux内核源代码;
2、获取最新提交到版本树的一个副本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
当下载代码后,更新自己的分支到最新分支 $ git pull
3、安装内核源代码
(1)压缩形式为bzip2
运行:$ tar xvjf linux-x.y.z.tar.bz2
(2)压缩形式为zip
运行:$ tar xvzf linux-x.y.z.tar.gz
4、使用补丁
从内部源码树开始,运行$ patch -p1 < ../patch-x,y,z
二、内核源码树


COPYIN:内核许可证;
CREDITS:内核代码的开发者列表;
MAINTAINTERS:维护者列表——负责维护内核子系统和驱动程序;
Makefile:是基本内核的Makefile;
三、编译内核
1、配置内核
(1)字符页面的命令行工具:$ make config
(2)图形界面工具:$ make menuconfig
(3)配置项的二选一和三选一:
二选一:yes 或者 no
三选一:yes 或者 no 或者 module(以模块生成)
(4)其他的几种配置:
$ make defconfig //基于默认配置
$ make oldconfig //验证和更新配置
(5).config文件:配置项会被存放在内核代码树根目录下。
$ zcat /proc/config.gz > .config 目前的内核已经启用了CONFIG_IKCONFIG_PROC选项,可以从/proc下复制文件;
$ make oldconfig 便以一个新内核;
$ make 编译该配置好的内核;
2、减少编译的垃圾信息
(1)少看到垃圾信息却不错过错误报告和警告信息,对输出重定向
$ make > ../detritus
(2)把无用的输出信息重定向到永无返回值的黑洞/dev/null中
$ make > /dev/null
3、衍生多个编译作业
(1)以多个作业编译内核
$ make -jn (j:指定同时执行多任务;n:要衍生出的作业数)
(2)16核处理器
$
make -j32 > /dev/null
4、安装新内核
(1)以root身份,运行,把所有已编译的模块安装到正确的主目录/lib/modules下。
% make modules_install
(2)System.map文件:编译时在内核代码树的根目录下创建的文件;是一个符号对照表;用来将内核符号与它们的起始地址对应起来;调试时,把内存地址转化为函数名和变量名,很有用。
四、内核开发的特点
1、内核开发有一些独特之处:
(1)内核开发时既不能访问C库也不能访问标准的C头文件。
(2)内核编程时必须使用GNU C。
(3)内核编程时缺乏像用户空间那样的内存保护机制。
(4)内核编程时难以执行浮点运算。
(5)内核给每个进程只有一个很小的定长堆栈。
(6)由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
(7)要考虑可移植性的重要性。
2、无libc库抑或标准头文件
内核不能链接使用标准C函数库。
3、头文件
(1)基本头文件位于内核源代码顶级目录下的include中。
(2)体系结构相关头文件:内核源代码树arch/<architecture>/include/asm目录下。
4、GNU C
GCC是多种GNU编译器的集合。
5、内联函数
定义一个内联函数,用static作关键字,用inline限定它。
static inline void wolf(unsigned long
tail_size);
6、内联汇编
用asm()指令嵌入汇编代码
unsigned int low, high;
asm volatile("rdtsc" :
"=a" (low), "=d" (high)); //low 和 high 分别包含64位时间戳的低32位和高32位
7、分支声明
(1)/* error在绝大多数情况下为0 */
if
(unlikely(error)) {
/* ... */
}
(2) /* success在通常不为0 */
if (likely(success)) {
/* ... */
}
如果判断正确,性能会提升;如果搞错,性能反而下降。
8、没有内存保护机制
(1)在内核中,不该访问非法的内存地址,引用空指针,否则内核会over;
(2)内核中的内存不分页:每用掉一个字节,物理内存都减少一个;
9、不用轻易在内核中使用浮点数
与用户空间进程不同,内核不完美支持浮点操作,因为他本身不能陷入;
10、容积小而固定的栈
(1)用户空间的栈本身比较大,而且可以动态增长。
(2)对于不用的体系结构,内核栈的大小不一样并都是固定的。
11、同步和并发
内核易产生竞争条件,许多特性都要求能过并发地访问共享数据,就要求同步机制以保证不出现竞争条件,特别是:
(1)Linux是抢占多任务操作系统.
(2)Linux内核支持对称多处理器系统(SMP)。
(3)中断异步到来。
(4)Linux内核可以抢占。
常用解决方法:自旋锁和信号量
12、可移植性的重要性
Linux是可移植的操作系统。
五、小结
1、内核有独一无二的特质。
2、它实施自己的规则和奖惩措施,拥有整个系统的最高管理权。
Linux内核分析——第二章 从内核出发的更多相关文章
- Linux内核分析 一二章读书笔记
第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...
- linux内核分析第二周
网易云课堂linux内核分析第二周 20135103 王海宁 <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- LINUX内核分析第二周学习总结——操作系统是如何工作的
LINUX内核分析第二周学习总结——操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- Linux内核分析第二周学习笔记
linux内核分析第二周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第二周--操作系统是如何工作的
Linux内核分析第二周--操作系统是如何工作的 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码
Linux内核分析第二周学习博客 本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程. 实验主要步骤如下: 代码分析: void my_process(void) { int i = ...
- 《Linux内核设计与实现》读书笔记 第二章 从内核出发
一.获取内核源码 1. Git git实际上是一种开源的分布式版本控制工具. Linux作为一个开源的内核,其源代码也可以用git下载和管理 - 获取最新提交到版本树的一个副本 - $ git clo ...
- Linux内核分析第二周学习总结:操作系统是如何工作的?
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 ...
- Linux内核分析第二周:操作系统是如何工作的
第一讲 函数调用堆栈 计算机是如何工作的? (总结)——三个法宝 1,存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 2,函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆 ...
随机推荐
- Java的数组堆溢出问题
在写测试方法的时候,生成了一个数组,之后报了堆溢出错误,这样的报错一般来说只要有一些JVM的基础都知道要用-Xmx.-Xms来开更大的堆,接下来看看我碰到的一个堆溢出的问题 在测试代码中开了一个500 ...
- Spring IOC容器创建bean过程浅析
1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...
- ftp传输文件到指定服务器
#!/bin/bash filePrefix="dbname"localDir="/DBBackup"remoteDir="/Backup" ...
- ATP学姐的模拟赛
ATPの水题大赛 声明:不是我觉得这题水,这就是本场模拟赛的名称. T1:求所有的$n$位数中有几个数满足:每一位要么是$A$要么是$B$,并且这个$n$位数的每一位加起来是$A$或$B$的倍数. $ ...
- BZOJ4340:[BJOI2015]隐身术(后缀数组,ST表,DFS)
Description 给定两个串A,B.请问B中有多少个非空子串和A的编辑距离不超过K? 所谓“子串”,指的是B中连续的一段.不同位置的内容相同的子串算作多个. 两个串之间的“编辑距离”指的是把一个 ...
- [CQOI2009]叶子的染色
传送门:https://www.luogu.org/problemnew/show/P3155 一道挺水的树形dp题,然后我因为一个挺智障的问题debug了一晚上…… 嗯……首先想,如果一个点的颜色和 ...
- hadoop学习通过虚拟机安装hadoop完全分布式集群
要想深入的学习hadoop数据分析技术,首要的任务是必须要将hadoop集群环境搭建起来,可以将hadoop简化地想象成一个小软件,通过在各个物理节点上安装这个小软件,然后将其运行起来,就是一个had ...
- android 7.0以上共享文件(解决调用系统照相和图片剪切出现的FileUriExposedException崩溃问题)
在android7.0开始试共享“file://”URI 将会导致引发 FileUriExposedException. 如果应用需要与其他应用共享私有文件,则应该使用 FileProvider, F ...
- jQuery的extend和fn.extend理解
参考网址:http://www.cnblogs.com/yuanyuan/archive/2011/02/23/1963287.html http://www.cnblogs.com/xuxiuyu/ ...
- 翻译 | The Principles of OOD 面向对象设计原则
本文首发于vivo互联网技术微信公众号 https://mp.weixin.qq.com/s/Q_pziBUhKRywafKeY2T7YQ 作者:Robert C. Martin 翻译:张硕 本文由来 ...