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

1、Linux内核简介

Unix内核的特色

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

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

操做系统与内核

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

内核提供的服务主要有:缓存

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

Linux与Unix的联系

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

单内核与微内核单内核:内核一般以单个静态二进制文件的形式存放于磁盘中全部内核服务都运行在内核态并身处同一地址空间,内核能够直接调用函数。特色是简单,性能高。微内核:不一样的功能被划分为独立的过程,每一个过程叫作一个服务器,经过消息传递处理微内核通讯,采用了进程间通讯(IPC)机制。

2、内核源代码

获取内核源代码

使用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

 

3、编译内核

配置内核

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文件,为符号对照表,用于将内核符号和他们的起始地址对应起来,方便调试。

4、内核开发特色

无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内核能够抢占。
相关文章
相关标签/搜索