FlyingMcdull

Linux内核-基本概念

由于需要接触一下底层知识,对Linux内核的了解是必不可少的,之前对内核知识知之甚少,在别人的建议下开始看《Linux内核设计与实现》,有一些笔记,整理一下。

内核的基本知识

操作系统负责整个计算机资源的调度和管理,其本身的构造是极其复杂的,包括内核、设备驱动程序、启动引导程序和各种用户的界面、文件管理等其他工具。内核,顾名思义,就是操作系统的核心部分。其包含以下模块:

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

内核的设计

操作系统内核设计主要分为两种,宏内核(Monolithic Kernel)和微内核(Micro Kernel),各自的代表是Linux和Minix(ps:Linus和Tanenbaum为这个事还有过著名的争论),还有一种是二者结合,混合内核(并不普及,暂不讨论)。如下图,可以清晰地看出三种内核设计模式的区别。
kernel
宏内核也称为单内核,就是将内核功能整体作为一个单独的过程来实现,运行在一个单独的地址空间上。所有的内核服务都运行在一个大的内核地址空间。优点在于内核内部通信代价很小,因为运行在同一个地址空间,可以像调用函数一样调用各种功能。缺点在于其稳定性会受到单个模块影响,比如一个模块崩溃会导致整个内核崩溃。

微内核并不使用一个单独的大过程来实现,而是划分为多个小的过程,每个过程称作一个服务器,各司其责。每个服务器都运行在独立的地址空间上,这样就可以保证互相不会影响。相应地,微内核采用IPC通信机制,比函数调用代价大得多,直接导致通信代价过高。

Linux的特点

尽管Linux是一种宏内核,Linux内核的设计慢慢也吸取了一些微内核设计的优点,比如模块化设计,抢占式内核、支持内核线程以及内核模块动态装载,同时也避免了微内核设计的性能短板,将所有模块运行在内核态,直接使用函数调用来通信。Linux内核继承了Unix的很多优秀特性,但也有了很多显著的差异,比如:

  • 支持动态加载内核模块
  • 支持对称多处理器(SMP)
  • 支持内核抢占,大多数Unix不支持
  • 不区分线程和一般的进程
  • 提供具有设备类的面向对象设备模型,支持热拔插以及用户空间的设备文件系统