x86 TSSを使わないコンテキスト切り替えについて
なんかTSSを使ったコンテキスト切り替えが思うように実装出来なかったので、ソフトウェアで実装してみた。
私の常識はMIPSの常識なので、当然汎用レジスタをPCBに保存して・・・とか思ってたら、
Intel x86ではこのタイミングで切り替えることは不要です。必要な情報はすでにスタック上に退避されています。
ええっ・・・そうなのか。。
壊しちゃいけないのが ebx, esi, edi, ebpとセグメントレジスタ
という事らしい。
で、BSDのコードを参考にしてこんな感じに作ってみた:
movl 4(%esp),%ecx movl 0(%esp),%eax movl %eax,THREAD_MD_EIP(%ecx) movl %ebx,THREAD_MD_EBX(%ecx) movl %esp,THREAD_MD_ESP(%ecx) movl %ebp,THREAD_MD_EBP(%ecx) movl %esi,THREAD_MD_ESI(%ecx) movl %edi,THREAD_MD_EDI(%ecx) pushfl popl THREAD_MD_EFLAGS(%edx) movl 8(%esp),%ecx movl THREAD_MD_EBX(%ecx),%ebx movl THREAD_MD_ESP(%ecx),%esp movl THREAD_MD_EBP(%ecx),%ebp movl THREAD_MD_ESP(%ecx),%esp movl THREAD_MD_ESI(%ecx),%esi movl THREAD_MD_EDI(%ecx),%edi movl THREAD_MD_EIP(%ecx),%eax pushl THREAD_MD_EFLAGS(%ecx) popfl movl THREAD_MD_EIP(%ecx),%eax movl %eax,(%esp) ret