第一章 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内核设计与实现》读书笔记第一、二章的更多相关文章

  1. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

  2. Linux内核设计与实现 读书笔记

    第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...

  3. linux 第三周读书笔记-----第一二章 20135334赵阳林

    第一章 Linux内核简介 1.1 Unix的历史 由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进了进一步的开发. Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它 ...

  4. Linux内核设计与实现 总结笔记(第二章)

    一.Linux内核中的一些基本概念 内核空间:内核可独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,称为内核空间. 进程上下文:当 ...

  5. Linux内核设计与实现读书笔记(8)-内核同步方法【转】

    转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...

  6. Linux内核设计与实现——读书笔记2:进程管理

    1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...

  7. Linux内核设计与实现——读书笔记1:内核简介

    内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...

  8. Linux内核设计与实现 总结笔记(第九章)内核同步介绍

    在使用共享内存的应用程序中,程序员必须特别留意保护共享资源,防止共享资源并发访问. 一.临界区和竞争条件 1.1 临界区和竞争条件 所谓临界区就是访问和操作共享数据代码段.多个执行线程并发访问同一个资 ...

  9. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

  10. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

随机推荐

  1. Oracle生成千万测试数据

    oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试 ...

  2. WPF 文本框添加水印效果

    有的时候我们需要为我们的WPF文本框TextBox控件添加一个显示水印的效果来增强用户体验,比如登陆的时候提示输入用户名,输入密码等情形.如下图所示: 这个时候我们除了可以修改TextBox控件的控件 ...

  3. ural 1221. Malevich Strikes Back!

    1221. Malevich Strikes Back! Time limit: 1.0 secondMemory limit: 64 MB After the greatest success of ...

  4. BZOJ4304 : 道路改建

    首先求出SCC,把图缩点成一个DAG. 通过拓扑排序+DP求出: dp0[x]:从x点出发能到的点的集合. dp1[x]:能到x的点的集合. 对于一条边x->y,将它改为双向边后,形成的新的SC ...

  5. [转]C++设计模式:Builder模式

    Builder模式要解决的问题是,当我们要创建很复杂的对象时,有时候需要将复杂对象的创建过程和这个对象的表示分离开来.由于在每一步的构造过程中可以映入不同参数,所以步骤相同但是最后的对象却不一样.也就 ...

  6. 【BZOJ】3669: [Noi2014]魔法森林(lct+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3669 首先看到题目应该可以得到我们要最小化 min{ max{a(u, v)} + max{b(u, ...

  7. JS倒计时代码

    第一种:精确到秒的javascript倒计时代码 HTML代码: <form name="form1"> <div align="center" ...

  8. 给NSString增加Java风格的方法

    给NSString增加Java风格的方法 文章目录 我实在受不了 NSString 冗长的方法调用了,每次写之前都要查文档.特别是那个去掉前后多余的空格的方法,长得离谱.与之对应的别的语言,拿 jav ...

  9. wordpress安装

    通过浏览器访问wordpress文件包 点击现在就开始,填写下面内容 我的填写 如出现下面情况,你得先创建一个数据库,再重试 数据库的创建 之后会出现 点击进行安装 安装成功 登录 主界面 写个文章, ...

  10. border 变形计

    趣味实现楼阁或者展示板的画面 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta chars ...