mirror of
https://github.com/originalmk/mkos32.git
synced 2025-01-18 16:29:19 +00:00
Manual setting of kernel code and data segments (GDT)
This commit is contained in:
parent
8ea82bf3a7
commit
60b847b3fd
37
boot.s
37
boot.s
@ -35,9 +35,11 @@ stack_bottom:
|
|||||||
stack_top:
|
stack_top:
|
||||||
|
|
||||||
.section .data
|
.section .data
|
||||||
/* 23, bo będą 3 deskryptory po 8 bajtów, a przekazujemy wielkość - 1*/
|
/* 31, bo będą 4 deskryptory po 8 bajtów, a przekazujemy wielkość - 1*/
|
||||||
|
// TODO
|
||||||
gdtr: .word 23
|
gdtr: .word 23
|
||||||
.long 0
|
/* Na 4 MiB daję bazę dla GDT, czyli tam gdzie zaczynają się dane kernela */
|
||||||
|
gdtb: .long 0x400000
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Oznaczenie startu, tu zaczyna się kod kernela!
|
Oznaczenie startu, tu zaczyna się kod kernela!
|
||||||
@ -51,16 +53,39 @@ _start:
|
|||||||
* EDIT: Ustawia, ale pod własne potrzeby, więc i tak trzeba zmienić
|
* EDIT: Ustawia, ale pod własne potrzeby, więc i tak trzeba zmienić
|
||||||
* Ustawię zatem najprostszy model segmentacji */
|
* Ustawię zatem najprostszy model segmentacji */
|
||||||
|
|
||||||
// 1. Pusty (null) deskryptor
|
// Domyślne ustawienia z GRUB-a są takie, że pomijają segmentację!
|
||||||
mov $0, %eax
|
// Dodam w ramach segmentu danych kernela, czyli u mnie 4-8 MiB
|
||||||
movq $0, (%eax)
|
|
||||||
// 2. Deskryptor kodu jądra
|
|
||||||
|
|
||||||
|
mov gdtb, %eax
|
||||||
|
// 1. Pusty (null) deskryptor
|
||||||
|
movl $0, (%eax)
|
||||||
|
movl $0, 4(%eax)
|
||||||
|
// 2. Deskryptor kodu jądra
|
||||||
|
movl $0x000003FF, 8(%eax)
|
||||||
|
movl $0x00c09800, 12(%eax)
|
||||||
|
// 3. Deskryptor danych jądra
|
||||||
|
movl $0x000003FF, 16(%eax)
|
||||||
|
movl $0x00C09240, 20(%eax)
|
||||||
|
// 4. Deskryptor kodu użytkownika
|
||||||
|
// 6. Load GDT
|
||||||
|
lgdt (gdtr)
|
||||||
|
// 7. Refresh registers
|
||||||
|
mov %cs, 8(%eax)
|
||||||
|
mov %ds, 16(%eax)
|
||||||
|
mov %es, 16(%eax)
|
||||||
|
mov %fs, 16(%eax)
|
||||||
|
mov %gs, 16(%eax)
|
||||||
|
mov %ss, 16(%eax)
|
||||||
|
|
||||||
|
// Wpisywane jest i tak pod %ds:64
|
||||||
|
movb $69, (64)
|
||||||
|
|
||||||
/* Ustawienie ESP na wierzchołek stosu */
|
/* Ustawienie ESP na wierzchołek stosu */
|
||||||
mov $stack_top, %esp
|
mov $stack_top, %esp
|
||||||
|
|
||||||
/* Tutaj jakieś ustawienia inicjalizacyjne trzeba zrobić normalnie */
|
/* Tutaj jakieś ustawienia inicjalizacyjne trzeba zrobić normalnie */
|
||||||
|
//mov $69, %esi
|
||||||
|
//mov $_start, %edi
|
||||||
|
|
||||||
/* Wywołanie kernela */
|
/* Wywołanie kernela */
|
||||||
call kernel_main
|
call kernel_main
|
||||||
|
Loading…
x
Reference in New Issue
Block a user