《Linux内核设计与实现》课本学习笔记

By20135203齐岳

一、Linux内核简介

Unix内核的特点

  • Unix很简洁,所提供的系统调用都有很明确的设计目的。
  • Unix中一切皆文件,对数据和设备的操作都是通过一套相同的系统调用接口进行的。
  • Unix内核和相关的系统工具都是用C语言编写成的。
  • Unix进程创建非常迅速。
  • Unix提供了一套简单而稳定的进程间通信原语。

Unix现在已经发展为一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。

操作系统与内核

操作系统是计算机完成基本功能和系统管理的核心,内核是操作系统的核心。在系统中运行的应用程序通过系统调用来与内核通信。

内核提供的服务主要有:

  • 中断服务程序,负责响应响应中断
  • 调度程序,负责管理多个进程从而分配处理器轮转时间
  • 内存管理程序,管理进程地址空间
  • 网络、进程间通信等系统服务

Linux与Unix的联系

  • Linux是类Unix系统,但不是Unix,也没有直接使用Unix的源代码。
  • Linux内核是自由公开的软件,开源。
  • Linux是单内核,但汲取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。

单内核与微内核

  • 单内核:内核通常以单个静态二进制文件的形式存放于磁盘中所有内核服务都运行在内核态并身处同一地址空间,内核可以直接调用函数。特点是简单,性能高。

  • 微内核:不同的功能被划分为独立的过程,每个过程叫做一个服务器,通过消息传递处理微内核通信,采用了进程间通信(IPC)机制。

二、内核源代码

获取内核源代码

使用Git来获取最新版本源代码:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

更新到Linux的最新分支:

$ git pull

解压并安装内核源代码:

$ tar xvjf linux-x.y.z.tar.bz2/gz

使用补丁:

$ patch -p1 < ../patch-x.y.z

注意:内核源码一般都安装在/usr/src/linux目录下,但不能把这个源码树用于内核开发,或者以root身份对内核进行修改。

内核源码树

三、编译内核

配置内核

Linux中可以配置的选项其前缀均为CONFIG。

配置项二选一:yes 或 no

配置项三选一:yes 、no 或 module(以模块形式生成,为独立代码段)

简化内核配置工具:

  • 字符界面下的Linux工具:逐一遍历所有的配置项,要求用户逐一选择,耗时长。

      $ make config
  • 基于ncurse库编制的图形界面工具:

      $ make menuconfig
  • 基于gtk+的图形工具:

      $ make gconfig
  • 基于默认配置为体系结构创建一个配置:

      $ make defconfig
  • 验证和更新配置:

      $ make oldconfig

一旦内核配置好,就可以利用一个简单的命令来编译它。

	$ make

减少编译的垃圾信息

尽量减少垃圾信息的方法:对输出进行重定向。

	$ make > .. /detritus  将输出信息重定向到这个文件目录
$ make > /dev/null 把无用的输出信息重定向到永无返回值的黑洞/dev/null

衍生多个编译作业

以多个作业编译内核:

$ make jn  n为要衍生出的作业数,每个处理器可以衍生出1或2个作业,16核时n可取32

安装新内核

$ make modules_install

编译时会在内核代码目录树的根目录下创建一个System.map文件,为符号对照表,用于将内核符号和他们的起始地址对应起来,方便调试。

四、内核开发特点

无libc库或标准头文件

大部分常用的C库函数在内核中都已经得到实现,只要包含<linux/string.h>文件就可以使用它们。

GUN C

内联函数

内联函数的工作模式:函数会在它所调用的位置上展开,可以消除函数调用和返回所带来的开销(寄存器存储和恢复)。但是代码会变长,占用更多的内存空间或者缓存指令。

定义一个内联函数的时候需要使用static作为关键字并用inline限定,并且必须在使用之间就定义好。

static inline void wolf(unsigned long tail_size)
内联汇编

gcc编译器支持在C函数中嵌入汇编指令。通常使用asm()指令嵌入汇编代码。

分支声明

对于条件选择语句,在一个条件经常出现或很少出现的时候,编译器可以根据这条指令对条件分支进行选择优化。并将其封装成宏,如likely()和unlikely()。

  • 将一个选择标记成绝少发生的分支:

      /*error绝大多数时间都会为0*/
    if(unlikely(error)){
    ...
    }
  • 将一个分支标记为通常为真的分支:

      /*success通常都不会为0*/
    if(likely(success)){
    ...
    }

没有内存保护机制

  • 内核中发生内存错误会导致oops。访问非法地址或引用空指针可能会造成死机。
  • 内核中所有的内存都不分页。每使用一个字节,物理内存就减少一个字节。

同步和并发

