gdt: setup TSS

This commit is contained in:
2025-04-06 20:07:24 +03:00
parent 86cb117509
commit c92839c7f6
2 changed files with 85 additions and 34 deletions
+58 -20
View File
@@ -6,16 +6,49 @@ section .multiboot
dd 0x00 dd 0x00
dd - (0x1BADB002+0x00) dd - (0x1BADB002+0x00)
section.data section .data
align 4 align 4
multiboot_info: multiboot_info:
dd 0 ; flags dd 0
dd 0 ; mem_lower dd 0
dd 0 ; mem_upper dd 0
dd 0 ; boot_device dd 0
dd 0 ; cmdline dd 0
dd 0 ; mods_count dd 0
dd 0 ; mods_addr 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 section .bss
stack_bottom: stack_bottom:
@@ -27,15 +60,24 @@ section .gdt
%include "src/gdt.asm" %include "src/gdt.asm"
section .text section .text
;global start
global start:function (start.end - start) global start:function (start.end - start)
extern kmain ; this function is gonna be located in our c code(kernel.c) extern kmain ; this function is gonna be located in our c code(kernel.c)
start: start:
mov esp, stack_top mov esp, stack_top
cli ;clears the interrupts cli
push ebx ; Сохраняем оригинальный ebx (указатель Multiboot)
lgdt [gdt] 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 ax, DATA_SEG
mov ds, ax mov ds, ax
mov es, ax mov es, ax
@@ -45,14 +87,10 @@ start:
jmp CODE_SEG:.huita jmp CODE_SEG:.huita
.huita: .huita:
push ebx mov ax, TSS_SEG
call kmain ;send processor to continue execution from the kamin funtion in c code ltr ax
pop ebx ; Восстанавливаем оригинальный ebx
;;;;;;;;;;;DIVISION BY ZERO TEST push ebx ; Передаем его в kmain
; mov ax, 10 call kmain
; mov bx, 0 hlt
; div bx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
hlt ; halt the cpu(pause it from executing from this address
.end: .end:
+18 -5
View File
@@ -1,3 +1,8 @@
section .gdt
extern tss ; Объявляем tss как внешний символ из .data
extern tss_end
gdt_start: gdt_start:
; null entry ; null entry
dd 0 dd 0
@@ -35,14 +40,22 @@ gdt_data_ring3:
db 11001111b db 11001111b
db 0 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_end:
gdt: gdt:
dw gdt_end - gdt_start - 1 ; length dw gdt_end - gdt_start - 1
dd gdt_start ; address dd gdt_start
CODE_SEG equ gdt_code - gdt_start CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start DATA_SEG equ gdt_data - gdt_start
CODE_SEG_RING3 equ gdt_code_ring3 - gdt_start ; 24 CODE_SEG_RING3 equ gdt_code_ring3 - gdt_start
DATA_SEG_RING3 equ gdt_data_ring3 - gdt_start ; 32 DATA_SEG_RING3 equ gdt_data_ring3 - gdt_start
TSS_SEG equ gdt_tss - gdt_start