《Linux内核设计与实现》第一二章读书笔记
第一章 Linux内核简介
1.Unix简介
(一)概念:支持抢占式多任务、多进程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。
(二)Unix特点(层次化结构):
- Unix很简洁,仅提供几百个系统调用并有非常明确的设计目的。
- 在Unix中,所有东西都当作文件对待,所以对数据和对设备的操作是通过相同的系统调用接口来进行;
- 移植能力强,Unix内核和相关系统工具软件是由C语言编成;
- 进程创建非常迅速,一次执行保质保量完成一个任务,并有独特的fork()系统调用;
- 提供简单有稳定的进程间通信元语,将简单程序方便的组合起来。
2.Linux简介:
Linux系统的基础是内核、C库、工具集和系统的基本工具。
3.操作系统与内核简介:
1.操作系统:整个系统中负责完成最基本功能和系统管理的部分。
2.内核(操作系统的内在核心,一般处于系统态):
由响应中断的中断服务程序;管理多个进程,分享处理器时间调度程序;管理进程地址空间的内存管理程序;网络、进程间通信等系统服务程序组成。
3.内核空间:系统态和被保护起来的内存空间
4.系统调用:应用程序与内核通信。应用程序通过系统调用界面陷入内核是应用程序完成工作的基本行为方式。
5.内核活动的范围:

(1)运行于用户空间,执行用户进程
(2)运行于内核空间,处于进程上下文,代表某个特定的进程执行
(3)运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断.
6.Unix内核通常需要硬件系统提供页机制(MMU)以管理内存,这样可以加强对内存空间的保护,并可以保证每个进程都运行于不同的虚地址空间上。
7.单内核与微内核比较:
(1)单内核——以单个静态二进制文件形式存放于磁盘中,所有内核服务在一个大内核地址空间上运行。
特点:内核可以直接调用函数,简单并性能高。但一个功能的崩溃会导致整个内核无法使用。
(2)微内核——内核按功能被划分成各个独立的过程。每个过程叫做一个服务器。所有服务器独立并运行在自己的地址空间上。
特点:通过消息传递处理为内核通信,采用进程间通信(IPC)机制。安全。一个服务器失效不会影响其他服务器。内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。
8.Linux内核总结:
为单内核,但具备微内核的一些特征:模块化设计、抢占式内核、支持内核线程、动态装载内核模块。同时避微内核设计上的性能缺陷:让所有事情运行在内核态,直接调用函数,无需消息传递。支持动态加载内核模块;支持对称多处理(SMP);内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力;不区分线程和进程;提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统(sysfs)。
内核版本(稳定的和处于开发中的):

第二章 从内核出发
一、获取内核源码
使用Git(管理内核源码的分布式控制系统)
获取最新提交到Linus版本树的一个副本:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git下载代码后,更新自己的分支到最新分支:
$ git pull
2.安装内核源代码
两种形式:GNU zip(gzip)和bzip2【默认和首选形式】。
压缩形式是bzip2,运行:
$ tar xvjf linux-x.y.z.tar.bz2
压缩形式是GNU zip,运行:
$ tar xvzf linux-x.y.z.tar.gz
参数详解:
-x 解开.tar格式的文件
-v 显示详细信息
-j 使用bzip2程序
-z 使用gzip程序
-f 使用归档文件
3.使用补丁
从内部源码树开始,运行 $ patch -p1 < ../patch-x,y,z
二、内核源码结构



