60 lines
1.3 KiB
NASM
60 lines
1.3 KiB
NASM
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 |