1.获取内核源码

1.1Git

分布式的;下载和管理Linux内核源代码;

- 获取最新提交到版本树的一个副本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
- 下载代码后,更新自己的分支到最新分支
$ git pull

1.2安装内核源代码

- 压缩形式为bzip2
运行:$ tar xvjf linux-x.y.z.tar.bz2
- 压缩形式为zip
运行:$ tar xvzf linux-x.y.z.tar.gz - 注释(xvjf、xvzf):
-x 解开;
-v 显示详细信息;
-j 使用bzip2程序;
-z 使用gzip程序;
-f 使用归档文件;

1.3使用补丁

- 从内部源码树开始
运行$ patch -p1 < ../patch-x,y,z

2.内核源码树

(详见书《Linux内核设计与实现》原书第3版 第11—12页表2-1内核源码树的根目录描述)

COPYIN:内核许可证;
CREDITS:内核代码的开发者列表;
MAINTAINTERS:维护者列表——负责维护内核子系统和驱动程序;
Makefile:是基本内核的Makefile;

3.编译内核

3.1配置内核(关于make与config)

- 配置选项(指定内核源码可以访问的值,一般以预处理宏的形式表示)
1.决定哪些文件编译进内核;通过预处理命令处理代码。
2.二选一:yes/no
3.三选一:yes(把代码编译进主内核映像中)/no/module(该配置项被选定了)【驱动程序一般是三选一】
4.可以是字符串或整数 - 配置工具:
$ make config 配置命令解释器,最简单的一个字符界面下的命令行工具;
$ make menuconfig 配置用户界面,基于ncurse库的图形界面工具;
$ make gconfig 基于gtk+的图形工具;
$ make defconfig 基于默认的配置为个人的体系结构创建一个配置;
$ make oldconfig 验证和更新配置;
- .config文件:配置项会被存放在内核代码树根目录下。
	$ zcat /proc/config.gz > .config 目前的内核已经启用了CONFIG_IKCONFIG_PROC选项,可以从/proc下复制文件;
$ make oldconfig 便以一个新内核;
$ make 编译该配置好的内核;

3.2减少编译的垃圾信息

	- 不看错误报告和警告信息,对输出重定向
$ make > ../detritus
- 把无用的输出信息重定向到永无返回值的黑洞/dev/null中
$ make > /dev/null

3.3衍生多个编译作业

- 以多个作业编译内核
$ make -jn (j:指定同时执行多任务;n:要衍生出的作业数)
- 16核处理器
$ make -j32 > /dev/null

3.4安装新内核

- 以root身份,运行,把所有已编译的模块安装到正确的主目录/lib/modules下。
% make modules_install
- System.map文件:编译时在内核代码树的根目录下创建的文件;是一个符号对照表;用来将内核符号与它们的起始地址对应起来;调试时,把内存地址转化为函数名和变量名,很有用。

4.内核开发的特点

4.1无libc库抑或标准头文件

主要原因:速度与大小。

4.1.1头文件

- 基本头文件位于内核源代码顶级目录下的include中。
-体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下

4.2GNU C

GCC是多种GNU编译器的集合。

4.2.1内联函数

- 定义一个内联函数,用static作关键字,用inline限定它。
static inline void wolf(unsigned long tail_size);

4.2.2内联汇编

- 用asm()指令嵌入汇编代码
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high)); //low 和 high 分别包含64位时间戳的低32位和高32位

4.2.3分支声明

- /* error在绝大多数情况下为0 */
if (unlikely(error)) {
/* ... */
} - /* success在通常不为0 */
if (likely(success)) {
/* ... */
} - 如果判断正确,性能会提升;如果搞错,性能反而下降。

4.3没有内存保护机制

在内核中,不该访问非法的内存地址,引用空指针,否则内核会over;
内核中的内存不分页:每用掉一个字节,物理内存都减少一个;

4.4不用轻易在内核中使用浮点数

