私は、ユーザー空間スレッドを実装する仕組みを理解しようとしています。スタックとフレームの仕組みがわかりません。スレッド化とその実装方法を説明している 2 つの非常に優れたリソース (こことここ)に出くわしましたが、次の詳細をまだ理解していません。
- スレッドの実行でマシン コンテキストはどのように使用されますか? スタック ポインターと一連のレジスタ値で構成されていることはわかっています。しかし、OS はそれをどのように使用してスレッドを実行するのでしょうか?
- なぜトランポリン関数 (mctx_create_trampoline) が必要なのですか? リンク #2 では、マシン コンテキストを保存し、スレッド関数 (mctx_create_boot) を開始するシグナル ハンドラーとして関数をセットアップします。
- これらの関数に基づいて、スレッドが呼び出すことができる「yield」関数をどのように実装しますか? また、実行中のスレッドをどのように中断できますか? タイマーと、オフになったときにシグナルハンドラーを呼び出す SIGALRM があると思います。ただし、yield 関数がコンテキストを切り替えると、シグナル ハンドラーが返されず、それ以上のシグナルの配信がブロックされます。