-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathmain.c
More file actions
107 lines (97 loc) · 2.85 KB
/
Copy pathmain.c
File metadata and controls
107 lines (97 loc) · 2.85 KB
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
/*
* kernel.c
*
* Created on: 27.06.2012
* Author: pascal
*/
#include "config.h"
#include "multiboot.h"
#include "mm.h"
#include "gdt.h"
#include "idt.h"
#include "display.h"
#include "cpu.h"
#include "pic.h"
#include "keyboard.h"
#include "pm.h"
#include "debug.h"
#include "cmos.h"
#include "cdi.h"
#include "vfs.h"
#include "pit.h"
#include "sound.h"
#include "version.h"
#include "loader.h"
#include "stdio.h"
#include "scheduler.h"
#include "apic.h"
#include "tss.h"
#include "pci.h"
#include "drivermanager.h"
#include "devicemng.h"
#include "console.h"
#include "syscalls.h"
#include <dispatcher.h>
static multiboot_structure static_MBS;
multiboot_structure *Init(multiboot_structure *MBS);
void __attribute__((noreturn)) main(multiboot_structure *MBS)
{
MBS = Init(MBS); //Initialisiere System
if(MBS->mbs_flags & 0x1)
printf("Bootdevice: %X\n", MBS->mbs_bootdevice);
printf("Kernel version : %u.%u.%u\n", version_major, version_minor, version_bugfix);
printf("Kernel commit : %s %s\n", version_branch, version_commitId);
printf("Kernel build date: %s %s\n", version_buildDate, version_buildTime);
printf("Kernel compiler : %s\n", version_compiler);
if(vfs_MountRoot() || vfs_Mount("/dev", NULL, "devfs"))
SysLogError("KERNEL", "Could not find root directory\n");
else
{
const char **env = {NULL};
loader_load("/bin", "init", env, "/dev/tty01", "/dev/tty01", "/dev/tty01");
scheduler_activate();
}
//Der Kernel wird durch ein Interrupt aufgeweckt
while(1) CPU_HALT(); //Wir wollen diese Funktion nicht verlassen
}
multiboot_structure *Init(multiboot_structure *MBS)
{
Display_Init(); //Anzeige Intialisieren
cpu_init(true); //CPU Initialisieren
GDT_Init(); //GDT initialisieren
IDT_Init(); //IDT initialisieren
TSS_Init(); //TSS initialisieren
//MBS zwischenspeichern, bis Speicherverwaltung initialisiert ist, wenn nötig noch andere Strukturen sichern
static_MBS = *MBS;
MBS = &static_MBS;
pit_Init(1000); //PIT initialisieren mit 1kHz
pic_Init(); //PIC initialisieren
cmos_Init(); //CMOS initialisieren
syscall_Init(); //Syscall initialisieren
#ifdef DEBUGMODE
Debug_Init();
#endif
if(!mm_Init((mmap*)(uintptr_t)MBS->mbs_mmap_addr, MBS->mbs_mmap_length)) //Speicherverwaltung initialisieren
SysLogError("MM", "Fehler beim Initialisieren der Speicherverwaltung");
#ifdef DEBUGMODE
asm volatile("int $0x1");
#endif
//isr_Init();
keyboard_Init(); //Tastatur(treiber) initialisieren
apic_Init();
vfs_Init(); //VFS initialisieren
pci_Init(); //PCI-Treiber initialisieren
drivermanager_init();
dmng_Init();
pm_Init(); //Tasks initialisieren
console_Init();
dispatcher_init(100);
SysLog("SYSTEM", "Initialisierung abgeschlossen");
setColor(BG_BLACK | CL_WHITE);
#ifdef DEBUGMODE
printf("Aktiviere Interrupts\n\r");
#endif
CPU_ENABLE_INTERRUPTS();
cdi_init(); //CDI und -Treiber initialisieren
return MBS;
}