内核很容易产生竞争条件,许多性能要求并发地共享访问数据。通常解决竞争的办法是自旋锁和信号量

  • Linux是抢占式多任务操作系统。
  • Linux内核支持对称处理器系统(SMP)。
  • 中断是异步到来的,完全不考虑当前正在执行的代码。
  • Linux内核可以抢占。

《Linux内核设计与实现》课本第一章&第二章学习笔记的更多相关文章

  1. 《Linux内核设计与实现》第一、二章学习笔记

    <Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡  学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态 ...

  2. 《LINUX内核设计与实现》第一、二章学习总结

    第一章 Linux内核简介 (一)Unix是一个强大.健壮和稳定的操作系统,特点是: Unix很简洁,仅仅提供几个几百个系统调用并且有一个非常明确的设计目的 在Unix中,所有的东西都被当作文件对待, ...

  3. 《Linux内核设计与实现》 第一、二章学习笔记

    第一章 Linux内核简介 一.Unix 1.Unix的特点 简洁 绝大部分东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),wr ...

  4. 《Linux内核设计与实现》 第一二章学习笔记

    <Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...

  5. linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

    <linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...

  6. 《Linux内核设计与实现》第一二章笔记

    第一章 linux内核简介 每个处理器在任何时间点上的活动必然概括为下列三者: 运行于用户空间,执行用户进程 运行于内核空间,处于进程上下文,代表某个特定的进程执行 运行于内核空间,处于中断上下文,与 ...

  7. linux内核设计的艺术--系统启动第一步

    计算机究竟是如何执行起来的呢,在我学习计算机的时候一直不是非常明确,可是近期借了本<linux内核设计的艺术>算是知道了计算机从按开机到启动操作系统之间究竟做了些什么. 这本书刚開始介绍的 ...

  8. 《linux内核设计与实现》第一章

    第一章Linux内核简介 一.unix 1.Unix的历史 Unix是现存操作系统中最强大和最优秀的系统. ——1969年由Ken Thompson和Dernis Ritchie的灵感点亮的产物. — ...

  9. 《Linux内核设计与实现》第一二章读书笔记

    第一章 Linux内核简介 1.Unix简介 (一)概念:支持抢占式多任务.多进程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统. (二)Unix特点(层次化结构): Unix很简洁,仅 ...

  10. 【读书笔记】Linux内核设计与实现(第一章&第二章)

    http://pan.baidu.com/s/1hqYAZNQ OneNote做的笔记没法儿带着格式一起导进来.所以上传到百度云,麻烦老师下载一下了. 下次不再用OneNote.

随机推荐

  1. 【01:转自知乎:关于 openSUSE 】

    我是 openSUSE 中文维基唯一的非官方维护者,openSUSE 简体中文翻译团队召集人,linuxsir SuSE 版块的版主,openSUSE 官方论坛 http://forums.opens ...

  2. 自定义view 画圆

    package com.exaple.day01rikao; import android.content.Context; import android.graphics.Canvas; impor ...

  3. flash性能优化方案整理(最全)

    性能优化的原则 1.避免过早优化:太早优化将使代码难以设计和维护,最好是针对程序的瓶颈进行优化. 2.改进性能有时需要权衡:不能一味注重改进性能,一个项目要考虑各方面的利弊,比如代码的健壮性,结构性, ...

  4. sftp 设置仅能访问自己目录的用户

    1. 创建一个目录,owner为root,权限为750或755,此处为 /home/test01 添加一个用户test01,home目录设置为 /home/test01 再创建一个子目录用于用户上传: ...

  5. JavaScript中的prototype使用说明

    参考 http://abruzzi.iteye.com/blog/1026125 http://www.jb51.net/article/23052.htm

  6. 彻底删除java*

    提示:先备份重要数据 1. 移除所有 Java相关包 (Sun, Oracle, OpenJDK, IcedTea plugins, GIJ): apt-get update apt-cache se ...

  7. [问题2014S15] 解答

    [问题2014S15]  解答 任取 \(OA\) 的特征值 \(\lambda\in\mathbb{C}\) 以及对应的特征向量 \(0\neq\xi=(x_1,x_2,\cdots,x_n)'\i ...

  8. CSS布局基础之二认识Viewport

    什么是viewport viewport,等同于浏览器窗口. 功能:约束你网站中最顶级包含块(containing block)元素html标签. 什么是包含块(containing block)?下 ...

  9. 16s及宏基因组测序公司资源--20161104

    锐羿基因: http://www.realbio.cn/index.php?c=list&cs=keyandongtai& 科研动态更新及时 青岛过程能源所: http://www.c ...

  10. 深入浅出设计模式——适配器模式(Adapter Pattern)

    模式动机 在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式. 通常情况下,客户端可以通过目标类的接口访问它所提供的服务.有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定 ...