struc PCB .PID resd 1 ; Offset: 0 .STATE resd 1 ; Offset: 4 .KSTACK resd 1 ; Offset: 8 .CONTEXT resd 1 ; Offset: 12 .TF resd 1 ; Offset: 16 .FLAGS resd 1 ; Offset: 20 .NEXT resd 1 ; Offset: 24 .PAGE_DIRECTORY resd 1 ; Offset: 28 endstruc ; void switchProcess(Process* next) section .text global switchProcess extern current extern trapret switchProcess: mov eax, [esp + 4] ; eax = old mov edx, [esp + 8] ; edx = new push ebp push ebx push esi push edi mov [eax+4], esp mov esp, [edx+4] ;mov eax, [edx+12] ;sub eax, 0xC0000000 ;mov cr3, eax pop edi pop esi pop ebx pop ebp ret ; Для ring 0 просто возвращаемся trapret: ; Восстанавливаем общие регистры из trap frame ;popal ; edi, esi, ebp, oesp, ebx, edx, ecx, eax ; Восстанавливаем сегментные регистры pop gs pop fs pop es pop ds popad ; Пропускаем trapno и err add esp, 8 ; trapno (4 байта) + err (4 байта) ; Теперь ESP указывает на eip, cs, eflags, esp, ss iret