最近のプログラミングの入門を振り返ってみると、意図的にメモリアドレスをランダムに読み書きするC++プログラムを作成した記憶があります。私は何が起こるのか見たいと思いました。
驚いたことに、私のWindows 98 PCでは、私のプログラムには非常に奇妙な副作用がありました。場合によっては、オペレーティングシステムの設定を切り替えるか、グラフィックの欠陥を生成します。通常、何もしないか、システム全体でクラッシュが発生します。
後で、これはWindows 98がユーザープロセスがアクセスできるターゲットを制限しなかったためであることがわかりました。他のプロセスはもちろん、オペレーティングシステムでも使用されるRAMを読み書きできます。
私はこれがWindows NTの出現に変わったことを理解しています(修正するのに少し時間がかかったと思います)。 Windows では、お客様に属していないプロセスについて RAM を表示できません。
後でLinuxシステムで私のプログラムを実行しましたが、それほど多くの興味深い結果が得られなかったことを思い出してください。私が正しく理解したなら、これは少なくとも部分的にユーザー空間とカーネル空間が分離されているからです。
だから私の質問は次のとおりです。
Linuxがユーザースペースとカーネルスペースを分離しなかった時代はありましたか?つまり、悪意のあるプログラムがLinuxシステムに似たダメージを与えたことはありますか?
答え1
Linuxは常にユーザー空間が使用するメモリに直接アクセスするのを防ぎ、プロセスが互いにメモリに直接アクセスするのを防ぎます。プログラムは、カーネルによってマッピングされたメモリにアクセスできる仮想アドレス空間を介してのみメモリにアクセスできます。割り当てられたメモリ外のメモリにアクセスすると、分割エラーが発生します。 (プログラムは、悪名高いおよび/dev/mem
を含むシステムコールとドライバを介してカーネルにアクセスできます/dev/kmem
。また、互いにメモリを共有することもできます。)
MMUはUnix / Linuxカーネル内にありますか?それとも、独自のメモリを持つハードウェアデバイスにのみありますか?今日、Linuxでカーネル/ユーザーの分離がどのように処理されるかを説明しています(以前のバージョンのLinuxではこれを別の方法で処理しました。を参照)。Linuxメモリ管理の概要そして80386 メモリ管理詳細はこちら)。
たとえば、一部のLinux関連プロジェクトでは、これらの分離を排除します。組み込み可能なLinuxカーネルのサブセット8086 CPUと互換性のあるLinuxのサブセットなので、ハードウェアの強制保護を提供しません。µClinuxメモリ管理デバイスを持たない組み込みシステムのサポートを提供します。コアの「コンポーネント」はメインラインカーネルの一部ですが、「PC」アーキテクチャではこの構成は不可能です。
答え2
Linuxがユーザースペースとカーネルスペースを分離しなかった時代はありましたか?
「Linux」、「ユーザー空間」、「カーネル空間」という用語をどのように定義するかによって異なります。
Linus Torvaldsが元のLinuxをどのように作成したのか覚えていますか? Linusは少しお金を節約し、Intel 80386 CPUを搭載した(当時最先端の)PCを購入しました。彼は80386がどのように機能するかを理解したかったので、これを行う最善の方法は80386アセンブリでいくつかの低レベルのハードウェアコードを書くことだと思いました。同時に、彼は大学にログインするために使用したMinix上で動作するターミナルエミュレータのパフォーマンスに満足していませんでした。
それで彼は80386アセンブリを使って直接起動できるターミナルエミュレータを書くことにしました。そのためには、ブートローダ、キーボードドライバ、(文字)ディスプレイドライバ、シリアルドライバ、および大学接続に使用されるすべてのプロトコルのドライバを作成する必要があります。
すぐに彼は彼も大学からファイルをダウンロードしたいと思ったので、いくつかのファイル転送プロトコル(おそらくZMODEMですが、単純化のためにXMODEMを選択したかもしれません)とハードドライブ、パーティションテーブルパーサー、およびファイルを実装する必要がありました。 Minixファイルシステムドライバ用のシステム。彼はまた、ターミナルエミュレータがいくつかの長期実行タスク(ファイルのダウンロードなど)を実行しながら作業を続けたいので、マルチスレッドを実装しました。
この時点で、彼はオペレーティングシステムのいくつかの重要な部分をすでに実装していることに気づいたので、ターミナルエミュレータをオペレーティングシステムに変えることがもう一つの興味深いプロジェクトになると思いました。
その後、ある時点で、彼は誤って誤ったコマンドを入力して、Minixパーティションをバックアップで上書きしました。今、彼はMinixを再インストールするか、オペレーティングシステムをシャットダウンして使用する選択に直面しました。
彼のオペレーティングシステムが簡単なプログラムを実行できるようになると、彼はそれを大学のFTPサーバーにアップロードすることを決め、Freaxという名前を付けました。しかし、FTPサーバーのシステム管理者は名前が気に入らず、ファイル名をLinuxに変更することにしました。 Linuxが良いと思ったからです。
しばらくすると、Linusは有名なスピーチでLinuxを初めて公に述べました。 Linuxは80386と密接に関連しており、他のものに移植することはできず、Linuxは決して巨大になるか専門的ではないと予測しました。
今の問題は、この旅程のどの時点で「Linux」が「Linux」になり、この旅程のどの時点でLinuxが「カーネル」になるかです。したがって、ユーザー空間とカーネル空間の分離について話すのは妥当です。 ?
最初に述べたように、この用語をどのように定義するかによって異なります。
つまり、悪意のあるプログラムがLinuxシステムに似たダメージを与えたことはありますか?
後でオペレーティングシステムになって「Linux」と呼ばれるソフトウェアが何の保護もなく、「カーネル」と呼ぶことができるほどサービスが複雑で、十分に独立していたソフトウェアが開発された時が明らかにありました。このようなサブシステムを「プログラム」と呼ぶことができる。たとえば、「実際の」Unixシステムでは、ターミナルエミュレータとファイル転送は通常2つの別々のプログラムであり、シリアルポート、ハードドライブ、画面、キーボード、およびファイルシステムへのアクセスを含むこれら2つのプログラム間のコーディネータはカーネルです。
しかし、このソフトウェアは「Linux」ですか?決定は皆さんにお任せいたします。
答え3
はい、Linuxではメモリ保護のために常にMMUが必要でした。多くの人がこれをMMUなしでコンパクトな組み込みシステムに移植していますが、もはや完全なメモリ保護機能がないため、プロセスはほとんどすべてを読み書きできます。