bits 32

global gdt_flush

gdt_flush:
    ; Берем адрес gdtp, переданный как аргумент функции (лежит в стеке)
    mov eax, [esp + 4]
    lgdt [eax]          ; Загружаем новую GDT

    ; Обновляем сегменты данных. 0x10 — это смещение Kernel Data в нашей GDT (индекс 2 * 8 = 16 = 0x10)
    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax

    ; Делаем дальний прыжок, чтобы обновить регистр CS.
    ; 0x08 — это смещение Kernel Code (индекс 1 * 8 = 8 = 0x08).
    ; Процессор прыгнет на метку .flush, но уже с новым селектором CS.
    jmp 0x08:.flush

.flush:
    ret
