《LINUX内核设计与实现》第三周读书笔记——第一二章
《Linux内核设计与实现》读书笔记——第一二章
20135301张忻
估算学习时间:共2小时
读书:1.5
代码:0
作业:0
博客:0.5
实际学习时间:共2.5小时
读书:2.0
代码:0
作业:0
博客:0.5
耗时估计的公式:Y=X+X/N ,Y=X-X/N
第一章 Linux内核简介
1.1 Unix的历史
- 由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进了进一步的开发。
- Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最优秀的系统。从1969年诞生以来,由Dennis Ritchie和Ken Thompson的灵感火花点亮的这个Unix产物已经成为一种传奇,它历经了时间的考验依然声名不坠。
1.2 追寻Linus足迹:Linux简介
1.3 操作系统和内核简介
处理器在任何指定时间点上的活动范围可以概括为下列三者之一:
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行。
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
- 运行于用户空间,执行用户进程。
1.4 Linux内核和传统Unix内核的比较
Linux内核和传统UNIX内核特点的比较
- Linux支持动态加载内核模块。
- Linux支持对称多处理(SMP)机制
- Linux内核可以抢占。
- Linux内核并不区分线程和其他的一般进程
1.5 Linux内核版本
命名规则:
1.6 Linux内核开发者社区
这个社区最重要的论坛:Linux kernel mailing list(lkml)
1.7 小结
第二章 从内核出发
这一章介绍Linux内核一些基本常识:从何处获取源码,如何编译它,又如何安装新内核。
2.1 获取内核源码
- 在Linux内核官方网站http://www.kernel.org,可以随时获取当前版本的Linux源代码,可以是完整的压缩形式,也可以是增量补丁形式。
- 除非特殊情况下需要Linux源码的旧版本,一般都希望拥有最新的代码。kernel.org是源码的库存之处,那些领导潮流的内核开发者所发布的增量补丁也放在这里。
2.1.1 使用Git
2.1.2 安装内核源代码
- 如果压缩形式是bzip2,则运行:
$ tar xvjf linux-x.y.z.tar.bz2 - 如果压缩形式是GNU的zip,则运行
$ tar xvzf linux-x.y.z.tar.gz
解压后的源代码位于linux-x.y.z.目录下。 - 何处安装源码:内核源码一般安装在/usr/src/linux目录下。
2.1.3 使用补丁
- 内核版本在不断更新,增量补丁可以作为版本转移的桥梁。
- 优点:节约了带宽,还省了时间
- 要应用增量补丁,从你的内部源码树开始,只是运行:
$ patch p1 < ../patch-x.y.z - 一般说来,一个给定版本的内核补丁总是打在前一个版本上
2.2 内核源码树
内核源码树由很多目录组成,而大多数目录又包含更多的子目录。源码树的根目录及其子目录如表所示。
目录 描述
arch 特定体系结构的源码
crypto Crypto API
Documentation 内核源码文档
drivers 设备驱动程序
fs VFS和各种文件系统
include 内核头文件
init 内核引导和初始化
ipc 进程间通信代码
kernel 像调度程序这样的核心子系统
lib 通用内核函数
mm 内存管理子系统和VM
net 网络子系统
scripts 编译内核所用的脚本
security Linux安全模块
sound 语音子系统
usr 早期用户空间代码 (所谓的 initramfs)
2.3 编译内核
2.3.1 配置内核
- 在编译内核之前,首先你必须配置它。
- 可以配置的各种选项,以CONFIG_FEATURE形式表示,其前缀为CONFIG。
- 配置选项既可以用来决定那些文件编译进内核,也可以通过预处理命令处理代码。
- 这些配置项要么是二选一,要么是三选一。二选一就是yes或no。比如说CONFIG_PREEMPT就是二选一,表示内核抢占功能是否开启。三选一可以是yes、no或module。Module意味着该配置项被选定了,但编译的时候这部分功能的实现代码是以模块(一种可以动态安装的独立代码段)的形式生成。在三选一的情况下,显然yes选项表示把代码编译进主内核映像中,而不是作为一个模块。驱动程序一般都用三选一的配置项。
2.3.2 减少编译的垃圾信息
- 我们希望在编译时看到错误和警告信息,但对匆匆掠过屏幕的垃圾信息不感兴趣,可以用下面的技巧来实现愿望:
make > some_other_file - 一旦需要查看编译的输出信息,可以查看这个文件。不过,因为错误和警告都会在屏幕上显示,所以你需要看这个文件的可能性不大。事实上,我只不过敲入如下命令
$ make > /dev/null
这就把无用的输出信息重定向到永无返回值的黑洞/dev/null。
2.3.3 衍生多个编译作业
- 为了以多个作业编译内核,使用以下命令:
$ make -jn - 这里,n是要衍生的作业数,在实际中,每个处理器上一般衍生一个或者两个作业。例如,在一个双处理器上,可以输入如下命令:
$ make –j4
2.3.4 安装新内核
- 模块的安装是自动的,也是独立于体系结构的。以root身份,只要运行:
% make modules_install
就可以把所有已编译的模块安装到正确的主目录/lib下。
2.4 内核开发的特点
Linux内核编程与用户空间内应用程序开发的差异
- Linux内核编程时不能访问C库
- Linux内核编程时必须使用GNU C
- Linux内核编程时缺乏像用户空间那样的内存保护机制。
- Linux内核编程时浮点数很难使用。
- 内核只有一个很小的定长堆栈。
- 由于内核支持异步中断、抢占式和SMP,因此必须时刻注意同步和并发。
- 要考虑可移植性的重要性。
2.4.1 无libc库抑或无标准头文件
- 大部分常用的C库函数在内核中都已经得到实现了。比如说操作字符串的函数组就位于lib/string.c文件中。只要包含<linux/string.h>头文件,就可以使用它们。
- 在所有没有实现的函数中,最著名的就数printf()函数了。内核代码虽然无法调用printf(),但它可以调用printk()函数。
2.4.2 GNU C
内核开发者使用的C语言涵盖了ISO C995标准和GNU C扩展特性。
- 内联(inline)函数
- 内联汇编
- 分支声明
2.4.3 没有内存保护机制
- 如果一个用户程序试图进行一次非法的内存访问,内核会发现这个错误,发送 SIGSEGV,并结束整个进程。
- 内核中发生的内存错误会导致oops,这是内核中出现的最常见的一类错误。
- 内核中的内存都不分页。
2.4.4 不要轻易在内核中使用浮点数
- 在执行浮点指令时到底会做些什么,因体系结构不同,内核的选择也不同,但是,内核通常捕获陷阱并做相应处理。
- 和用户空间进程不同,内核并不能完美地支持浮点操作,因为它本身不能陷入。
2.4.5 容积小而固定的栈
- 内核栈的准确大小随体系结构而变。在x86上,栈的大小在编译时配置,可以是4KB也可以是8KB。
- 从历史上说,内核栈的大小是两页,这就意味着,32位机的内核栈是8KB,而64位机是16KB,这是固定不变的。
- 每个处理器都有自己的栈。
2.4.6 同步和并发
- Linux是抢占多任务操作系统。内核的进程调度程序即兴对进程进行调度和重新调度。内核必须对这些任务同步。
- Linux内核支持多处理器系统。
- 中断是异步到来的,完全不顾及当前正在执行的代码。
- Linux内核可以抢占。
2.4.7 可移植性的重要性
- Linux是一个可移植的操作系统,
- 必须把体系结构相关的代码从内核代码树的特定目录中适当地分离出来。
2.5 小结
内核的确是一头独一无二的猛兽:没有内存保护,没有靠得住的libc,小的堆栈,庞大的源码树。Linux内核遵循它自己的游戏规则,以大人物的架势运行, 运行足够长的时间后才停止,打破了我们惯以为常的习俗。尽管如此,内核不外乎就是一个程序,它与我们司空见惯的程序没有多大区别。不必望而生畏:直面它、呼唤它、摆布它。
《LINUX内核设计与实现》第三周读书笔记——第一二章的更多相关文章
- LINUX内核设计与实现第三周读书笔记
LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
- Linux内核设计与实现第八周读书笔记
第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...
- Linux内核设计与实现第六周读书笔记
第三章 进程管理 3.1 进程 进程是处于执行期的代码.通常进程还要包含其他资源,像打开的文件.挂起的信号.内核的内部数据.处理器状态.一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还 ...
- Linux内核设计与实现第五周读书笔记
第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...
- linux内核设计与实现第七周读书笔记
第七章 链接 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行.链接可以执行于编译时(compile time),也就是在源代 ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- 《Linux内核设计与实现》Chapter 1 读书笔记
<Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...
随机推荐
- 前端工程构建工具之Yeoman
一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...
- ThreadLocal解决SimpleDateFormat多线程安全问题中遇到的困惑
测试代码: public class Main { public static void main(String[] args) { for (int k = 0; k < 10; k++) { ...
- day3-课堂笔记
函数有2种: 1种是有返回值的,不改变对象本身 1种是没有返回值的,改变对象本身 eval函数就是实现list.dict.tuple与str之间的转化(只能把类似格式的字符串进行相应转换)str函 ...
- cpu高占用,线程堆栈,jstack,pstack,jmap, kill -3 pid,java(weblogic,tomcat)
1 ps -mp pid -o THREAD,tid,time 2 printf "%x\n" tid 3 jstack pid |grep tid -A 30
- web.xml配置遇到的问题
web.xml<listener> <listener-class>org.springframework.web.context.ContextLoad ...
- JAVA框架 Mybaits 动态代理
一.动态代理: mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类.底层通过反射实例化代理对象,通过代理对象调用相应的方法, ...
- jsonp小案例
jsonp详解 例子:
- Java中splite的用法与小技巧
在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...
- Android 将系统的back键模拟成为home键的功能
@Override public void onBackPressed() { Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFl ...
- openstack vm ping 114.114.114.114
route add -net 0.0.0.0 netmask 0.0.0.0 gateway 192.168.0.131 route del -net 0.0.0.0 netmask 0.0.0.0 ...