7

カーネルがシステムを制御する場合、アセンブリ言語はどのように機能しますか?

アセンブリ言語は、コンピューターが「理解する」ニーモニックと、特定のタスクを容易にするためのさまざまなマクロのコレクションとして導入されています。

オペレーティングシステムに要求を行わずにCPUとメモリを制御できない場合、アセンブリはどのようにCPUとメモリを制御できますか?

たとえば、命令を実行したい場合、それを実行mov ax, #4できるようにするために、プログラムがOSに要求を送信する必要はありませんか?

私は本当に興味があります...

ありがとう!

4

3 に答える 3

11

CPU には、OS がリソースを保護するのを支援するメカニズムがあります。x86チップの例を使用しましょう。などの「汎用」レジスタeaxは保護されません。しかし、 などのデバッグ レジスタはDR0ありません。

OS が実行されているとき、CPU は「リング 0」または総称して「システム モード」と呼ばれるもので実行されています。プログラムは、x86 で「リング 3」、つまり「ユーザー モード」と呼ばれるものを実行しています。

実行がリング 3 からリング 0 に変わると (その方法については後で詳しく説明します)、CPU はユーザー モードの保護を解除します。これにより、OS はデバッグ レジスタを変更できます。

ただし、OS によって保護される主なものは、メモリの場所とデバイスの入出力です。このため、命令inout命令は特権が与えられており、リング 3 では実行されない場合があります。

メモリは TLB によって保護されます。TLB は、ユーザー モード プロセスから見える仮想メモリ (VM) アドレス レンジャーの定義にも使用されます。各プロセスから見えるメモリ空間を制御するのはこのテーブルです。TLB 自体は、リング 0 オペレーティング システムのみが変更できるメモリに格納されます。同様に、割り込みベクトルとメモリにマップされたデバイスは、OS のみがアクセスできるメモリ範囲に割り当てられます。

たとえば を実行すると、mov [eax], 3eax が参照するアドレスが TLB で検索されます。CPU は、TLB 内のアクセス ビット (NOEXEC ビットなど) から、命令が合法的にメモリにアクセスしているかどうかを判断します。

プロセスが OS スケジューラによってスワップされると、そのような汎用レジスタeaxは、OS によって維持されるスレッドごとのメモリ領域に保存されます。切り替え先のスレッドは、以前のレジスタ値のメモリ イメージから復元されます。

OS がすべての機械語命令に干渉すると、コンピューターは信じられないほど遅くなります。特に、汎用レジスタへのアクセスは可能な限り高速に維持する必要があります。メモリ アクセスの TLB ルックアップはキャッシュされ、メモリ アクセス自体より遅くはありません。

リング 3 からリング 0 に切り替えるために、ソフトウェア割り込みが生成されます。これが「システムコール」割り込みです。割り込みはリング 0 で実行され、OS によって最初のプロセスが開始される前に構成されます。システム コール割り込みは、制御を OS コードに渡します。実行が割り込みサービス ルーチンから戻ると、CPU はリング 3 に戻ります。

于 2013-02-26T18:45:29.377 に答える
5

プログラムは、リング外のリソース/メモリにアクセスしない限り、必要な命令を実行できます。その場合、エラー (セグメンテーション違反または一般保護) が生成され、カーネルによって強制終了されます。

于 2013-02-26T18:35:31.847 に答える
1

アセンブリ言語は、C や Pascal などのような単なるプログラミング言語です。プログラムがどの言語であっても実行されるためには、コンピューター上で実行されるプログラムは、そのコンピューターの機械語である必要があります。多く/ほとんどの言語は、アセンブリ言語の場合のようにアセンブルされるか、高水準言語の場合のようにターゲット システムのマシン コードにコンパイルされます。一部の言語 (Java、Python、および場合によっては Pascal) は、機械語でもある中間言語にコンパイルされますが、機械語にコンパイルされる言語で書かれたプログラムによって実行時に解釈されます。ここでも、マシン コードがマシン上で実行されます。

どの言語について話しているかは問題ではありません。システム コールはシステム コールであり、メモリ制限やその他のオペレーティング システムに課せられた制限が適用されます。したがって、C言語であろうとアセンブリ言語であろうと、システムコールを実行してファイルを開いたり、端末などに何かを出力したりできます。

于 2013-02-26T18:43:41.003 に答える