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

标签(空格分隔): 20135321余佳源


第一章 Linux内核简介

1.Unix内核特点

  1. 十分简洁:仅提供几百个系统调用并且有明确的目的;
  2. 在Unix中,大部分东西都被(或者正致力于)被当做文件对待;
  3. Unix内核即相关系统工具软件都是用C语言编写的,这使得系统有着强大的可移植性;
  4. Unix进程创建非常迅速,目标在于一次执行保质保量地完成一个任务
  5. 进程创建迅速:有独特的fork()系统调用,一次执行保质保量地完成一个任务。简单的进程间通信元语把单一目的的程序方便地组合在一起,这种策略和机制分离的理念确保了Unix系统具备清晰的层次化结构。
  6. Unix已经发展成一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。

2.Linux与Unix的前世今生

  • Linux是基于Unix的类系统,比如它也实现了Unix的API;但是Linux没有直接使用Unix的源代码,但它没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致。

  • Linux是非商业的产品,任何人都可以参与到它的开发中,是自由公开软件。

  • Linux系统的基础是内核,C库,工具集和系统的基本工具

  • Unix内核与Linux内核的比较

      ·Unix内核是一个不可分割的静态可执行库,通常需要硬件系统提供页机制(MMU)以管理内存;
    ·Linux支持动态加载内核模块,并且是可抢占的。

3.操作系统和内核简介

  • 操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
  • 用户界面是操作系统的表象,内核是操作系统的核心,系统其它部分必须依靠内核这部分软件提供的服务。通常一个内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程之间通信等系统服务程序共同组成。
  • 内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间
  • 在系统中运行的应用程序通过系统调用来与内核通信。

应用程序完成其工作的基本行为方式是:应用程序通过系统调用界面陷入内核。

处理器的活动必然其下三者之一:

  • 运行于用户空间,执行用户进程
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断


4.内核分类

  1. 单内核(比如大多数Unix及Linux)

    把它从整体上作为一个大的单独的过程来实现,同时运行在一个单独的地址空间上

    内核直接调用函数。Linux是单内核。

    简单,性能高
  2. 微内核(比如Windows NT)

    微内核的功能被划分为多个独立的功能,每个过程叫做一个服务器;便于处理内核间通信,还使用了IPC机制,基于微内核的系统都让大部分或全部服务器位于内核;

5.Linux内核版本

Linux内核有两种:稳定的和开发中的。

如果版本号是偶数,则内核是稳定版;如果是奇数,内核就是开发版。


第二章 从内核出发

1.获取内核源码

使用git获取源码:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
git pull # 更新分支到Linux的最新分支

安装内核源代码:

  • 如果压缩形式是bzip2,则运行:tar xvjf linux-x.y.z.tar.bz2
  • 如果压缩形式是GNU的zip,则运行:tar xvzf linux-x.y.z.tar.gz

PS:如果使用git获取就不需要下载压缩文件,运行git clone命令,git就会下载解压最新的源代码

PS2:内核源代码一般安装在/usr/src/linux目录下,即使在安装新内核时,/usr/src/linux目录应当保证原封不动,不要将其用于开发,不要以root身份对内核进行修改。

使用补丁

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

2.内核源码树



内核源码树由很多目录组成,而大多数目录又包含更多的子目录

目录  描述
arch 特定体系结构的源码
crypto Crypto API
Documentation 内核源码文档
drivers 设备驱动程序
fs VFS和各种文件系统
include 内核头文件
init 内核引导和初始化
ipc 进程间通信代码
kernel 像调度程序这样的核心子系统
lib 通用内核函数
mm 内存管理子系统和VM
net 网络子系统
scripts 编译内核所用的脚本
security Linux安全模块
sound 语音子系统
usr 早期用户空间代码 (所谓的 initramfs)

3.编译内核

3.1 配置内核

  1. 字符页面的命令行工具:make config
  2. 图形界面工具make menuconfig
  3. 基于默认配置为体系结构创建一个配置:make defconfig
  4. 验证和更新配置:make oldconfig

配置项的二选一和三选一:

二选一:yes 或者 no

三选一:yes 或者 no 或者 module(以模块生成)

3.2 编译内核

make

重定向到该文件中:make > .. /detritus

把无用的输出信息重定向到永无返回值的黑洞中:

make > /dev/null

衍生多个编译作业

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

3.3 安装新内核

以root身份运行 make modules_install

所有已编译的模块都会安装到lib/modules下

System.map这个文件是一份符号对照表

4.内核开发的特点

  1. 内核开发时既不能访问C库也不能访问标准的C头文件 应对:include/linux文件夹中包含了所需的内核头文件。

  2. 内核编程时必须使用GNU C

     ·内联函数: 函数会在所调用的位置上展开。 定义时,需要使用static作为关键字,用inline限定它。 内联函数必须在使用之前就定义好,一般在头文件中定义。 内核中优先使用内联函数而不是宏。
    ·内联汇编: 通常使用asm()指令嵌入汇编代码,用volatile表示不优化
    ·分支声明: unlikely(x) - x很少出现,绝少发生,通常为假 likely(y) - y经常出现,通常为真
  3. 内核编程时缺乏像用户空间那样的内存保护机制

    内核中内存不分页。

  4. 内核编程时难以执行浮点运算

  5. 内核给每个进程只有一个很小的定长堆栈

  6. 由于内核支持异步中断、抢占和SMP(对称多处理系统),必须时刻注意同步和并发。(常用的解决竞争的方法:自旋锁和信号量)。

  7. 要考虑可移植性的重要性(诸如保持字节序,64位对其,不假定字长和页面长度等。)

《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. struct与class区别联系(转)

    传送门:struct与class区别联系 注意C中的struct和C++中的struct是不一样的,c中的struct比较原生,仅仅是将一些属性封装起来构成一个整体,没有OO的相关特性.而c++中的s ...

  2. Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()

    解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...

  3. Shell学习心得(二):传递参数、运算符

    1.传递参数 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 向脚本传递三个参数, ...

  4. WorldWind源码剖析系列:数学引擎类MathEngine

    PluginSDK中的MathEngine类是密封类.不可继承,主要完成通用的数学计算功能.由于按平面展开层层划分,所以在WW里用到一个row,col的概念,类MathEngine封装了从行/列到经/ ...

  5. Python2.7-xdrlib

    xdrlib模块,用于打包和解包 xdr 数据.XDR 提供了一种与体系结构无关的表示数据,解决了数据字节排序的差异.数据字节大小.数据表示和数据对准的方式.使用XDR的应用程序,可以在异构硬件系统上 ...

  6. CentOS中配置Kafka集群

    环境:三台虚拟机Host0,Host1,Host2 Host0:192.168.10.2 Host1:  192.168.10.3 Host2:  192.168.10.4 在三台虚拟机上配置zook ...

  7. Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml

    解决方法来源:http://www.cnblogs.com/kaka-bing/archive/2012/10/31/2747490.html 问题描述: 使用Android SDK Manager检 ...

  8. R 语言的Dataframe常用操作

    上节我们简单介绍了Dataframe的定义,这节我们具体来看一下Dataframe的操作 首先,数据框的创建函数为 data.frame( ),参考R语言的帮助文档,我们来了解一下data.frame ...

  9. Python3入门(三)——Python基础语法

    一.基本语法 1.行和缩进 Python中,不使用括号来表示代码的类和函数定义块或流程控制. 代码块是由行缩进,缩进位的数目是可变的,但是在块中的所有语句必须缩进相同的量. 如下所示: a = 100 ...

  10. WPF编程,窗口保持上次关闭时的大小与位置。

    原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...