三、编译内核
1. 配置内核(关于make与config)
(1)配置形式:CONFIG_FEATURE
(2)配置项:二选一为yes或no,三选一为yes(把代码编译进主内核映像中)、no和module(该配置项被选定,但编译时功能的实现代码以模块的形式生成)。驱动程序一般用三选一。
(3)配置编译过程:
• make config:遍历所有配置项,并让用户选择
• make deconfig:基于默认的配置
• make oldconfig:先将/boot目录下的配置文件写进.config文件中,采用的是注释的形式写进新增加的功能。
• zcat /proc/config.gz > .config:配置选项CONFIG_IKCONFIG_PROC把完整的压缩过的内核配置文件存放在/
proc/config.gz中,再次编译时可以方便地克隆当前的配置。
• make:默认的Makefile自动化编译。
2.减少编译的垃圾信息
(1)将错误报告和警告信息重定向到文件中:$ make > ../detritus
(2)把无用的输出信息重定向到无返回值的/dev/null中:$ make > /dev/null
3.衍生多个编译作业
make程序能把编译过程拆分成多个并行的作业。其中每个作业独立并发地运行,有助于加快多处理器系统上的编译过程,也有利于改善处理器的利用率。默认情况下,make只衍生一个作业。
以多个作业编译内核:$ make –jn(n是要衍生出的作业数)
4.安装新内核
把所有已编译的模块安装到正确的主目录/lib/modules下:% make modules_install
编译时在内核代码树的根目录下创建一个System.map文件(符号对照表),用来将内核符号与它们的起始地址对应起来。
四、内核开发特点
1.无libc库抑或无标准头文件
(1)内核不能链接使用标准C函数库,因为太大且太低效了。
(2)内核源代码文件不能包含外部头文件。
(3)基本头文件位于内核源代码顶级目录下的include中
(4)体系结构相关头文件位于内核源代码树的arch//include/asm目录下
(5)printk()函数:把格式化好的字符串拷贝到内核日志缓冲区上,syslog程序可以通过读取该缓冲区来获取内核信息。Printk()允许通过制指定一个标志来设置优先级。
2.GNU C
(1)内联函数
——对时间要求比较高,本身长度比较短的函数
定义内联函数时,需要用static作为关键字,并用inline限定:
static inline void wolf(unsigned long tail_size);
注意:使用之前就要定义好内联函数,一般在头文件中定义。
为了类型安全和易读性,优先使用内联函数而不是复杂的宏。
(2)内联汇编
通常使用asm()嵌入汇编代码:
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low 和 high 分别包含64位时间戳的低32位和高32位 */
Linux内核混合使用了C语言和汇编语言,在偏近体系结构的底层或对执行时间严格要求的地方使用汇编语言。
(3)分支声明
对于条件选择语句,在一个条件经常/很少出现时,编译器可通过gcc内建的一条指令对条件分支选择进行优化。内核把这条指令封装成了宏。
if (error) {
/* ... */
}
/* 如果error在绝大多数情况下为0(假) */
if (unlikely(error)) {
/* ... */
}
/* 如果success在绝大多数情况下不为0(真) */
if (likely(success)) {
/* ... */
}
3. 没有内存保护机制
(1)内核发现非法的内存访问会发送SIGSEGV信号并结束整个进程。但自己非法访问内存的风险很大。
(2)内核中的内存都不分页,所以每用掉一个字节,物理内存都减少一个
4. 不要在内核中轻易使用浮点数
若使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。
5. 容积小而固定的栈
用户空间的栈可以动态增长。但内核栈的准确大小随体系结构而变,都是固定的。每个进程都有自己的栈。
6.同步和并发
• Linux是抢占多任务操作系统
• 内核支持对称多处理器系统(SMP)
• 中断是异步到来的
• Linux内核可以抢占
常用的解决竞争的办法是自旋锁和信号量
7.可移植性的重要性
Linux是可移植的操作系统,即大部分C代码与体系结构无关。因此,把与体系结构相关的代码从内核代码树的特定目录中适当地分离出来。
五、小结
内核有独一无二的特质,拥有整个系统的最高管理权,是操作系统的核心。书的前两章对内核做了简单的介绍。我认为虽然现在可能对其还不是很了解,但是通过学习应该会获得许多有用的知识。就像书中说的,最重要的是阅读和修改内核源代码,只有通过实际的阅读和实践才会理解内核。而内核源代码又可以免费获取,所以今后的学习一定要多动手多实践,利用起来有用的资源做高效的学习~
《Linux内核设计与实现》第一二章读书笔记的更多相关文章
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- LINUX内核设计与实现第三周读书笔记
LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- 《Linux内核设计与实现》Chapter 1 读书笔记
<Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...
- 《Linux内核设计与实现》Chapter 2 读书笔记
<Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...
- 《Linux内核设计与实现》Chapter 5 读书笔记
<Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...
- 《Linux内核设计与实现》Chapter 18 读书笔记
<Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...
- Linux内核分析第一二章读书笔记
linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
随机推荐
- leetcode 486 预测赢家
题目描述 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,--.每次一个玩家只能拿取一个分数,分数被拿取之后不再可取.直到没 ...
- 团队作业——Alpha冲刺 3/12
团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:完成Android开发环境的搭建,学习基础开发知识 明日任务:继续学习Android开发知识,与其他成员协商,了解自己需要完成的开发任务, ...
- node封装mysql操作
前言 node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果.但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一 ...
- Redis系列七:redis持久化
redis支持RDB和AOF两种持久化机制,持久化可以避免因进程退出而造成数据丢失 一.RDB持久化 RDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发 手动触发 ...
- Python中__init__()方法注意点
此文转自https://www.cnblogs.com/zyxstar2003/archive/2011/03/21/1989954.html 1.__init__并不相当于C#中的构造函数,执行它的 ...
- OpenCV——直方图计算、寻早最值位置和对比匹配(判断两幅图的相似程度)
- python3 raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbid
1.分析: 如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信 ...
- jqgrid 单击行启用行编辑,切换行保存原编辑行
为了加速表格互动编辑,我们往往希望通过选中行就触发了行编辑,完成行编辑后,再选中另一个行做编辑,同时上一个编辑行被自动保存,直至完成需要的编辑内容. 页面效果可能如下: 1)设置需要编辑的列 edit ...
- jqgrid 分页时,清空原表格数据加载返回的新数据
由于,我们是动态分页,分页后的数据是在触发分页后动态加载而来.如何使jqgrid清空原数据而加载新数据? 1)调用jqgrid的 clearGridData 方法清空表格数据 2)调用jqgrid的 ...
- jquery练习笔记
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...