-
Notifications
You must be signed in to change notification settings - Fork 3
/
kernel.asm
191 lines (150 loc) · 5.61 KB
/
kernel.asm
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
; Copyright (C) 2013-2016 Wataha.net
; All Rights Reserved
;
; LICENSE Creative Commons BY-NC-ND 4.0
; See LICENSE.TXT
;
; Main developer:
; Andrzej (akasei) Adamczyk [e-mail: akasei from wataha.net]
;-------------------------------------------------------------------------------
; Use:
; nasm - http://www.nasm.us/
; zestaw imiennych wartości stałych
%include "config.asm"
; 64 bitowy kod
[BITS 64]
; położenie kodu jądra systemu w pamięci logicznej/fizycznej
[ORG VARIABLE_KERNEL_PHYSICAL_ADDRESS]
struc HEADER
.cpu resb 1
.video resb 1
endstruc
header:
; NAGŁÓWEK =============================================================
db 0x40 ; 64 bitowy kod jądra systemu
db VARIABLE_FALSE ; true - tryb graficzny
; NAGŁÓWEK KONIEC ======================================================
start:
; przygotuj podstawowe dane, niezbędne do wyświetlania informacji
call screen_initialization
; przygotuj binarną mapę pamięci dla jądra systemu
call binary_memory_map
; utwórz własną tablicę GDT
call global_descriptor_table
; przygotuj nowe stronicowanie dla przestrzeni jądra systemu
call recreate_paging
; mapuj przestrzeń pamięci ekranu pod nowe stronicowanie
call screen_initialization_reload
; inicjalizacja pełnego środowiska jądra systemu gotowa
; przemapuj numery przerwań sprzętowych pod 0x20..0x2F
call programmable_interrupt_controller
; ustaw częstotliwość wywołań przerwania sprzętowego IRQ0
call programmable_interval_timer
; dodaj jądro systemu do kolejki procesów
call multitasking
; konfiguruj klawiature
call keyboard
; skonfiguruj myszke PS2
call mouse
; przygotuj obsługę wyjątków i przerwań procesora, przerwań użyktownika
call interrupt_descriptor_table
; włączamy przerwania i wyjątki procesora
sti ; tchnij życie
; włącz przerwania sprzętowe IRQ0 (planista), IRQ1 (klawiatura)
mov al, 11101111b ; irq15, irq14, irq13, mouse, irq11, irq10, irq9, irq8
out 0xA1, al
mov al, 11011100b ; irq7, irq6, sound, irq4, irq3, irq2, keyboard, sheduler/clock
out 0x21, al
; resetuj karte dźwiękową SB16
call sound
; szukaj karty sieciowej
call cyjon_network_i8254x_find_card
; szukaj dysków sata
call cyjon_ahci_initialize
; Qemu wykrzacza się na sterowniku IDE/ATA PIO, nie mam debugera - nie sprawdzę dlaczego
; zatem wirtualny dysk będę podłączał pod AHCI/SATA, Bochs będzie obdługiwał IDE/ATA PIO
; sprawdź czy znaleziono dysk pod kontrolerem AHCI/SATA
cmp byte [variable_ahci_semaphore], VARIABLE_EMPTY
ja .ahci_found
; zainicjalizuj dostęp do nośnika IDE0 Master
call ide_initialize
.ahci_found:
; przygotuj wirtualne systemy plików (płaski system plików)
; wirtualny system plików zostanie przygotowany na nowo (wzorem z ext2), aby mieć obsługe katalogów
call virtual_file_systems
; uruchom niezbędne demony
call daemon_init_disk_io
call daemon_init_garbage_collector
call daemon_init_dma
; inizjalizuj system plików
mov rax, 2048
mov rcx, 1 ; rozmiar superbloku, 1 blok
mov r8, variable_partition_specification_home
call cyjon_filesystem_kfs_initialization
; utwórz plik readme.txt w głównym systemie plików /
;call create_readme
; utwórz plik hostname
;call create_hostname
; załaduj do wirtualnego systemu plików, dołączone oprogramowanie
call move_included_files_to_virtual_filesystem
; oblicz rozmiar przestrzeni do zwolnienia w Bajtach
mov rcx, end
sub rcx, release_memory
; zamień na ilość stron zajętych
shr rcx, 12 ; /4096
; rozpocznij zwalnianie przestrzeni od adresu
mov rdi, release_memory
.loop:
; zwolnij zajętą przestrzeń
call cyjon_page_release
add rdi, VARIABLE_MEMORY_PAGE_SIZE
sub rcx, VARIABLE_DECREMENT
jnz .loop
; uruchom proces główny INIT
mov rcx, qword [file_load_init] ; ilość znaków nazwie pliku
mov rsi, file_load_init_pointer ; wskaźnik do ciągu znaków reprezentujący nazwe pliku
mov r8, variable_partition_specification_system ; z partycji systemowej
call cyjon_process_init ; wykonaj
; nie potrzebujemy pamiętać numeru PID procesu init
mov qword [variable_process_pid], VARIABLE_EMPTY
%include "engine/alive.asm"
%include "engine/init/binary_memory_map.asm"
%include "engine/init/global_descriptor_table.asm"
%include "engine/init/paging.asm"
%include "engine/database.asm"
%include "engine/screen.asm"
%include "engine/paging.asm"
%include "engine/programmable_interrupt_controller.asm"
%include "engine/programmable_interval_timer.asm"
%include "engine/multitasking.asm"
%include "engine/keyboard.asm"
%include "engine/mouse.asm"
%include "engine/sound.asm"
%include "engine/interrupt_descriptor_table.asm"
%include "engine/virtual_file_system.asm"
%include "engine/process.asm"
%include "engine/services.asm"
%include "engine/daemon/garbage_collector.asm"
%include "engine/daemon/disk_io.asm"
%include "engine/daemon/dma.asm"
%include "engine/drivers/pci.asm"
%include "engine/drivers/ide.asm"
%include "engine/drivers/ahci.asm"
%include "engine/drivers/network/i8254x.asm"
%include "engine/drivers/filesystem/kfs.asm"
%include "library/align_address_up_to_page.asm"
%include "library/find_free_bit.asm"
%include "library/compare_string.asm"
%include "library/find_first_word.asm"
%include VARIABLE_FONT_MATRIX_DEFAULT
file_load_init dq 4
file_load_init_pointer db "init"
; dołączone oprogramowanie wyrównaj do pełnego adresu strony, będzie można zwolnić na końcu inicjalizacji dodatkową przestrzeń dla
align 0x1000
; poniższe strony pamięci zostaną zwolnione po przetworzeniu
release_memory:
%include "software/internal.asm"
; wskaźnik końca kodu jądra wyrównaj do pełnego adresu strony
align 0x1000
; koniec kodu jądra systemu + oprogramowania
end: