1

アセンブリにグリーン スレッド/プロセスを実装しようとしています。

たとえば、この x64 アセンブリ コード (nasm 構文) には 2 つのループがあります。'a'がたくさん出力されますが、'a'と'b'を出力してほしいです。2 つのループを組み合わせるだけで問題が解決するため、これはもちろん実際の例ではありません。

global main

extern printf

section .text
main:

 .t1:
    mov eax, 0
    mov rdi, a
    call printf
    jmp .t1

 .t2:
    mov eax, 0
    mov rdi, b
    call printf
    jmp .t2

section .data
  a: db "a", 0
  b: db "b", 0

したがって、いくつかのレジスタを保存し、スタックポインタを変更しながら、命令ポインタをmain.t1または数マイクロ秒ごとに変更するある種のスケジューラを書きたいと思います。main.t2

これがユーザー空間で不可能である場合は理解していますが、プロセスが実行中のプログラムを変更できる可能性は非常に低いと思われます。ユーザー空間からできない場合、カーネルモジュールで可能でしょうか?

4

1 に答える 1

0

もちろん、カーネルモードでも可能です。タイマーからの割り込みを使用します。あなたの質問からあなたがどれだけ知っているかわかりません。当たり前のことを言ってすみません。リアル モードの 16 ビット コードから始めると、はるかに簡単になります。スケジューラとスレッドの両方を備えた .COM DOS プログラムを作成します (必要に応じて、後でローダーを作成できます)。スケジューラ/ディスパッチャ ルーチンでタイマー割り込みベクトルを設定します。ディスパッチャ (状態保存/ロード ルーチン) の記述は簡単です。割り込みによって CS:IP が保存されます。ロードと同様に、他のレジスタを保存するのはあなたの仕事です。スケジューラーはもう少しトリッキーです。おそらく最も単純なスケジューラーは「ラウンドロビン」です。これは単純にスレッド間を交互に切り替え、それぞれに等しい時間を与えます。リングリンクリストを使用して実装できます。また、一部のオペレーティング システム (*nix、

于 2013-11-16T20:09:32.893 に答える