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
|
bits 16
org 0x7c3e
kernel_sectors equ 64
kernel_segment equ 0x3000
support_flags equ 0x4000
pci_hw_char equ 0x4001
pci_ver equ 0x4002
last_pci_bus equ 0x4004
pci_support equ 0x80
pae_support equ 0x40
in al, 0x92
or al, 0x02
out 0x92, al
xor ax, ax
mov ss, ax
mov sp, 0x7ffc
mov ah, 0x01
mov ch, 0x3f
int 0x10
mov ax, kernel_segment
mov es, ax
mov ax, 0x0200 + kernel_sectors
xor bx, bx
mov cx, 0x0002
xor dh, dh
int 0x13
mov ax, 0xb101
int 0x1a
cmp edx, 0x20494350
jne no_pci
test ah, ah
jnz no_pci
mov byte [support_flags], pci_support
mov byte [pci_hw_char], al
mov word [pci_ver], bx
mov byte [last_pci_bus], cl
no_pci:
mov eax, 1
cpuid
test dl, 0x40
jz no_pae
or byte [support_flags], pae_support
no_pae:
mov ax, 0x1000
mov es, ax
xor di, di
mov edx, 0x534d4150
xor ebx, ebx
mmap_loop:
mov eax, 0xe820
mov ecx, 24
int 0x15
jc mmap_end
add di, 24
test ebx, ebx
jnz mmap_loop
mmap_end:
mov word [0x4006], di
cli
lgdt [gdt]
mov eax, cr0
or al, 0x01
mov cr0, eax
jmp 0x10:pmode
bits 32
pmode:
mov ax, 0x18
mov ds, ax
mov ss, ax
mov esp, 0x00040000
xor ebp, ebp
call kernel_segment * 16
halt:
hlt
jmp halt
times $$ + 510 - 0x3e - $ - (gdt.e - gdt) db 0
gdt:
dw .e - .t
dd .t
.t:
dq 0x0000_0000_0000_0000;0x00: null
dq 0x0040_8900_4f98_0068;0x08: tss, 0x4f98
dq 0x00cf_9a00_0000_ffff;0x10: kernel code
dq 0x00cf_9200_0000_ffff;0x18: kernel data
dq 0x00cf_fa00_0000_ffff;0x20: user code
dq 0x00cf_f200_0000_ffff;0x28: user data
.e:
dw 0xaa55
|