gdt: setup TSS
This commit is contained in:
+67
-29
@@ -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,32 +60,37 @@ 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]
|
||||||
mov ax, DATA_SEG
|
|
||||||
mov ds, ax
|
; Заполняем адрес TSS в дескрипторе GDT
|
||||||
mov es, ax
|
mov eax, tss ; Получаем 32-битный адрес tss
|
||||||
mov fs, ax
|
mov ebx, gdt_tss ; Адрес дескриптора TSS в GDT
|
||||||
mov gs, ax
|
mov [ebx + 2], ax ; Нижние 16 бит адреса TSS
|
||||||
mov ss, ax
|
shr eax, 16 ; Сдвигаем для доступа к старшим битам
|
||||||
jmp CODE_SEG:.huita
|
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:
|
.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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user