アセンブリプログラムがオペレーティングシステムをクラッシュさせるのを止めるものは何ですか?[閉まっている]


17

まず第一に、私は初心者なので、この質問が馬鹿げているように思える場合は、間違った仮定を指摘してください。

私が理解したことから、オペレーティングシステムの仕事は、OS上で実行されるハードウェアとソフトウェアを管理することです。また、私が理解していることから、アセンブリプログラムを使用すると、ハードウェアをほぼ直接制御できます。アセンブリプログラムでは、データをレジスタに読み書きしたり、RAMにデータを読み書きしたりできます。

レジスタとRAMを台無しにするこの自由を考えると、アセンブリプログラムがオペレーティングシステムに影響を与えることは不可能でしょうか?OSが重要な情報を格納するためにレジスタAを使用しており、そのOSでアセンブルされたプログラムを実行するとします。プログラムがジャンクをレジスタAに正常に書き込むと、OSが確実に影響を受けます。

質問:

  1. 上記の方法でレジスタAを台無しにすることは可能ですか?

  2. そうでない場合、アセンブリプログラムがOSによって使用されるレジスタを変更するのを妨げるものは何ですか?


13
スマートプログラマー...
トニースチュワートサニースキーガイEE75

現在、多くのコンピューターアーキテクチャがあり、過去にあり、多くのオペレーティングシステムが開発されました。どのアーキテクチャ/ OSを正確に参照していますか?いくつかの(古い)アーキテクチャーでは、開始後にプログラムが停止していた可能性がありませんでした。しかし、最新のハードウェア/ OSには、「通常」モード(スーパーユーザーではない)のプログラムのメモリの一部のみを提供するハードウェアツールが組み込まれており、この制限を超えるとメモリにアクセスできません。OSはレジスターに有用な情報を保存せず、メモリー/ディスクにのみ保存するため、レジスターは自由に使用できます。
サイクロン125

2
マイクロプロセッサでは、プログラムは「ユーザーモード」で実行され、オペレーティングシステムは「システムモード」で実行されます。たとえば、ユーザーモードプログラムが停止命令を実行した場合、マシンは停止しません。停止はトラップされ、オペレーティングシステムが呼び出されます。RAMに関しては、OSは、RAMアドレスXが本当にRAMのアドレスXではないであろうと、ユーザプログラムは見るものメモリ管理ハードウェアを介して、ように、ユーザーモードのプログラムのための環境をセットアップします
ジョージホワイト

1
@fluxコメントを更新しました。答えは次のとおりです。異なるコンピュータアーキテクチャ/ OSがある/あったので、質問に対する「一般的な」答えはありません。それにはさまざまな方法があります。
サイクロン125

2
...ずっと前に、未加工のマシンコードを記述していました。うん!:-)
ラッセルマクマホン

回答:


32

最終的に、ソース言語がアセンブラーか高水準言語かに関係なく、すべてのプログラムはマシンコードです。

重要なことは、他のプログラムまたはオペレーティングシステム自体に影響を与える可能性のある「混乱」レジスタなど、特定のプロセスが実行できることを制限するハードウェアメカニズムがあることです。

これは、「ユーザー」モードと「スーパーバイザー」モードの単純な区別から始まり、それ以降、複数の「リング」特権のあるセキュリティアーキテクチャに進化しました。


これをもう少し具体的にするための非常に一般的な例を示します。

  • 「ユーザーモード」では、プロセスはプロセスIDに割り当てられていないメモリにアクセスできません。他のプロセスとオペレーティングシステム自体に割り当てられたメモリはブロックされます。これには、他のプロセスで使用されるレジスタの値が含まれます。これは、MMUハードウェアによって実施されます。

  • したがって、「ユーザーモード」では、プロセスはMMU制御レジスタにアクセスできません。

  • そして明らかに、「ユーザーモード」では、オペレーティングシステム関数の呼び出しを含む非常に明確に定義されたメカニズムを使用しない限り、プロセスはモードを「スーパーバイザーモード」に変更できません。

プロセスがこれらのルールのいずれかを破ろうとすると、オペレーティングシステムが制御を取得します。これが発生すると、OSは問題のプロセスを単に停止し、それ以上の命令を実行することはありません。


