2012-10-10 16 views
20

プログラムがコンパイルされると、マシンによって "理解"できるマシンコードに変換されます。キーボードからの入力を得るために、このマシンコードはどのようにオペレーティングシステムと対話しますか? 私には、マシンコードがオペレーティングシステムよりも低いレベルで実行されるはずなので、OSがどのようにコンパイルされたアプリケーションとハードウェアの間の仲介役を果たすことができるのか理解できません。コンパイルされたプログラムはどのようにOSと対話しますか?

PS:私はちょうどC++プログラミングを始めたと私は、オペレーティング・システムは、プログラムが下位レベルのサービスへのアクセスを取得するために呼び出すことができますsystem callsをどのように提供するかCINとCOUT仕事

+1

コンパイルされたアプリケーションは、他のマシンコードの関数を含むDLL(Windowsのkernel32.dllなどのオペレーティングシステム)に対する関数呼び出しを行うだけです。他のマシンコードはハードウェアと連携するように特別に書かれているので、そうする必要はありません。 –

+1

あなたの質問に対する答えは多少接線ではありませんが、言語とOSの境界に興味がある場合は、プロセスの多くのステップのいくつかで少し畏敬の念/恐怖/嫌悪感を与えます〜についての不思議...://http://stackoverflow.com/a/2444508/211160 – HostileFork

答えて

23

これは非常に良い質問(あなたが知っているよりも良い)であり、学ぶことがたくさんあります。たくさん。

私はそれを省略しようとします。オペレーティングシステムは、ソフトウェアとハ​​ードウェアとの間の抽象化レベルとして作用:

Software 
     . 
     /|\  
     | communicates with 
     \|/ 
     ' 
Operating System 
     . 
     /|\  
     | communicates with 
     \|/ 
     ' 
    Hardware 

OSがドライバ(広く使われている用語)と呼ばれるプログラムを介してハードウェアと通信し、OSがシステムと呼ばれる手順を介してソフトウェアと通信(あまり広く使われていない用語)を呼び出します。

システムコールを行うときは、プログラムを終了し、オペレーティングシステムのコードを入力します。システムコールは、プログラマがリソースと通信するための唯一の方法です。今


私はそこに停止しますが、あなたはまた、言った:「私に

は、マシンコードが よりも低いレベルでオペレーティングシステムを実行すべきであると思われるので、私がすることができますOSがどのようにして がコンパイルされたアプリケーションと ハードウェアとの間の仲介役を果たすことができるかを理解する。

これはトリッキーですが、基本的なことを理解すれば簡単です。

まず、すべてのコードは、CPU上で実行されているマシンコードです。コードは他のコードよりも高いか低いです(特権付きカーネルモードでしか実行できないコマンドを除きます)。だから問題は、CPUがユーザーに制御されていなくても、OSがどう制御できるかということです。

コードがCPU上で実行されている場合、という割り込みがという概念があります。これはCPUに送信され、現在実行中のコードを停止させ、割り込みハンドラと呼ばれる別のコードで切り替える信号です。

割り込みの例には、キーボード、マウス、最も重要なのはクロックが含まれます。

定期的にクロック割り込みが発生すると、オペレーティングシステムのクロック割り込みハンドラが実行されます。このクロック割り込みハンドラ内では、現在実行中のコードを調べるオペレーティングシステムのコードが、次に実行するコードを決定します。これは、より多くのオペレーティングシステムコードまたはより多くのユーザーコードです。

クロックは常には刻々と過ぎ、およびオペレーティング・システムのため常には、CPU上で実行するには、この定期的な機会を得るであるので、それは同じセットのを使用して実行していても、コンピュータ内のすべてのオーケストレーションすることができますCPUコマンドは通常のプログラムと同じです。

+1

非常に簡単な方法でそれを説明する素晴らしい仕事。 –

+2

CPUは複数のモード(カーネルとユーザ)で実行することもでき、OSコードはより高い特権のカーネルモードで実行されます。 – OrangeDog

+0

ありがとう..それは非常に良い答えでした。 システムコールは、アプリケーションコードの実行を停止させる割込みのようなものであり、スイッチはOSコードを出している(つまり実行を開始している)と言うのは間違いないでしょうか? – mahela007

5

理解しようとしています。

システムコールは、おそらく外部プログラムの実行に使用していた関数とは異なります。

システムコールは、ヒープメモリを要求し、ネットワークを介して通信する、アクセスファイルのようなものを行うために使用されているなど

関連する問題