Linuxカーネル、サブシステムおよび分類の概要

カーネルの紹介

  カーネルは:コンピュータサイエンスでは、コンピュータプログラムは、ソフトウェア送信されたデータI / O(入力および出力)の要件を管理するために使用され、これらの要件は、中央プロセッサ(CPU)と、他のコンピュータによって命令とデータ処理に変換されます処理のための電子部品、最新のオペレーティングシステムは、最も基本的な部分です。これは、ハードウェアの動作のどのくらいの部分に何時間プログラムで決めるアクセスがカーネルによって制限され、多くのアプリケーションのためのコンピュータのハードウェアへの安全なアクセスをソフトウェアの一部を提供することです。直接ハードウェアの動作には非常に複雑です。したがって、コアは、一般的にこれらの操作を完了するために、ハードウェア抽象化するための方法を提供します。プロセス間通信メカニズムとシステムコールを介して、アプリケーション・プロセスは、間接的に必要なハードウェアリソース(特にプロセッサやIOデバイス)によって制御することができます。

 

 

GNU / Linuxオペレーティングシステムの基本的なアーキテクチャ:図1

       上部には、ユーザー(またはアプリケーション)のスペースです。これには、ユーザーのアプリケーションの実行です。ユーザ空間の下にカーネル空間、それがここに置かれているLinuxカーネルです。

  GNU Cライブラリ(glibcが)ここにあります。それはまた、ユーザ空間とカーネル・アプリケーションとの間の変換のためのメカニズムを提供し、接続カーネルシステムコールインターフェースを提供します。アプリケーションのカーネルとユーザ空間が異なる保護されたアドレス空間を使用しているため、これは重要です。各ユーザ空間プロセスは、カーネルは単一のアドレス空間を占有し、独自の仮想アドレス空間を使用しています。

  Linuxカーネルはさらに3層に分割することができます。上部は、読み取りと書き込みのようないくつかの基本的な機能を実現するシステムコールインターフェース、です。システム・コール・インターフェースの下でカーネルコードをより正確アーキテクチャに依存しないカーネル・コードとして定義することが可能です。これらのコードは、Linuxでサポートされているすべてのプロセッサアーキテクチャは、一般的なものです。これらのコードの下で一般にBSP(ボードサポートパッケージ)の一部を構成していると呼ばれる、コードのアーキテクチャに依存します。これらのコードのコードは、与えられた特定のプロセッサアーキテクチャのためのプラットフォームとして使用されます。

 

二、Linuxカーネル・サブシステム

 

図2:Linuxカーネルのシステムの構成を示す斜視図

2.1システムコールインタフェース

  SCI層は、カーネルにユーザ空間から特定の関数呼び出しを実行するためのメカニズムを提供します。このインタフェースは、同じであってもプロセッサ・ファミリに、アーキテクチャに依存します。SCIは、実際には非常に便利な関数呼び出しの多重・分離するサービスです。あなたは、SCIを達成し、中./linux/archにおけるアーキテクチャ依存部分を見つける./linux/kernelで見つけることができます。

2.2プロセス管理

  プロセス管理は、実装プロセスに焦点を当てています。カーネルでは、プロセスはスレッドと呼ばれ、別個のプロセッサの仮想化(スレッド・コード、データ、スタックとCPUレジスタ)を表します。ユーザ空間では、通常の用語法を使用しますが、Linuxの実装では、これら二つの概念(プロセスとスレッド)を区別しません。カーネルは(殺す、終了)プロセスを停止し、通信し、それらの間で同期させる、新しいプロセス(フォーク、EXEC、またはポータブルオペレーティングシステムインタフェース[POSIX]関数)を作成するためにSCIを介してアプリケーション・プログラミング・インターフェース(API)を提供します(信号、またはPOSIXメカニズム)。

2.3メモリ管理

  もう一つの重要なリソースは、カーネルメモリで管理されています。効率化のために、仮想メモリのハードウェア管理ならば、メモリはいわゆるページモードメモリに合わせて(4キロバイトの両方のためにほとんどのアーキテクチャのために)管理されています。Linuxは、使用可能なメモリの管理、および使用方法の物理および仮想ハードウェアのマッピング機構を含みます。

2.4仮想ファイルシステム

  それは、ファイル・システムのための共通のインターフェースの抽象化を提供するため、Linuxカーネルにおける仮想ファイルシステム(VFS)は、非常に便利な一の側面です。VFSは、SCIとカーネルによってサポートされているファイルシステムとの間のスイッチング層を提供します。

 

図3:ユーザとファイルシステムとの間のVFSは、スイッチング層を提供します

  VFSの最上部では、このようなオープン、クローズ、読み取りおよび書き込み機能など、一般的なAPIを抽象化したものです。ここで、上部機能の実装を定義するVFSファイルシステムの抽象化です。それらは、プラグインの(50歳以上)ファイルシステムが与えられます。ファイルシステムのソースコードはで./linux/fsで見つけることができます。

  文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

2.5 网络堆栈

  网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。

  socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net 中找到。

2.6 设备驱动程序

  inux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。设备驱动程序的代码可以在 ./linux/drivers 中找到。

 

 三、内核的分类

  内核在设计上分为宏内核与微内核两大架构。

3.1 宏内核

  宏内核:是在硬件之上,定义了一个高阶的抽象接口,应用原语或系统调用来实现操作系统的功能,例如:进程管理、文件系统和存储管理等,这些功能由多个运行在内核上的模块来完成。

  尽管每一个模块都是单独地服务这些操作,内核代码是高度集成的,而且难以编写正确。因为所有的模块都在同一个内核空间上运行,一个很小的bug都会使整个系统崩溃。然而,如果开发顺利,单内核结构就可以从运行效率上得到好处。

  很多现代的宏内核结构内核,如Linux和FreeBSD内核,能够在运行时将模块调入执行,这就可以使扩充内核的功能变得更简单,也可以使内核的内核部分变得更简洁。

 

图4:宏内核示意图

 宏内核结构的例子:

       传统Unix内核:BSD、Solaris

       类Unix系统(Unix-like)内核:FreeBSD、OpenBSD、NetBSD、Linux

       DOS:DR-DOS

      

3.2 微内核

       微内核:是由一个非常简单的硬件抽象层层和一组比较关键的原语或系统调用促成,这些原语,仅仅包括了创建一个系统必需的几个部分;如线程管理,地址空间和行程间通讯等。

微核的目标是将系统服务的实现和系统的基本操作规则分离开来。例如,进程的输入/输出锁定服务可以由运行在微核之外的一个服务组件来提供。这些非常模块化的用户态服务器用于完成操作系统中比较高级的操作,这样的设计使内核中最内核的部分的设计更简单。一个服务组件的失效并不会导致整个系统的崩溃,内核需要做的,仅仅是重新启动这个组件,而不必影响其它的部分

  微内核将许多OS服务放入分离的进程,如文件系统,设备驱动程序,而进程通过消息传递调用OS服务。微内核结构必然是多线程的,第一代微内核,在内核提供了较多的服务,因此被称为'胖微内核',它的典型代表是Mach,它是Mac OS X的内核,可以说,蒸蒸日上。第二代微内核只提供最基本的OS服务,典型的OS是QNX,QNX在黑莓手机BlackBerry 10系统中被采用。

 

图5:微内核示意图

  微内核结构的例子:AIX、BeOS、L4微内核系列、Mach(用于XNU、GNU Hurd)、Minix

おすすめ

転載: www.cnblogs.com/ColoDu/p/11111336.html