2
私が正しく理解している場合、あなたが言っていることは次のとおりです。一部のプロセッサには「ユーザーモード」と「スーパーバイザーモード」があります。OSは「スーパーバイザーモード」で実行され、プロセッサを「ユーザーモード」にして、架空のアセンブリプログラムを実行します。「ユーザーモード」には、ハードウェアの意図的な設計のためにアセンブリプログラムがアクセスできないレジスタとRAMアドレスがあります。
フラックス

3
基本的に、この回答では、MMUおよび保護モードを備えた最新の「i386に似た」アーキテクチャについて説明します。しかし、本当のことを言えば、これらの機能を持たない古い(i8080、MOS 6502など)だけでなく、よりシンプルな(AVR、ARM Cortex-Mなど)アーキテクチャもあります。 CP / M、最新のFreeRTOS、ChibiOSなど)プログラムが実行していることを止めることはできません。
サイクロン125

2
@Flux i386(およびそれ以上)アーキテクチャは、学ぶべき詳細を提供します。x86アーキテクチャには、保護できるメモリアドレスだけでなく、I / Oアドレスもあります。(メモリアクセスとI / Oアクセスには異なる命令が使用されます。)i386 +には3つのメモリアドレスがあります。セグメント化/セレクタベースのアドレスは、テーブルエントリ(GDTまたはLDT)を参照するセレクタレジスタを使用して、ペアを単一の32ビット線形アドレスにマッピングします。次に、ページングテーブルは、32ビットの線形アドレスを36ビットの物理アドレス(P-II)に変換します。両方の変換ステップで保護が存在します。
jonk

4
要約が正しい@flux。適切なマルチタスクOSを備えた保護メモリシステム内のプログラムは、命令のストリームでシステムをクラッシュさせることはできません。無効なものでさえ-それらは特別なハンドラで終わります。
pjc50

(少なくともx86では)複数のリングがありますが、実際に使用されるのは2つ以上では非常にまれです。
フォレスト

10

多くのマルチタスクオペレーティングシステムは、プロセス制御ブロック(PCB)と呼ばれるデータ構造を使用して、レジスタの上書きの問題を処理します。コードを実行すると、OSはそれを追跡するための新しいプロセスを作成します。PCBには、レジスタの内容を保持するために割り当てられたプロセスとスペースに関する情報が含まれています。プロセスAが現在プロセッサで実行されており、コードがプロセスBにあるとします。コードを実行するとどうなりますか。

  1. プロセスAの状態データ(レジスタの内容、プログラムカウンターなど)は、PCBにコピーされます。

  2. プロセスBの状態データがPCBからCPUレジスタにコピーされます

  3. プロセスBは、完了するか、横取りされるまでプロセッサで実行されます。

  4. プロセスBの状態データは、PCBにコピーされます

  5. プロセスAの状態データはCPUにコピーされ、実行を継続します

オペレーティングシステムがプロセスAとして実行されている場合、プログラムが実行される前にレジスタを保存し、プログラムが終了したらそれらをCPUにコピーして、ユーザープログラムが他のプロセスで行われていることを妨げないようにする方法を見ることができます。

ユーザープロセスがメモリ内のOSデータを上書きしないように、ほとんどのプラットフォームはメモリセグメンテーションを使用します。基本的に、仮想メモリを使用して、プロセスが認識するアドレス空間を任意の範囲の物理アドレスにマッピングできます。プロセスの物理メモリ空間がオーバーラップしない限り、あるプロセスが別のプロセスのデータを上書きすることは不可能です。

もちろん、OSによって動作が異なるため、すべてのケースに当てはまるわけではありません。また、ほとんどのプラットフォームでは、OSプロセスはユーザープロセスとは異なるモードで実行され、そこにはいくつかの複雑さがあります。


4

あなたが話しているプラ​​ットフォームに依存します。

  • より基本的なプロセッサでは、プロセッサはプログラムが実行するよう指示した命令を実行します。

  • より洗練されたプロセッサには、(少なくとも)2つのモードがあります。1つのモードでは、プロセッサはプログラムが実行するように指示したものをすべて実行します。他のモードでは、プロセッサ自体特定の命令の実行を拒否します。

