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

第一章 Linux内核简介

1.1 Unix的历史

Unix的特点

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

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

1.2追寻Linus足迹:Linux简介

  • Linux是类Unix系统,但它不是Unix,尽管Linux借鉴了Unix的许多设计并且实现了Unix的API。
  • Linux是一个非商业化的产品,这是它最让人感兴趣的特征。
  • Linux用途广泛,包含的东西也名目繁多。

1.3操作系统和内核简介

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

内核提供的服务主要有:

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

1.4Linux内核和传统Unix内核比较

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

1.5Linux内核版本

1.6Linux内核开发者社区

http://vegr.kernel.org

1.7小结

第二章

2.1获取内核源码

2.1.1使用Git

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

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

更新到Linux的最新分支:

$ git pull

2.1.2安装内核源代码

解压并安装内核源代码:

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

2.1.3使用补丁

使用补丁:

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

2.2内核源码树

2.3编译内核

2.3.1配置内核

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

配置项二选一:yes 或 no

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

简化内核配置工具:

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

    $ make config

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

    $ make menuconfig

  • 基于gtk+的图形工具:

    $ make gconfig

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

    $ make defconfig

  • 验证和更新配置:

    make oldconfig

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

    $ make

2.3.2减少编译的垃圾信息

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

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

2.3.3衍生多个编译作业

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

2.3.4安装新内核

$ make modules_install

2.4内核开发的特点

2.4.1无libc库抑或无标准头文件

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

2.4.2GNU 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)){ ... }

2.4.3没有内存保护机制

  • 内核中发生内存错误会导致oops。访问非法地址或引用空指针可能会造成死机。

  • 内核中所有的内存都不分页。每使用一个字节,物理内存就减少一个字节。

2.4.4不要轻易在内核中使用浮点数

2.4.5容积小而固定的栈

2.4.6同步和开发

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

2.4.7可移植性的重要性

2.5小结

在探索的征途中,最重要的是阅读和修改内核源代码,只有通过实际的阅读和实践词汇理解内核。

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

  1. 《java编程思想(第四版)》第一二章学习笔记

    目录 一.Introduction 1.抽象过程 2.面向对象语言(包括Java)的五个基本特性 3.每个对象都提供服务 4.public.private.protected三者的区别 5.Java的 ...

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

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

  3. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  4. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  5. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  6. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  7. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  8. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  9. 《Linux内核设计与实现》Chapter 18 读书笔记

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

随机推荐

  1. Centos7系统特性之systemd

    1.centos系列的系统启动流程(内核级别的启动流程): POST(加电自检)---> Boot Sequence(BIOS)---> Boot loader (MBR)---> ...

  2. OSPF单区域配置

    OSPF单区域配置 实验环境:华为模拟器eNSP 现在有这样一个拓扑图: 我想要让R1可以ping通R3,显然目前是不行的: <R1>ping 192.168.2.2 PING 192.1 ...

  3. C语言变量定义与数据溢出(初学者)

    1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用 ...

  4. 多个Activity和Intent

    Intent是Android应用程序组件之一,在Android系统当中表示一种意图,Intent中包含了一组信息: 最重要的内容是action(动作)和data(数据) Component name ...

  5. Spring与SpringMVC的区别

    Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring. 简单点的话可以将SpringMVC类比于Strut ...

  6. MATLAB——神经网络sim仿真函数

  7. PAT A1076 Forwards on Weibo (30 分)——图的bfs

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  8. stm32 中断号和中断处理函数建立关系

    转载:https://www.cnblogs.com/heny-hui/p/7130620.html stm32的中断号根据不同内核和型号,st公司给的官方库中对相应的中断号进行了设置,我们用到哪一个 ...

  9. source 和sh 区别

    sh新建一个子shell进程,变量在主shell中无法获取 source在当前shell中执行脚本,变量在主shell即当前shell中可以获取 例子: 1.新建一个test.sh脚本,内容为:A=1 ...

  10. Skyline中的GDAL

    安装Skyline的TerraExplorer Pro软件后,我们很容易在其安装目录中找到这样一些文件: gdal.dll.gdal_csharp.dll.ogr_csharp.dll.osr_csh ...