《linux内核设计与实现》读书笔记第一、二章
第一章 Linux内核简介
1.1 Unix的历史
1971年,Unix被移植到PDP-11型机中。
1973年,Unix操作系统用C语言改写——为Unix系统的广泛移植铺平了道路。
1977年,伯克利推出1BSD系统
1994年,伯克利推出Unix系统的最终官方版——4.4BSD
unix强大的根本原因
(1)简洁:仅提供系统调用并有一个非常明确的设计目的
(2)抽象:所有东西都被当做文件对待
(3)可移植性:使用C语言编写,可移植能力强
(4)进程:创建迅速,独特的fork系统调用 ;
(5)清晰的层次化结构:一次执行保质保量地完成一个任务,策略和机制分离的理念,简单的进程间通信元语把单一目的的程序方便地组合在一起
1.2 追寻Linux足迹:Linux简介
1991年,Liunx Torvalds开发了Linux
Linux的特点:
(1)是类Unix系统,但不是Unix
(2)没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致。
(3)Linux系统的基础是内核、C库、工具集和系统的基本工具。
1.3 操作系统和内核简介
操作系统
是指整个系统中负责完成最基本功能和系统管理的那些部分。包括
内核、设备驱动程序、启动引导程序、命令行shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
内核
被称作是管理者或者操作系统的核心。其组成包括:
(1)响应中断的中断服务程序
(2)管理多个进程,分享处理器时间的调度程序
(3)管理进程地址空间的内存管理程序
(4)网络、进程间通信等系统服务程序
每个处理器在任何指定时间点上的活动必然概括为下列三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
1.4 Linux内核和传统Unix内核的比较
单内核和微内核设计之比较
Linux的内核虽然是基于单内核的,也具备微内核的一些特征。 主要有以下特征:
- 支持动态加载内核模块
- 支持对称多处理(SMP)
- 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
- 不区分线程和进程
1.5 Linux内核版本
版本号:2.6.26.1 其中,
2 —— 主版本号
6 —— 从版本号或副版本号
26 —— 修订版本号
1 —— 稳定版本号副版本号表示这个版本是稳定版(偶数)还是开发版(奇数),上面例子中的版本号是稳定版
1.6 Linux内核开发者社区
可以在http://vegr.kernel.org上订阅邮件。
第二章 从内核出发
2.1 获取内核源码
2.1.1 使用Git
- 获取最新提交到版本树的一个副本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git- 下载代码后,更新自己的分支到最新分支
$ git pull
有了这两个命令,就可以获取并随时保持与内核官方的代码数一致。
2.1.1 安装内核源代码
内核压缩以GNU zip和bzip2两种
- 压缩形式为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 使用归档文件;
内核源码一般安装在/usr/src/linux目录下。
不要以root身份对内核进行修改。
2.1.3 使用补丁
应用增量补丁,从内部代码树开始,只需运行
$ patch -p1 < ../patch-x,y,z
2.2 内核源码树
目录 | 说明 |
arch | 特定体系结构的代码 |
block | 块设备I/O层 |
crypo | 加密API |
Documentation | 内核源码文档 |
drivers | 设备驱动程序 |
firmware | 使用某些驱动程序而需要的设备固件 |
fs | VFS和各种文件系统 |
include | 内核头文件 |
init | 内核引导和初始化 |
ipc | 进程间通信代码 |
kernel | 像调度程序这样的核心子系统 |
lib | 同样内核函数 |
mm | 内存管理子系统和VM |
net | 网络子系统 |
samples | 示例,示范代码 |
scripts | 编译内核所用的脚本 |
security | Linux 安全模块 |
sound | 语音子系统 |
usr | 早期用户空间代码(所谓的initramfs) |
tools | 在Linux开发中有用的工具 |
virt | 虚拟化基础结构 |
COPYIN:内核许可证;
CREDITS:内核代码的开发者列表;
MAINTAINTERS:维护者列表——负责维护内核子系统和驱动程序;
Makefile:是基本内核的Makefile;
2.3 编译内核
2.3.1 配置内核
1、配置项
(1)二选一:yes/no
(2)三选一:yes/no/module
module:选定该配置项但编译的时候以模块形式生成(多用于驱动程序)
2、内核配置工具
$ make config 最简单的一个字符界面下的命令行工具;
$ make menuconfig 基于ncurse库的图形界面工具;
$ make gconfig 基于gtk+的图形工具;
3、内核配置命令
make config:遍历所有配置项,并让用户选择
make deconfig:按默认的配置
make oldconfig:在修改过配置文件之后,或者在用已有的配置文件配置新的代码树的时候,应该验证和更新配置。
zcat /proc/config.gz > .config:从/proc下复制出配置文件并且使用它来编译一个内核
- 配置选项CONFIGIKCONFIGPROC会把完整的压缩过的内核配置文件存放在/proc/config.gz中,再次编译时可以方便地克隆当前的配置。
make:默认的Makefile自动化编译。
2.3.2 减少编译的垃圾信息
- 不看错误报告和警告信息,对输出重定向
$ make > ../detritus- 把无用的输出信息重定向到永无返回值的黑洞/dev/null中 $ make > /dev/null
2.3.3 衍生多个编译作业
- 以多个作业编译内核
$ make -jn
j:指定同时执行多任务;n:要衍生出的作业数)
2.3.4 安装新内核
- 模块的安装,以root身份,运行
% make modules_install
这样可以把所有已编译的模块安装到正确的主目录/lib/modules下。- System.map文件:编译时在内核代码树的根目录下创建的文件;是一个符号对照表;用来将内核符号与它们的起始地址对应起来。
2.4 内核开发的特点
Linux内核编程与用户空间内应用程序开发的差异
- Linux内核编程时不能访问C库
- Linux内核编程时必须使用GNU C
- Linux内核编程时缺乏像用户空间那样的内存保护机制。
- Linux内核编程时浮点数很难使用。
- 内核只有一个很小的定长堆栈。
- 由于内核支持异步中断、抢占式和SMP,因此必须时刻注意同步和并发。
- 要考虑可移植性的重要性。
2.4.1 无libc库抑或无标准头文件
内核不能使用函数库的原因:速度与大小,这些库对内核来说太大且太低效了。
基本头文件:内核源代码顶级目录下的include中
体系结构相关头文件:内核源代码树的arch//include/asm目录下
printk()函数:运行指定一个标志来设置优先级,syslogd会根据这个优先级标志来决定在什么地方显示这条系统消息。
- 优先级标志是预处理程序定义的一个描述性字符串,在编译时优先级标志就与要打印的消息绑在一起处理。
2.4.2 GNU C
- 什么是GNU?
GNU是一种操作系统,GNU提供的C编译器就是我们之前使用的gcc。
1、内联函数
内联函数:对时间要求比较高而本身长度比较短,一般定义在头文件中。
- 定义一个内联函数,用static作关键字,用inline限定它。
static inline void wolf(unsigned long tail_size);在内核中,为了类型安全和易读性,优先使用内联函数而不是复杂的宏。
2、内联汇编
汇编语言用于偏近底层或对执行时间严格要求的地方。
3、分支声明
对于条件选择语句,在一个条件经常/很少出现时,编译器可通过gcc内建的一条指令对条件分支选择进行优化。
内核把这条指令封装成了宏。
2.4.3 没有内存保护机制
内核中发生的内存错误会导致oops
内核中的内存不分页:每用掉一个字节,物理内存都减少一个
2.4.4 不要轻易在内核中使用浮点数
与用户空间进程不同,内核不完美支持浮点操作,因为他本身不能陷入
2.4.5 容积小而固定的栈
内核栈的准确大小随体系结构而变
每个体系结构对应的内核栈的大小时固定的,不能动态增长。
2.4.6 同步和并发
Linux是抢占多任务操作系统。
Linux内核支持多处理器系统。
中断是异步到来的,完全不顾及当前正在执行的代码。
Linux内核可以抢占。
2.4.7 可移植性的重要性
能提高移植性的准则
保持字节序
64位对齐
不假定字长和页面长度
小结
1、很喜欢作者把章节分的很细,每一章节的内容很短,但又可以把每个部分讲解清楚,读起来不会觉得枯燥不耐烦。
2、配合这课本的知识讲解,使我对网课的学习有了更多的思考,了解到内核,其实和应用程序一样也是一些代码(可以用C、java或其他语言编写),但唯一的区别就是,他们在物理内存中的组织形式不同,管理方式也不同,内核程序是管理应用程序,并为应用程序服务的。它需要更能加严谨的编码,要求几乎100%的无差错。这是我学习完内核后的一些浅显的理解。
参考资料
1:《Linux内核设计与实现》(原书第三版)
《linux内核设计与实现》读书笔记第一、二章的更多相关文章
- Linux内核设计与实现 读书笔记 转
Linux内核设计与实现 读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- linux 第三周读书笔记-----第一二章 20135334赵阳林
第一章 Linux内核简介 1.1 Unix的历史 由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进了进一步的开发. Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它 ...
- Linux内核设计与实现 总结笔记(第二章)
一.Linux内核中的一些基本概念 内核空间:内核可独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,称为内核空间. 进程上下文:当 ...
- Linux内核设计与实现读书笔记(8)-内核同步方法【转】
转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...
- Linux内核设计与实现——读书笔记2:进程管理
1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...
- Linux内核设计与实现——读书笔记1:内核简介
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...
- Linux内核设计与实现 总结笔记(第九章)内核同步介绍
在使用共享内存的应用程序中,程序员必须特别留意保护共享资源,防止共享资源并发访问. 一.临界区和竞争条件 1.1 临界区和竞争条件 所谓临界区就是访问和操作共享数据代码段.多个执行线程并发访问同一个资 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...
随机推荐
- eBay Notification介绍
1.简介 "通知服务"(约定为Notification的中文名称),是EbayAPI提供的一个便捷的工具,具有实时性的特点. 其设计思想基于发布-订阅模式.一旦客户端订阅了 ...
- Android 蓝牙 BLE 开发笔记
最近公司头戴换了一块蓝牙4.0 BLE模块,所以我们Android组要适配 BLE.Android BLE 需要 4.3 以上系统,api 还是非常简单的, 第一步就是扫描, 扫描到设备后就可以连接了 ...
- 【Linux程序设计】之Linux库函数的使用,多文件程序开发,静态与共享函数
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的.贴出来纯粹是聊胜于无. 实验题目:Linux基础程序设计综合实验 实验目的:熟悉并掌握Linux库函数的使用, ...
- BZOJ3498 : PA2009 Cakes
令三元环(i,j,k)中i>j>k,则每条边只需要从大点连向小点 设d[x]表示从x连出的边的条数 从1到n枚举点i,然后枚举所有与i相连的边(i,x)(x<i) 如果$d[x]\l ...
- 【BZOJ】2946: [Poi2000]公共串
http://www.lydsy.com/JudgeOnline/problem.php?id=2946 题意:给n个串,求最大公共子串.(1<=n<=5,每个串长度<=2000) ...
- 【BZOJ】1027: [JSOI2007]合金(凸包+floyd)
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 题意:$n$种材料,$m$种需求.每种材料有三个属性,给出三个属性的含量(和为1),问能否通过 ...
- Java读取txt文件
package com.loongtao.general.crawler.slave.utils; import java.io.BufferedReader; import java.io.File ...
- [转] - Ubuntu 安装Eclipse
昨天捣鼓一天,终于在Linux下成功安装Eclipse,这样,就能在Linux下像Windows的Visual Studio一样写程序了. 在网上搜索各种方法,但是没有一种方法是完整可行的,结合各种帖 ...
- 转simhash与重复信息识别
simhash与重复信息识别 在工作学习中,我往往感叹数学奇迹般的解决一些貌似不可能完成的任务,并且十分希望将这种喜悦分享给大家,就好比说:“老婆,出来看上帝”…… 随着信息爆炸时代的来临,互联网上充 ...
- 为什么我不再用 .NET 框架(转)
NET平台很棒.真的很棒.直到它不再那么棒.我为什么不再用.NET?简单来说,它限制了我们选择的能力(对我来说很重要),转移了我们的注意力,使得我们向内认知它的安全性,替代了帮助我们认知外面广阔世界的 ...