プログラムがシステム全体をクラッシュさせるのを止めるものは何ですか?最初のタイプのプロセッサでは、答えは「なし」です。基本的なプロセッサでは、1つの不正なプログラムが実際にシステム全体をクラッシュさせる可能性があります。初期の8ビットホームコンピューターと16ビットコンピューターの多くは、このカテゴリーに分類されます。

最新のPCでは、プロセッサに「保護」ハードウェアがあります。基本的に、OSは何でもできる特別なモードで実行されますが、通常のプログラムは、プロセッサが特定のアクションのみを許可するモードで実行されます(OSがプロセッサに構成した設定に基づいて)。特定のレジスタにのみアクセスする、または特定のメモリ範囲にのみアクセスするようなもの。

明らかに、単一の不正プログラムがシステム全体をクラッシュさせることは悪いことです。(不正なプログラムが必要なデータにアクセスできるようにすることには、セキュリティ上の重大な影響もあります。)これを回避するには、次の2つが必要です。

  1. 実際に保護ハードウェアを備えたプロセッサ(つまり、特定の命令の実行を拒否するように構成できます)。

  2. これらの機能を実際に使用して自身を保護するOS。(OSが使用しない場合、保護回路を備えたチップを使用するのは良くありません!)

ほぼすべての最新のデスクトップOS(Windows、Linux、Mac OS、BSD ...)には、保護ハードウェアを備えたプロセッサで実行されているプロテクトモードOSを指定できます。いくつかの8ビットマイクロコントローラーで組み込み開発を行っている場合、おそらく保護ハードウェアはありません。(または、そのことについては...)


1

Q.アセンブリプログラムによるオペレーティングシステムのクラッシュを防ぐものは何ですか?

A.何もありません。

しかし、非常に賢いプログラマーの多くは、長年にわたってそれをますます困難にするために一生懸命努力してきました。残念ながら、すべての賢いプログラマーには、賢いプログラマーよりも創造的で野心的で、時には幸運な人がたくさんいます。賢いプログラマーが、だれも何かするべきではない、そうする、できない、と言うたびに、そこにいる誰かがそれを行う方法を見つけます。Microsoft Windows(例として)はほぼ35年前から存在しており、オペレーティングシステムをクラッシュさせた単なる指示であるBSoD(死のブルースクリーン)がまだあります。

少し用語から始めましょう。コンピューターで実行されるものはすべて、マシンコードで実行されます。キーストロークまたはマウスポインターの動きを読み取るビット、ディスプレイ上のピクセルの色を変更するビット、またはファイルからバイトを読み取るビット、および弾丸が悪者にぶつかったかどうかを決定するビットを計算するビットクレジットカードの申し込みが受け入れられる場合は、すべて一連のマシンコード命令として実行されます。一部のジョブは非常に一般的であり、頻繁に実行されるため、それらを実行するために必要な命令を組み立てて、全員にそのアセンブリを使用させることが理にかなっています。他のユーザーによるコンピューターの使用を許可または支援するこれらのジョブの集まりは、オペレーティングシステムと呼ばれる傾向がありますが、それらと他のプログラムとの間に本質的な違いはありません。これらはすべて、マシンコード命令の単なるシーケンスです。

オペレーティングシステムをより複雑にする(したがって、クラッシュする傾向がある)のは、通常は考慮する必要がないことを考慮しなければならないということです。例として最も単純なジョブを取り上げます。ファイルの最後にメッセージを書きたい。高水準言語では、次のように記述します。

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

物理状態へのアクセス方法と変更方法、ビットとバイトとしての解釈方法、またはメモリとCPUとの間でそれらのバイトがどのように転送されるかに関するすべての詳細を無視し、OSが提供するプログラムによって処理されるすべてを信頼できるようにします舞台裏で。ファイルの最後に追加する方法について考えてみましょう。1)ファイルの終わりがどこにあるかを調べ、2)その位置に何かを書きます。何が間違っている可能性がありますか?実際、かなりたくさんあります。あなたが賢いことをしている間に、コンピューターで他に何が起こっているのかを考えてください。他の誰か(オペレーティングシステム自体を含む)によって何かが何らかの方法で作業中のファイルを変更する場合、この本当に単純なジョブは突然、はるかに複雑になります。ファイルは長くなり、ファイルは短くなります。ファイルはもうありません。ディスクがいっぱいです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.