こんちはー。
皆さんカーネル知ってます?カーネルです。カーネル。ケンタッキー・フライド・チキンを作った人じゃないですよ。カーネルです。(劇バリつまらないギャグですね!)
今回はLinuxの中枢の位置するカーネルとは何なのかを記載します。
順を追って説明していきます。結構丁寧に説明するので必要ないなと思うところはどんどん読み飛ばしてください。(一応、パソコンというかLinux初心者の方にも読めるようにしたいと思ったのですが、そもそも初心者の方がカーネルについて知りたいって思わないかもしれませんね。。。)
というのもカーネルってLinuxでよく聞くのに自分の中でちゃんとまとめられていなかったので今回自分のアウトプットの意味も含めてまとめようと思いました。
いつもの事ですが間違いがあれば遠慮なくご指摘ください。
参考にしたのは以下です。途中に出てくる図もこちらから引用いたしました。
「[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識」です。
プロセス
まず、プロセスという概念から説明しなければなりまん。(プロセスに関しては別記事でまとめようと思います。その実態がなんなのかを書く予定です。)
「プロセスとはOSが各種プログラム実行した単位の事です。」(ドンッ!!)
しょっぱなから訳の分からない説明で申し訳ないです。そもそもプログラムっていうのは大きく3つに分けられるのですね。「アプリケーション」と「ミドルウェア」と「OS」です。
プログラムの種類とその関係性
「アプリケーション」は一番イメージしやすいかもしれませんが、スマホのアプリとかです。ユーザに対して直接役立つプログラムです。
「ミドルウェア」はアプリケーションを助けるプログラム。WebサーバやDBシステムなどがあげられます。OSSでいうとapacheなどが例で挙げられます。
「OS」はハードウェアを直接操作する部分です。アプリケーションやミドルウェアの実行には必須の心臓部のプログラムになります。例えばLinuxとかwindowsです。
そしてこれらのプログラムは互いに連携している関係を持っていて以下のような関係になります。
つまり、上記で述べた
「プロセスとはOSが各種プログラム実行した単位の事です。」
というのはOSがミドルウェアやアプリケーションのプログラムを実行したときの単位の事を示しています。(ただしOSもプログラムの1つです。)
上記の図でもあるようにOSはハードウェアと繋がっています。
ハードウェアとは機械的な装置です。パソコンにおいてハードウェアはキーボードであったり、マウスであったり、ディスプレイであったりします。これらパソコン周辺機器の事をデバイスと言います。
そしてLinux (LinuxはOSの種類の一つ)はこれらデバイスの操作ができます。
そしてLinuxではデバイスを操作する処理をデバイスドライバというプログラムにまとめてあり、プロセスからデバイスに対してはデバイスドライバを介してアクセスすることに仕組みができてます。
以下のような感じ
ここでなんでわざわざデバイスドライバを介してアクセスする必要があるのかと疑問に思うかもしれません。それは複数のプロセスがデバイスを操作すると予期せぬ動作を引き起こしてしまうためです。
ハードウェアとデバイスの違いは?
基本的にハードウェアとデバイスは同じものだと考えていいです。
ハードウェアはパソコン自体も含んでいて、デバイスはそれに接続して利用する機器だという違いがあります。
なのでパソコンやパソコンに付随するモニターやマウスやキーボードの総称をハードウェアと呼びます。
さらにモニターやマウスやキーボードはパソコンに接続されているものなのでデバイスとも呼ぶってことです。
同じものだと名前を変えなくてもいいじゃんと思いますよね。そうですよね。僕もそう思います。
カーネルモードとユーザモード
はい、カーネルの文字がもうそこまで見えてきました。
ここで上記の画像では問題がまだあるんです。
例えばバグであったり、悪いプログラマがいたりして、デバイスドライバを介さずにデバイスを操作するっていう可能性が出てきてしまいます。上記でも記載したように複数のプロセスがデバイスを操作すると予期せぬ動作を引き起こしてしまうのでどうにかしたいところ。
Linuxではこのようにデバイスドライバを介さずデバイスを操作することの無いように(プロセスからは直接デバイスにアクセスできないように)カーネルモードとユーザモードというのが備わってます。
カーネルモードで動作しているときのみデバイスにアクセスできるような仕組みになっています。
以下のような感じ。
そしてカーネルモードで動作するOSの核となる処理をまとめたプログラムを「カーネル」と呼ぶのです。