2017-06-05 8 views
-3

まあ、命令全体を特定のアドレス(命令のサイズに依存しない)に移動するアセンブリ命令を見つけようとしています。そのような命令がない場合、システムコールや他のソフトウェアなしでマルチスレッド化が達成される方法について、誰かに私にいくつかのアイデアを教えてもらえますか?言い換えれば、私自身のオペレーティングシステムを作っているとしましょう。アセンブリで効率的なコードを使ってマルチスレッドを有効にするにはどうしたらいいですか?Asm:アセンブリ命令を特定のアドレスに移動する

+0

なぜマルチスレッド*は命令が単一の命令で移動される必要があると思いますか? – EOF

+0

@EOFこれはどのように達成できましたか? –

+1

ARM(A32とAArch64)、POWER MIPSなどの固定サイズ命令を持つアーキテクチャではかなり簡単です。このようなアーキテクチャでは、単純に32ビットの固定小数点数をロード/格納します。繰り返しますが、マルチスレッド化に関連する*可能性があります*あなたの質問から不明です。 – EOF

答えて

0

生のアセンブリでマルチスレッドを達成する方法の問題:現代の32ビットx86プロセッサは、タスクスイッチングのハードウェアサポートを備えています。これを使用して、マルチタスク(個別のアドレス空間を持つ複数のプロセス)および/またはマルチスレッド(単一プロセス内の複数の実行スレッド)を実装できます。

この機能は、Intel 64 and IA-32 Architectures Software Developer's Manual第3巻第7章タスク管理に記載されています。 注:&を読んで、このばかばかしく密な4700ページの文書を理解するには、12の寿命が必要です。

このハードウェアサポートを使用するのは、何かを稼働させる最も簡単な方法ですが、おそらく最も効率的ではありません。 x86ベースのオペレーティングシステムは、これから手動タスクの切り替えに移行しました。これにより、システムは、CPUによって提供されていないスイッチング機能を実装することができ、フルスイッチが過度に使用された場合に最適化されたスイッチを実行することもできます。 x86プロセッサの64ビットロングモードでは、ハードウェアタスク管理のサポートがなくなりました。最新のオペレーティングシステムでは、手動タスクの切り替えが使用されます。マルチスレッド化を達成するための方法として、指示を移動するという考えを再


、私はここにあなたの概念は新しいコードへの切り替えが必要な場合にアドレス空間の周りにコードを移動することだと思います。これを行う必要性を排除する2つの代替技術があります。

まず、コードを移動する代わりに、別の場所のコードにジャンプすることができます。 PDP-11上のUnixのような初期のマルチタスク・オペレーティング・システムは、この技術を使用していました。すべてのアクティブなプログラムを異なる場所にメモリにロードし、周期的な割り込みを設定してシステムソフトウェアへの制御を頻繁に落とし、各割り込みでジャンプする次のプログラムを選択することができます。システムは、各プログラムが停止する場所を追跡して、同じ場所で再開できるようにする必要があります。

第2のアプローチは仮想メモリによって異なります。依然として単一の物理メモリ空間が存在する。さらに、複数の「仮想」メモリ空間が定義されています。任意の時点で、1つの仮想メモリ空​​間しかアクティブではありません。メモリにアクセスすると、システムは仮想アドレスをある物理アドレスに変換します。メモリにアクセスするプログラムは、それ自身の仮想アドレス空間しか見ることができません。

各タスクには独自のアドレス空間が与えられます。新しいタスクに切り替えると、システムはそのプライベートアドレス空間をアクティブにし、プライベートアドレス空間で最後に一時停止した場所で実行を再開します。単一の共有アドレス空間を移動したり、共有アドレス空間のある場所から別の場所にジャンプしたりする代わりに、実際には別々のアドレス空間のセット全体を定義します。必要に応じて新しいスペースに移動します。

最新のマルチスレッドは、このアプローチに大きく依存します。各プロセスはプライベートアドレス空間を持ちます。システムは必要に応じてそれらの間を移動します。プロセスにはスレッドが1つ以上あります。プロセス内のすべてのスレッドは同じアドレス空間を共有します。スレッドごとに格納するのは、実行が最後に一時停止された場所です。同じプロセスで新しいスレッドに切り替えると、現在のアドレス空間が保持され、新しいスレッドが最後に一時停止された場所にジャンプします。


説明を移動する方法の問題について、アセンブリ言語はそのような能力を提供しません。これは一般的なことではありません。メモリ内のマシンコードを操作したい場合は、Intel X86 Encoder Decoder libraryのようなライブラリを使用することをお勧めします。このようなライブラリには、存在する命令とマシンコードのバイト形式の知識があります。これにより、一連のバイトを命令として解釈することができます。

次の命令の大きさがわかったら、そのバイト数を移動することは簡単に組み立てることができます。 x86ではmov命令を使用します。

+0

定期的な割り込みについて述べました。どうやってやるの?私はどのように特定の束のコード(割り込み)5ミリ秒ごと(例えば)を実行するCPUを有効にする意味ですか? –

+0

@Anastassisタイマーチップを適切にプログラミングします。 – fuz

+0

@fuzありがとう! –