Abstracting physical resource(ハードウェア資源の抽象化)

アプリケーションはそれぞれが一番合う独自のライブラリを持つとか、まあざっくりいうとそれぞれのアプリケーションがメモリとかを節約しないと他が動作しないということですね。
それぞれのアプリケーションが
A「君の時間帯に使ってね」
B「わかった、じゃあこのあと使っていいよ」
なんて会話をしていたら問題ないわけですが、そんな事が起こり得るわけがありません。
それどころか
A「バグを起こされてこっちまで被害受けたら堪らない......Bはどこか行って」
B「こっちこそ、近ずくなよ」
状態なわけです。他のアプリケーションの影響をできるだけ受けないようにしたい訳です。
そして影響を受けないようにするのはアプリケーションをハードウェアの重要部分に直接アクセスさせないようにするのが一番な訳です。これはCの勉強の時にやった仮想メモリみたいな物なんでしょうか。
あとはアプリケーションがファイルシステムにアクセスするのは読み書きだけーとか。
ファイルシステムの管理はOSがやるんだーとか。
Unixはメモリイメージ(メモリに格納されてるデータ)にexecを通してアクセスしてて。
例のシステムコールはできるだけアプリケーション互いに影響を与えないように設計されてるそうです。

User mode, kernel mode, and system calls

OSとアプリケーション、これらを互いに影響を与えないようにするにはOSとアプリケーションをできるだけ遠ざけた方がいいです。アプリケーションのミスの所為でOSが不具合を起こすなんて嫌ですね。OSはアプリケーションが問題を起こしてもそれを解決して他のものを動作させ続ける必要があるんです。難しいですね。
CPUはこの『独立』機能を実現させるのに役立ってます。
例えばx86CPUにはカーネルモードとユーザーモードがあります。
カーネルモードでは特権(ディスクへの書き込み)などが可能ですが、ユーザーモードではできません。正確にはユーザーモードのアプリケーションで実行しようとしても実行せず、カーネルモードに切り替えてカーネルモードで片付けます。
片付けるのは違反したプロセスを強制終了して、そのプロセスが使用していたシステムリソース(メモリなど)を解放することを意味しています。
このヘタクソな図がわかりやすいですね。
qiitafigure0-1.png
ユーザー空間に存在しているのがユーザーモードのアプリケーションです。
アプリケーションがディスクを読み書きしたい場合にはカーネルモードに切り替わらなければいけないんですね。理由としては、アプリケーション自身がディスクの読み書きができないから、だそうです。とても面白い仕組みだと思います。
カーネルモードになるとアプリケーションはその命令を実行するべきか判断するそうです。
そしてそれを拒否するか実行するかするんですね。
カーネルモードに移行するポイントはアプリケーション側は選べません。
カーネル側が選びます。そんなの悪意のあるソフトウェアに完全に無抵抗って事ですからね。
(この選ぶっていうのもよく.......必要に応じてOSがカーネルモードにスイッチするって事?)

というよりはカーネルのコードを保護してアセンブリ側からも実行できない様に(読み書きできない)しているそうです。

Kernel Organization

重要な鍵となるのは『OSのどこをカーネルモードで実行させるべき』です。
OS全体をカーネルモードで走らせるのを前回登場したmonolithic kernelというらしいです。
ということはxv6はOS全体がカーネルモードで動いてるんですね。
この場合、OSはハードウェアに対して特権を持っていることになります。
これはOSを設計する上でとても簡単だそうです。なぜならハードウェアに対する特権を持つのかを決めなくていいからだそうです。とはいえ、それぞれどんな働きをするのかを決めるのはとても良いことです。仮想メモリとか(出てきたああああああ)!!!
monolithic kernelの欠点はOSが複雑、という点です。OSは複雑にできているため特権を持っている部分がエラーを起こすとそれはカーネル全体の致命的エラーに繋がってしまいます。つまり再起動が必要になります。
その点、そこが特権を持っていなくてもよくて、特権を持っていなかったらそこまで重大な問題にはなりませんよね。そこでOS設計者はカーネルモードで動く部分のコードを必要最小限にしようとします。これがマイクロカーネルです。
qiitafigure1-1.png
例えば、シェルがファイルサーバーにアクセスしたいとします。
その時はマイクロカーネルを経由して命令が送られるのです。
(原文ではメッセージと書かれていましたが、自分的には命令の方が的確かなあ....と)
マイクロカーネルの場合、カーネルはとてもシンプル(アプリケーションを起動させる、命令、ハードウェアにアクセスなどの最低限の機能しかない)になります。つまり、OSのほとんどがユーザーモードで動いているんです。monolithic kernelとは真逆ですね。
Linux,UNIX系OSはmonolithic kernelです。もちろんxv6も。
とはいえ、xv6は提供している機能が少ないのでマイクロカーネルよりもカーネルがシンプルになることがあったりするそうです。

Process overview

xv6が独立性を守るために採用しているのはプロセスだそうです。
これはプロセスAの情報やメモリをプロセスBが勝手に見ることを防ぐというものです。
もちろんプロセスAがカーネルの情報を得ようとしても防ぎます。
これはもちろん悪意のあるプログラムやバグが頻発するプログラム対策です。
より強い独立性を保つためにプログラムがまるで別のマシンで動いているかのようにするものもあります。
他のプロセスには見えないし書き込めないプライベートなメモリの場所を作り出すのです。
xv6ではページテーブルという仮想メモリと物理的なメモリを繋ぐ構造体を使っているそうです。
スクリーンショット 2018-05-05 18.27.54.png
ユーザーのプロセスのデータとかは0から始まるわけですね。
で、mallocで確保できる様に設計された領域がheapな訳ですね。

疲れたので今回はここまで

なんか.......ほぼ全翻訳ですね。
表現方法が違うとはいえ........少しカットしているとはいえ.........
読みながら書いてると色々書いてしまうものです。
今回はかなりボリューミーになりました。GW終わったら多分普通の量になります。
次回:未定

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.