core.cpp arch_save_thread_registers ihandler.asmからよびだされる。このプロシージャの処理はスレッドで使用していた レジスタをすべてg_currentThread->ArchThreadInfoに保存している。 ここで、カーネルコードから割り込まれた場合と、ユーザーコードから割り込まれた場合とで 保存されるレジスタの情報が異なる。どちらのコードから呼び出されたかは、 割り込みが呼び出された側のCSを調べればわかる。このセレクタの下位2ビットに 割り込まれた時点でのCPL(カレント特権レベル)が保存されているのでこの値が 0であればカーネルコードからの割り込み。3であればユーザーコードからの割り込みになる。 カーネルコードから呼び出された場合: 保存されるレジスタ情報は typedef struct ArchThreadInfo { dword eip; // 0  :割り込まれた時点でのコードの位置 dword cs; // 4  :割り込まれた時点でのコードセグメントセレクタ dword eflags; // 8  :割り込まれた時点でのフラグレジスタ情報 dword eax; // 12 :割り込まれた時点でのEAXレジスタ情報 dword ecx; // 16 :割り込まれた時点でのECXレジスタ情報 dword edx; // 20 :割り込まれた時点でのEDXレジスタ情報 dword ebx; // 24 :割り込まれた時点でのEBXレジスタ情報 dword esp; // 28 :割り込まれた時点でのESPレジスタ情報 dword ebp; // 32 :割り込まれた時点でのEBPレジスタ情報 dword esi; // 36 :割り込まれた時点でのESIレジスタ情報 dword edi; // 40 :割り込まれた時点でのEDIレジスタ情報 dword ds; // 44 :割り込まれた時点でのDSレジスタ情報 dword es; // 48 :割り込まれた時点でのESレジスタ情報 dword fs; // 52 dword gs; // 56 dword ss; // 60 dword dpl; // 64 dword esp0; // 68 dword ss0; // 72 dword cr3; // 76 }; 一方ユーザーコードから割り込まれた場合は次のようになる。 typedef struct ArchThreadInfo { dword eip; // 0  :割り込まれた時点でのコードの位置 dword cs; // 4  :割り込まれた時点でのコードセグメントセレクタ dword eflags; // 8  :割り込まれた時点でのフラグレジスタ情報 dword eax; // 12 :割り込まれた時点でのEAXレジスタ情報 dword ecx; // 16 :割り込まれた時点でのECXレジスタ情報 dword edx; // 20 :割り込まれた時点でのEDXレジスタ情報 dword ebx; // 24 :割り込まれた時点でのEBXレジスタ情報 dword esp; // 28 :ユーザーコードのスタックポインタ情報 dword ebp; // 32 :割り込まれた時点でのEBPレジスタ情報 dword esi; // 36 :割り込まれた時点でのESIレジスタ情報 dword edi; // 40 :割り込まれた時点でのEDIレジスタ情報 dword ds; // 44 :割り込まれた時点でのDSレジスタ情報 dword es; // 48 :割り込まれた時点でのESレジスタ情報 dword fs; // 52 dword gs; // 56 dword ss; // 60 :ユーザーコードのスタックセグメント情報 dword dpl; // 64 dword esp0; // 68 dword ss0; // 72 dword cr3; // 76 }; 格納されるレジスタ情報の違いはスタックセグメントとスタックポインタの情報の 違いである。ユーザーコードから割り込まれた場合は元のスタックセグメントの セレクタも格納している。 HIGH | | 3C|呼び出し側SS | 38|呼び出し側ESP |←割り込みが呼び出される前のESPの位置(From Kernel) 34|フラグレジスタ | 30|呼び出し側CS | 2C|呼び出し側EIP |←割り込みが呼び出された時点でのESPの位置 28|EAX | 24|ECX | 20|EDX | 1C|EBX | 18|ESP |(割り込みが呼び出された時点でのESPが入っていることになる。) 14|EBP | 10|ESI | 0C|EDI | 08|DS | 04|ES | 00|EIP(戻り先) |←このプロシージャが呼び出された時点でのESP | | LOW ;;---------------------------------------------------------------------- ;; save register to current thread ;;---------------------------------------------------------------------- arch_save_thread_registers: mov eax, dword[g_currentThread] mov ebx, dword[eax + 0 ] ; ArchThreadInfo mov eax, dword[esp + 48] ; get cs and eax, 0x03 ; check cpl is 3 cmp eax, 0x03 je from_user from_kernel: mov eax, dword [esp + 44]; save eip mov dword[ebx], eax mov eax, dword [esp + 48]; save cs mov dword[ebx + 4], eax mov eax, dword [esp + 52]; save eflags mov dword[ebx + 8], eax mov eax, dword [esp + 40]; save eax mov dword[ebx + 12], eax mov eax, dword [esp + 36]; save ecx mov dword[ebx + 16], eax mov eax, dword [esp + 32]; save edx mov dword[ebx + 20], eax mov eax, dword [esp + 28]; save ebx mov dword[ebx + 24], eax mov eax, dword [esp + 24]; save esp add eax, 0xc mov dword[ebx + 28], eax mov eax, dword [esp + 20]; save ebp mov dword[ebx + 32], eax mov eax, dword [esp + 16]; save esi mov dword[ebx + 36], eax mov eax, dword [esp + 12]; save edi mov dword[ebx + 40], eax mov eax, [esp + 8] ; save ds mov dword[ebx + 44], eax mov eax, [esp + 4] ; save es mov dword[ebx + 48], eax ret from_user: mov eax, dword[esp + 60] ; save ss3 mov dword[ebx + 60], eax mov eax, dword[esp + 56] ; save esp3 mov dword[ebx + 28], eax mov eax, dword [esp + 44]; save eip mov dword[ebx], eax mov eax, dword [esp + 48]; save cs mov dword[ebx + 4], eax mov eax, dword [esp + 52]; save eflags mov dword[ebx + 8], eax mov eax, dword [esp + 40]; save eax mov dword[ebx + 12], eax mov eax, dword [esp + 36]; save ecx mov dword[ebx + 16], eax mov eax, dword [esp + 32]; save edx mov dword[ebx + 20], eax mov eax, dword [esp + 28]; save ebx mov dword[ebx + 24], eax mov eax, dword [esp + 20]; save ebp mov dword[ebx + 32], eax mov eax, dword [esp + 16]; save esi mov dword[ebx + 36], eax mov eax, dword [esp + 12]; save edi mov dword[ebx + 40], eax mov eax, [esp + 8] ; save ds mov dword[ebx + 44], eax mov eax, [esp + 4] ; save es mov dword[ebx + 48], eax ret