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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
global start
extern kernel_boot
extern kernel_main
extern kernel_start
extern kernel_end
bits 32
; base, limit, access, flags
%macro gdt_entry 4
db %2 & 0xff
db (%2 >> 8) & 0xff
db %1 & 0xff
db (%1 >> 8) & 0xff
db (%1 >> 16) & 0xff
db %3
db ((%2 >> 16) & 0x0f) | (%4 << 4)
db (%1 >> 24) & 0xff
%endmacro
MAGIC equ 0xe85250d6
FLAGS equ 0
LENGTH equ mb_end - mb_start
CHECKSUM equ -(MAGIC + LENGTH)
VGABUF equ 0x000B8000
KRNMAP equ 0xC0000000
section .multiboot.data
align 8
mb_start:
dd MAGIC
dd FLAGS
dd LENGTH
dd CHECKSUM
dw 0
dw 0
dd 8
mb_end:
section .rodata
align 16
gdt_start:
gdt_entry 0, 0, 0, 0
gdt_entry 0, 0xFFFFF, 0x9A, 0xC
gdt_entry 0, 0xFFFFF, 0x92, 0xC
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start
section .bootstrap_stack
align 16
stack_start:
resb 16384 ; 16 KiB
stack_end:
section .bss
align 4096
page_directory:
resb 4096
page_table1:
resb 4096
section .multiboot.text
align 8
start:
; push ebx
; call kernel_boot
; pop eax
mov edi, page_table1 - KRNMAP
mov esi, 0
mov ecx, 1023
paging_cmp:
cmp esi, kernel_start
jl paging_add
cmp esi, kernel_end - KRNMAP
jge paging_map
mov edx, esi
or edx, 0x003
mov [edi], edx
paging_add:
add esi, 4096
add edi, 4
loop paging_cmp
paging_map:
mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003
mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003
mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003
mov ecx, page_directory - KRNMAP
mov cr3, ecx
mov ecx, cr0
or ecx, 0x80010000
mov cr0, ecx
lea ecx, load_gdt
jmp near ecx
section .text
align 8
load_gdt:
cli
lgdt [gdt_descriptor]
mov eax, cr0
or al, 1
mov cr0, eax
jmp 0x08:load_kernel
load_kernel:
mov dword [page_directory], 0
mov ecx, cr3
mov cr3, ecx
mov ax, 0x10
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
mov esp, stack_end
mov ebp, stack_end
sti
call kernel_main
cli
halt:
hlt
jmp halt
|