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
|
#include <stdint.h>
#include "kernel/kernel.h"
#include "kernel/mem.h"
#include "kernel/vmem.h"
#include "kernel/gdt.h"
#include "kernel/scheduler.h"
#include "kernel/multiboot.h"
#include "driver/serial.h"
#include "driver/timer.h"
#include "driver/keyboard.h"
#include "driver/mouse.h"
#include "syscalls.h"
#include "types.h"
#include "fifo.h"
#include "mp.h"
#include "interrupts.h"
#include "ringbuffer.h"
#include "terminal/terminal.h"
#include "driver/screen.h"
/* F00L 0S Entry point (called directly from asm/multiboot.asm */
void kernel_main(uint32_t eax,uint32_t ebx)
{
serial_init();
klog("FOOL-OS ver-%s (%s)",GIT_REVISION,__DATE__);
klog("Programmable Interval Timer (PIT) init ...");
uint64_t unixtime=timer_init();
klog("Unix Time = %u seconds)",unixtime);
klog("Keyboard init ...");
keyboard_init(0);
klog("Mouse init ...");
mouse_init();
klog("Global Descriptor Table (GDT) init ...");
gdt_init();
klog("Multiboot Structures init ... ");
multiboot_information *info;
info=get_multiboot(eax, ebx);
klog("Symmetrical Multi Processing (SMP) init ... ");
smp_processors procdata;
if(!acpi_find(&procdata)&&!mp_find(&procdata))kpanic("No ACPI or MP found!");
klog("Memory init ... ");
uint32_t kernel_blocks=mem_init(info);
klog("Ram Filesystem init ... "); // required by mp.bin ????
fs_mount(info);
// Start the other Processors (before paging because apic addr etc..?)
//TODO: !!! Check commented out sleep ()!!!
// https://wiki.osdev.org/Symmetric_Multiprocessing
klog("Symmetric Multi Processing (SMP) start ... ");
smp_log_procdata(&procdata);
//smp_start_aps(&procdata,"/boot/mp.bin"); //will be copied over mbr
klog("Vritual Memory / Paging init ... ");
pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)info->framebuffer_addr);
klog("Peripheral Component Interconnet (PCI) init ... ");
pci_init();
klog("Video Electronics Standards Association (VESA) init ... "); // TODO check if text or fb?
uint32_t addr=kballoc(1);
fs_content("/binfont.bin",addr,0x100); // copy 0x100 bytes to 0x7000
vesa_init(info->vbe_control_info,info->vbe_mode_info,addr);
klog("stdin/stdout init ...");
uint32_t sstdin = syscall_open("stdin",0,0); // stdin 0
uint32_t sstdout = syscall_open("term",0,0); // stdout 1
uint32_t sstderr = syscall_open("stderr",0,0); // stderr 2
klog("Interrupt Vector Table (IVT) init ...");
interrupts_init(0x08);
klog("Enable Interrupts & Start Scheduling ...");
scheduler_init(dir);
}
|