From c92839c7f6b30be9985a5dd78803f38fa43fffbc Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Sun, 6 Apr 2025 19:39:01 +0300 Subject: [PATCH] gdt: setup TSS --- src/boot.asm | 96 ++++++++++++++++++++++++++++++++++++---------------- src/gdt.asm | 23 ++++++++++--- 2 files changed, 85 insertions(+), 34 deletions(-) diff --git a/src/boot.asm b/src/boot.asm index 21f035e..2ca9b5b 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -6,16 +6,49 @@ section .multiboot dd 0x00 dd - (0x1BADB002+0x00) -section.data +section .data align 4 multiboot_info: - dd 0 ; flags - dd 0 ; mem_lower - dd 0 ; mem_upper - dd 0 ; boot_device - dd 0 ; cmdline - dd 0 ; mods_count - dd 0 ; mods_addr + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + +global tss +global tss_end +align 4 +tss: + dd 0 ; 0-3 + dd stack_top ; 4-7 + dd DATA_SEG ; 8-11 + dd 0 ; 12-15 + dd 0 ; 16-19 + dd 0 ; 20-23 + dd 0 ; 24-27 + dd 0 ; 28-31 + dd 0 ; 32-35 + dd 0 ; 36-39 + dd 0 ; 40-43 + dd 0 ; 44-47 + dd 0 ; 48-51 + dd 0 ; 52-55 + dd 0 ; 56-59 + dd 0 ; 60-63 + dd 0 ; 64-67 + dd 0 ; 68-71 + dd DATA_SEG ; 72-75 + dd CODE_SEG ; 76-79 + dd DATA_SEG ; 80-83 + dd DATA_SEG ; 84-87 + dd DATA_SEG ; 88-91 + dd DATA_SEG ; 92-95 + dd 0 ; 96-99 + dw 0 ; 100-101 + dw 104 ; 102-103 +tss_end: section .bss stack_bottom: @@ -27,32 +60,37 @@ section .gdt %include "src/gdt.asm" section .text -;global start global start:function (start.end - start) extern kmain ; this function is gonna be located in our c code(kernel.c) start: - mov esp, stack_top - cli ;clears the interrupts + mov esp, stack_top + cli + push ebx ; Сохраняем оригинальный ebx (указатель Multiboot) - lgdt [gdt] - mov ax, DATA_SEG - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - jmp CODE_SEG:.huita + lgdt [gdt] + + ; Заполняем адрес TSS в дескрипторе GDT + mov eax, tss ; Получаем 32-битный адрес tss + mov ebx, gdt_tss ; Адрес дескриптора TSS в GDT + mov [ebx + 2], ax ; Нижние 16 бит адреса TSS + shr eax, 16 ; Сдвигаем для доступа к старшим битам + mov [ebx + 4], al ; Средние 8 бит адреса TSS + mov [ebx + 7], ah ; Верхние 8 бит адреса TSS + + mov ax, DATA_SEG + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + jmp CODE_SEG:.huita .huita: - push ebx - call kmain ;send processor to continue execution from the kamin funtion in c code - -;;;;;;;;;;;DIVISION BY ZERO TEST -; mov ax, 10 -; mov bx, 0 -; div bx -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - hlt ; halt the cpu(pause it from executing from this address + mov ax, TSS_SEG + ltr ax + pop ebx ; Восстанавливаем оригинальный ebx + push ebx ; Передаем его в kmain + call kmain + hlt .end: diff --git a/src/gdt.asm b/src/gdt.asm index fea63ae..1184260 100644 --- a/src/gdt.asm +++ b/src/gdt.asm @@ -1,3 +1,8 @@ +section .gdt + +extern tss ; Объявляем tss как внешний символ из .data +extern tss_end + gdt_start: ; null entry dd 0 @@ -35,14 +40,22 @@ gdt_data_ring3: db 11001111b db 0 +gdt_tss: + dw 103 ;tss_end - tss - 1 ; Limit (размер TSS - 1) + dw 0 ; Base (будет заполнено вручную в boot.asm) + db 0 ; Base (средние 8 бит) + db 10001001b ; Access: Present, Ring 0, Type 9 (Available TSS) + db 00000000b ; Limit (48-51) и Flags (52-55): Granularity=0, Size=0 + db 0 ; Base (верхние 8 бит) + gdt_end: - gdt: - dw gdt_end - gdt_start - 1 ; length - dd gdt_start ; address + dw gdt_end - gdt_start - 1 + dd gdt_start CODE_SEG equ gdt_code - gdt_start DATA_SEG equ gdt_data - gdt_start -CODE_SEG_RING3 equ gdt_code_ring3 - gdt_start ; 24 -DATA_SEG_RING3 equ gdt_data_ring3 - gdt_start ; 32 +CODE_SEG_RING3 equ gdt_code_ring3 - gdt_start +DATA_SEG_RING3 equ gdt_data_ring3 - gdt_start +TSS_SEG equ gdt_tss - gdt_start