《Linux内核设计与实现》Chapter 2 读书笔记
《Linux内核设计与实现》Chapter 2 读书笔记
一、获取内核源码
1.使用Git
我们曾经在以前的学习中使用过Git方法
$git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
更新分支到Linux的最新分支
$ git pull
可以获取并随时保持与内核官方的代码树一致
2.安装内核源代码
压缩形式为bzip2
$ tar xvjf linux-x.y.z.tar.bz2
压缩形式为zip
$ tar xvzf linux-x.y.z.tar.gz
如果使用git获取和管理内核源代码,就不需要下载压缩文件,运行git clone命令,git就会下载解压最新的源代码。
内核源代码一般安装在/usr/src/linux目录下,不要将其用于开发。不要以root身份对内核进行修改。
使用补丁
$ patch -p1 < ../patch-x.y.z
二、内核源码树


三、编译内核
目的:把自己需要的特定功能和驱动程序编译进内核。
1.配置内核
①可以配置的各种变量都以CONFIG_前缀表示。
- 二选一
- yes
- no
- 三选一
- yes
- no
- module
module指该配置项被选定了,但实现代码以模块的形式生成
配置选项也可以是字符串或整数
②配置工具
$ make config 最简单的一种字符界面下的命令行工具;
$ make menuconfig 基于ncurse库的图形界面工具;
$ make gconfig 基于gtk+的图形工具;
$ make defconfig 基于默认的配置为个人体系结构创建一个配置;
$ make oldconfig 验证和更新配置;
如果内核已经启用了CONFIG_IKCONFIG_PROC选项(把完整的压缩过的内核配置文件存放在/proc/config.gz下),可以从/proc下复制配置文件,并用它编译一个新内核。
$ zcat /proc/config.gz > .config
$ make oldconfig
内核配置好了,就可以编译它啦
$ make
2.减少编译的垃圾信息
- 如果想少看垃圾信息,却又不错过错误报告和警告信息,对输出重定向
$ make > ../detritus - 把无用的输出信息重定向到永无返回值的黑洞/dev/null中
$ make > /dev/null
3.衍生多个编译作业
- 以多个作业编译内核
$ make -jn (n:要衍生出的作业数) - 16核处理器
$ make -j32 > /dev/null
4.安装新内核
以root身份运行
- $ make modules_install
所有已编译的模块都会安装到lib/modules下
四、内核开发的特点
1.内核编程时不能访问C库和标准C头文件
- 基本头文件位于内核源代码顶级目录下的include/linux文件夹中
- 体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下
2. 内核编程时必须使用GNU C
- 内联函数:函数会在所调用的位置上展开,
用static作关键字,用inline限定它。- 优点:消除函数调用和返回的开销
- 缺点:代码会变长,占用更多的内存空间或指令缓存。
- 内联汇编:通常使用asm()指令嵌入汇编代码
unsigned int low, high;asm volatile("rdtsc" : "=a" (low), "=d" (high)); //low 和 high 分别包含64位时间戳的低32位和高32位
- 分支声明
if (unlikely(error)) {
/* ... */
}
- x很少出现,绝少发生,通常为假
if (likely(success)) {
/* ... */
}
- y经常出现,通常为真
3.内核编程时缺乏像用户空间那样的内存保护机制
- 在内核中,不该访问非法的内存地址,引用空指针,否则内核会over;
- 内核中的内存不分页:每用掉一个字节,物理内存都减少一个;
4. 内核编程时难以执行浮点运算
与用户空间进程不同,内核不完美支持浮点操作
5. 内核给每个进程只有一个很小的定长堆栈
对于不用的体系结构,内核栈的大小不一样并都是固定的;
6. 内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
7. 要考虑可移植的重要性
《Linux内核设计与实现》Chapter 2 读书笔记的更多相关文章
- 《Linux内核设计与实现》 Chapter4 读书笔记
<Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...
- Linux内核设计与实现第四周读书笔记
第5章系统调用 5.1与内核通信 主要作用: 为用户控件提供了一种硬件的抽象接口. 保证了系统稳定性与安全性. 为用户空间&系统提供公共接口. 5.2API.POSIX和C库 一般情况,应用程 ...
- 《Linux内核分析》第六周 读书笔记
<Linux内核设计与实现>CHAPTER3阅读梳理 [学习时间:3hours] [学习内容:进程的描述:进程的生命周期(包括创建.终结)] 一.进程(任务)描述 1.进程是处于执行期的程 ...
- linux内核分析 1、2章读书笔记
一.linux历史 20世纪60年代,MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机: 1965年,Bell实验室.MIT.GE(通用电 ...
- 《Linux内核分析》第七周 读书笔记
<深入理解计算机系统>CHAPTER7阅读梳理 [学习时间:3hours] [学习内容:链接需要的代码&数据:链接机制:链接生成的目标文件] 一.链接概述 1.链接 定义:链接是将 ...
- 《Linux内核设计》第17章学习笔记
- 《linux内核》课本第五章读书笔记
- 《Linux内核设计与实现》课本第一章&第二章学习笔记
<Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- 《Linux内核设计与实现》Chapter 1 读书笔记
<Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...
随机推荐
- 【2018暑假集训模拟一】Day2题解
T1 园艺工人的求助 [题目描述]终于,在一段繁忙的训练之后,到了NOIP 的举办的时候.同学们坐上了大巴车,享受着沿途的风光,讨论着未解决的问题,憧憬着NOIP 赛场上切题的样子.很快,大巴车到了大 ...
- 【转】默认网关有什么用?我应当怎么填写默认网关和DNS呢
默认网关有什么用?我应当怎么填写默认网关和DNS呢? 目前使用的是pppoe方式上网,无猫,只是将一根入户的网线插在无线路由上面,然后在路由中设置ppoe方式上网,输入帐号密码.一般电脑和手机全设成了 ...
- 问题解决:Apache: You don't have permission to access / on this server
虚拟主机(Virtual Host)是指在一个机器上运行多个网络站点 (比如:www.company1.com和www.company2.com). 如果每个网络站点拥有不同的IP地址,则虚拟主机可以 ...
- stl vector、红黑树、set、multiset、map、multimap、迭代器失效、哈希表(hash_table)、hashset、hashmap、unordered_map、list
stl:即标准模板库,该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法 六大组件: 容器.迭代器.算法.仿函数.空间配置器.迭代适配器 迭代器:迭代器(iterator)是一种抽象的设计 ...
- MP实战系列(十五)之执行分析插件
SQL 执行分析拦截器[ 目前只支持 MYSQL-5.6.3 以上版本 ],作用是分析 处理 DELETE UPDATE 语句, 防止小白或者恶意 delete update 全表操作! 这里我引用M ...
- 关于 clock tree
1. create_clock 时,不要定义在 hierarchical pin 上,否则 cts 时会忽略这个 clock ,详见 CTS-811 Warning,解法是将其定义到实际存在的 p ...
- Python2.7-random
random 模块,实现了各种分布下的伪随机数生成器.对于整数,可以从一个范围中随机挑选:对于序列,可以随机挑选其中的元素但不改变原序列,也可以对序列中的元素进行重新排列.此外,模块还封装了各种分布函 ...
- poj 3169 Layout(线性差分约束,spfa:跑最短路+判断负环)
Layout Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15349 Accepted: 7379 Descripti ...
- 一键安装Docker图形化管理界面-Shipyard
Shipyard是一款开源的图形化的Docker管理工具,记得以前安装很麻烦的,现在官方有了自动安装脚本,使用非常方便.复制.粘贴.使用,就这么简单.先不研究他是如何实现的,安装使用起来再说. $ c ...
- 使用navicat连接mysql时报错:2059 - authentication plugin 'caching_sha2_password'
首先从本地登录mysql数据库,进入mysql控制台,输入如下命令: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_passwo ...