たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【コンピュータサイエンスの独学】メモリの中身

   

ユーザー空間とカーネル空間

メモリはおおきくふたつの領域に分けられています。

とくにデバイスドライバを開発する場合、ユーザー空間とカーネル空間について理解しておく必要があります。

一般的なアプリケーション開発の場合、カーネル空間を意識したプログラミングは必要ありません。
しかし、デバイスドライバはカーネルの一部であるため、カーネル空間を意識したプログラミングを行わなくてはなりません。

では、ユーザー空間、カーネル空間とはそれぞれ何なのでしょう。

ユーザー空間とは、アプリケーション(OS上で動作するソフトウェア)が使用するメモリ領域のことであり、カーネル空間とは、カーネルが使用するメモリ領域のことを指します。

ユーザー空間はアプリケーションプロセスのメモリ、カーネル空間はカーネルのメモリと言い換えることができます。

つまり両者の違いは使用するメモリ領域の違いと言えます。

例えば、パソコンに4Gバイトのメモリが搭載されていたとします。
このときLinuxは、3Gバイトをユーザー空間としてアプリケーションに割り当て、残りの1Gバイトをカーネル空間としてカーネルに割り当てます。

ユーザー空間とカーネル空間はそれぞれ独立しており、互いが互いのメモリ領域に直接アクセスすることはできません。

では、何のためにメモリ領域を二つに分けるのでしょう。

カーネルはシステムの中枢であるため、カーネルが動いているメモリ領域が侵されてしまったらOSごと停止してしまいます。
例えば、アプリケーションにバグがあった場合、カーネル空間にまでその影響が及んでしまう可能性も十分あります。

しかし、メモリ領域をユーザー空間とカーネル空間に分け、互いが互いの領域にアクセスできないようにしておけば、少なくともOSごと停止してしまう事態は防ぐことができます。

ユーザ空間とカーネル空間のメモリ領域については、以前話題になったMeltdownの話題にもかかわってくるので、非常に重要な概念です。

 - コンピュータサイエンス