与用户空间进程不同,内核不完美支持浮点操作,因为他本身不能陷入;

4.5容积小而固定的栈

用户空间的栈本身比较大,而且可以动态增长;
对于不用的体系结构,内核栈的大小不一样并都是固定的;

4.6同步和并发

- 内核易产生竞争条件,许多特性都要求能过并发地访问共享数据,就要求同步机制以保证不出现竞争条件,特别是:
• Linux是抢占多任务操作系统
• Linux内核支持对称多处理器系统(SMP)
• 中断异步到来
• Linux内核可以抢占
- 常用解决方法:自旋锁和信号量

4.7可移植性的重要性

Linux是可移植的操作系统。

5.小结

内核有独一无二的特质,拥有整个系统的最高管理权。

2013337朱荟潼 Linux第二章读书笔记——从内核出发的更多相关文章

  1. 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介

    一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...

  2. 2013337朱荟潼 Linux第五章读书笔记——系统调用

    摘要: [20135337朱荟潼]原创作品转载请注明出处 第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核 ...

  3. 20135320赵瀚青LINUX第二章读书笔记

    第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...

  4. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  5. 2013337朱荟潼 Linux第四章读书笔记——进程调度

    第4章 进程调度 0. 总结 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时 ...

  6. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  7. 2013337朱荟潼 Linux第十八章读书笔记——调试

    第十八章 调试 0.总结 oops 内核的调试配置 用Git进行二分搜索 bug总会有,简洁描述发给LKML 1. 准备开始 在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2. 内核中的b ...

  8. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的

    一.计算机是如何工作的--总结 三个法宝 存储程序计算机.函数调用堆栈.中断机制 二.堆栈 1.是c语言程序运行时必须的一个记录调用路径和参数的空间. 函数调用框架.传递参数.保存返回地址.提供局部变 ...

  9. Linux第二章读书笔记

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

随机推荐

  1. Sublime2 DocBlocker插件在自动补全注释时输出自定义作者和当前时间等信息

    Sublime在进行前端开发时非常棒,当然也少不了众多的插件支持,DocBlocker是在Sublime平台上开发一款自动补全代码插件,支持JavaScript (including ES6), PH ...

  2. ES6中变量解构的用途—遍历Map结构

  3. Oracle 12C Data Gurad RAC TO RAC

    Oracle 12C RAC TO RAC Data Guard on RHEL7 0.环境说明   primary db physical standby 操作系统 rhel7 x86_64 rhe ...

  4. 筛选法求N以内的所有素数

    素数:一个数只能被1和它本身整除的数.2是最小的素数 #include <iostream> using namespace std; #define NUM 100 ]; int mai ...

  5. nodeSelector + deamonset

    DaemonSet 配置文件的语法和结构与 Deployment 几乎完全一样,只是将 kind 设为 DaemonSet. 选择运行节点:当指定.spec.template.spec.nodeSel ...

  6. centos 7 配置iptables(转) + iptabes规则理解

    一.防火墙配置 1.检测并关闭firewall 1 2 3 4 5 systemctl status firewalld.service #检测是否开启了firewall   systemctl st ...

  7. 微信小程序开发 [07] 写在后面的话

    写在后面的话基本算是吐槽了,在学完小程序的课程之后,我用博客园的api,写了个闪存的小程序,本来兴致勃勃甚至这篇是准备写"我的第一个小程序发布啦",然而并没有. 不是说我偷懒了没写 ...

  8. go语言之行--golang核武器goroutine调度原理、channel详解

    一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字 ...

  9. 20155310 《网络对抗》Exp 8 Web基础

    20155310 <网络对抗>Exp 8 Web基础 基础问题回答 (1)什么是表单 表单是一个包含表单元素的区域. 表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等 ...

  10. mfc Unicode转 ASNI ,WCHAR 转 CHAR

    知识点: 宽字符转多字节字符 多字节字符转宽字符 什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit 在VC ...