まあ、命令全体を特定のアドレス(命令のサイズに依存しない)に移動するアセンブリ命令を見つけようとしています。そのような命令がない場合、システムコールや他のソフトウェアなしでマルチスレッド化が達成される方法について、誰かに私にいくつかのアイデアを教えてもらえますか?言い換えれば、私自身のオペレーティングシステムを作っているとしましょう。アセンブリで効率的なコードを使ってマルチスレッドを有効にするにはどうしたらいいですか?Asm:アセンブリ命令を特定のアドレスに移動する
答えて
生のアセンブリでマルチスレッドを達成する方法の問題:現代の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
命令を使用します。
定期的な割り込みについて述べました。どうやってやるの?私はどのように特定の束のコード(割り込み)5ミリ秒ごと(例えば)を実行するCPUを有効にする意味ですか? –
@Anastassisタイマーチップを適切にプログラミングします。 – fuz
@fuzありがとう! –
- 1. アセンブリの移動命令
- 2. アセンブリMIPS TAl命令
- 3. アセンブリJZ命令CMP
- 4. MIPSアセンブリ命令数
- 5. 移動命令がエラー
- 6. アセンブリ言語のCALL命令
- 7. RTS命令(68kアセンブリ言語)
- 8. Infineon TriCore TC1797アセンブリ命令JGE
- 9. 不明意味(:)アセンブリ命令
- 10. アセンブリ命令movレジスタ、[register] [register]
- 11. アセンブリPOPFとRCL/RCR命令
- 12. Powerpcアセンブリ命令bl SYM
- 13. 同じアセンブリ命令が、別のマシン命令
- 14. *命令オペランドの前に、GNUアセンブリ、AMD64
- 15. ELFからのアセンブリ命令の削除
- 16. DOSBox上の8086アセンブリ:idiv命令のバグ?
- 17. アセンブリの学習中の命令エラー
- 18. C/C++で命令のアドレスを取得
- 19. ARMアセンブリ内のSTRとLDR命令
- 20. X86アセンブリ - IDIV命令の処理
- 21. 機械コードへのアセンブリ命令
- 22. アセンブリ言語命令の実装
- 23. MOVとMOV.Bのアセンブリ言語命令
- 24. MIPS32アセンブリbeq命令の説明
- 25. asm命令を使用してMIPS CPUレジスタを読み取る
- 26. "out"と "in"命令の特権命令はありますか?
- 27. x86アセンブリの乗算命令と除算命令のオペランド、16ビット以上
- 28. ELFバイナリでasm命令を変更します
- 29. アセンブリ:ROL命令は正しい?
- 30. アセンブリx86補助演算命令
なぜマルチスレッド*は命令が単一の命令で移動される必要があると思いますか? – EOF
@EOFこれはどのように達成できましたか? –
ARM(A32とAArch64)、POWER MIPSなどの固定サイズ命令を持つアーキテクチャではかなり簡単です。このようなアーキテクチャでは、単純に32ビットの固定小数点数をロード/格納します。繰り返しますが、マルチスレッド化に関連する*可能性があります*あなたの質問から不明です。 – EOF