-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgdt.c
76 lines (64 loc) · 2.34 KB
/
gdt.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stddef.h>
#include <stdint.h>
#include "gdt.h"
#include "kernel.h"
#include "clib/stdio.h"
void GDT_initialize(void)
{
// Inicjuje struktury reprezentujące segmenty
printf("Creating GDT Table\n");
// Segment niewykorzystywany
segments[0] = (struct segment_t)
{
.base = 0, .limit = 0,
.access = 0,
.flags = FLAGS_32BIT_MODE
};
// Segment kodu
segments[1] = (struct segment_t)
{ .base = 0,
.limit = 0xFFFFFFFF,
.access = ACCESS_PRESENT | ACCESS_RING0 | ACCESS_CD_SEGMENT | ACCESS_EXECUTABLE | ACCESS_READ_WRITE,
.flags = FLAGS_32BIT_MODE | FLAGS_4KB_GRANULARITY
};
// Segment danych
segments[2] = (struct segment_t)
{
.base = 0,
.limit = 0xFFFFFFFF,
.access = ACCESS_PRESENT | ACCESS_RING0 | ACCESS_CD_SEGMENT | ACCESS_EXECUTABLE | ACCESS_READ_WRITE,
.flags = FLAGS_32BIT_MODE | FLAGS_4KB_GRANULARITY
};
// TSS w przyszłości
segments[3] = (struct segment_t)
{
.base = 0,
.limit = 0,
.access = 0,
.flags = FLAGS_32BIT_MODE
};
// Tworzy Globalną tablice deskryptorów w oparciu o segmenty
for(int i=0; i<GDT_SIZE; i++)
encode_GDT_entry(GDT+i, segments+i);
// Ładuje selektory do rejestrów segmentowych
printf("Loading Selectors into Segment Registers\n");
reload_segments();
// Ładuje tablice deskryptorów do rejestru GDR
printf("Setting GDTR Register\n");
set_GDT((uint32_t)GDT, sizeof(GDT)-1);
}
//Zamienia strukture segmentu na wpis w tablicy GDT
void encode_GDT_entry(struct gdt_entry_t *target, struct segment_t *source)
{
// Ustawienie flag
target->flags = source->flags;
//Zakodowanie limitu sektora
target->limit_low = source->limit & 0x0000FFFF;
target->limit_high = (source->limit & 0x000F0000) >> 16;
//Zakodowanie offsetu sektora
target->base_low = source->base & 0x0000FFFF;
target->base_middle = (source->base & 0x00FF0000) >> 16;
target->base_high = (source->base & 0xFF000000) >> 24;
//Zakodowanie praw dostępu sektora
target->access = source->access;
}