public static void Setup() { Screen.Clear(); Screen.Color = 0x0E; Screen.SetCursor(24, 0); Screen.Write('1'); Multiboot.Setup(); Screen.SetCursor(24, 1); Screen.Write('2'); PIC.Setup(); Screen.SetCursor(24, 2); Screen.Write('3'); GDT.Setup(); Screen.SetCursor(24, 3); Screen.Write('4'); IDT.Setup(); Screen.SetCursor(24, 4); Screen.Write('5'); PageFrameAllocator.Setup(); Screen.SetCursor(24, 5); Screen.Write('6'); PageTable.Setup(); Screen.SetCursor(24, 6); Screen.Write('7'); VirtualPageAllocator.Setup(); Screen.SetCursor(24, 7); Screen.Write('8'); Screen.SetCursor(24, 8); ProcessManager.Setup(); Screen.Write('9'); Screen.SetCursor(24, 9); TaskManager.Setup(); Screen.Write('A'); Screen.SetCursor(24, 10); }
public override void MainMethod() { Ensure.Init(); CPU.DisableInts(); GDT.Init(); IDT.Init(); ISR.Init(); Console.Clear(); ACPI.Init(); ACPI.Enable(); PageManager.Init(); Heap.Init(); GC.Init(); Paging.Init(); PIT.Init(); RTC.Init(); Scheduler.Init(); CPU.EnableInts(); DiskDrive.Init(); //FatFileSystem.Init(); PCI.Init(); Driver.Init(); AudioMixer.Init(); new Thread(Event.Init, "Events").Start(); new Thread(new SCI().Main, "Shell").Start(); Scheduler.Idle(); }
public static void KernelMain(IntPtr modulesSeg, FrameBuffer fb, MemoryMap mmap) { Debug.Initialise(); for (int i = 0; i < mmap.Length; i++) { if (mmap[i].IsUsable) { Allocator.AddFreePages((IntPtr)mmap[i].PhysicalStart, (uint)mmap[i].NumberOfPages); } } Internal.Runtime.CompilerHelpers.StartupCodeHelpers.InitialiseRuntime(modulesSeg); FrameBuffer._instance = fb; Font.Initialise(); IDT.Disable(); GDT.Initialise(); IDT.Initialise(); IDT.Enable(); Console.Clear(); Console.WriteLine("Hello from the kernel!\nThis is a line feed without carriage return,\r\nand this is with."); Console.WriteLine("Let's test some ANSI escape sequences :)"); Console.WriteLine("\x1b[30;107m *** \x1b[31;49m *** \x1b[32m *** \x1b[33m *** \x1b[34m *** \x1b[35m *** \x1b[36m *** \x1b[37m *** "); Console.WriteLine("\x1b[90m *** \x1b[91m *** \x1b[92m *** \x1b[93m *** \x1b[94m *** \x1b[95m *** \x1b[96m *** \x1b[97m *** "); Console.WriteLine("\x1b[39;40m *** \x1b[30;41m *** \x1b[42m *** \x1b[43m *** \x1b[44m *** \x1b[45m *** \x1b[46m *** \x1b[47m *** "); Console.WriteLine("\x1b[100m *** \x1b[101m *** \x1b[102m *** \x1b[103m *** \x1b[104m *** \x1b[105m *** \x1b[106m *** \x1b[107m *** \x1b[0m"); Console.WriteLine(); for (; ;) { Console.Write("> "); var cmd = Console.ReadLine(); switch (cmd) { case "mem": Console.Write("Allocations: "); Console.Write(Allocator.Allocations); Console.WriteLine(); Console.Write("Total Memory: "); Console.Write(Allocator.TotalMemory); Console.WriteLine(" bytes"); Console.Write("Free Memory: "); Console.Write(Allocator.FreeMemory); Console.WriteLine(" bytes"); Console.Write("Used Memory: "); Console.Write(Allocator.UsedMemory); Console.Write(" bytes ("); Console.Write(Allocator.UsedMemory / 4096); Console.WriteLine(" pages)"); break; } cmd.Dispose(); } }
internal static uint SetThreadStorageSegmentBase(ref SysCallContext context, ref SystemMessage args) { var addr = args.Arg1; Scheduler.GetCurrentThread().ThreadLocalStorageBaseAddr = addr; GDT.SetThreadStorageSegmentBase(addr); return(0); }
/// <summary> /// Switch to a specific thread. /// This method will not return! /// </summary> public static unsafe void SwitchToThread(int threadID) { var thread = Threads[threadID]; var proc = thread.Process; if (KConfig.Log.TaskSwitch) { KernelMessage.WriteLine("Switching to Thread {0}. StackState: {1:X8}", threadID, (uint)thread.StackState); } //Assert.True(thread != null, "invalid thread id"); thread.Ticks++; SetThreadID(threadID); PIC.SendEndOfInterrupt((int)KnownInterrupt.ClockTimer); thread.Status = ThreadStatus.Running; if (thread.StackState == null) { DumpStats(); KernelMessage.WriteLine("threadID: {0}", threadID); Debug.Break(); } thread.StackState->Stack.EFLAGS |= X86_EFlags.InterruptEnableFlag; if (proc.PageTable != PageTable.KernelTable) { Debug.Nop(); } uint pageDirAddr = proc.PageTable.GetPageTablePhysAddr(); //KernelMessage.WriteLine("PageDirAddr: {0:X8}", pageDirAddr); uint stackStateAddr = (uint)thread.StackState; uint dataSelector = thread.DataSelector; if (!thread.User) { thread.StackState = null; // just to be sure } GDT.Tss->ESP0 = thread.KernelStackBottom; if (thread.Debug) { Native.Nop(); } GDT.SetThreadStorageSegmentBase(thread.ThreadLocalStorageBaseAddr); InterruptReturn(stackStateAddr, pageDirAddr, dataSelector, KnownSegments.UserThreadStorage); }
public static unsafe void Start(uint magic, uint address) { /* Setup Multiboot */ Multiboot.Setup(magic, address); /* Placement Address */ Heap.PlacementAddress = Native.EndOfKernel(); /* Clear Interrupts */ Native.ClearInterrupt(); /* Setup PIC */ PIC.Setup(); /* Setup GDT & Enter into protected mode */ GDT.Setup(); /* Setup IDT */ IDT.Setup(); /* Enable Interrupts */ Native.SetInterrupt(); /* Setup Paging */ Paging.Setup(Multiboot.RAM); /* Setup Multitasking */ Multitasking.CreateTask(0, true); //This is System Update thread Multitasking.Init(); //Start Multitasking /* Call our kernel instance now */ try { Caller.Start(); while (true) { Caller.Update(); } } catch (Exception e) { //Kernel PANIC !! Console.WriteLine(e.Message); } while (true) //Set CPU in Infinite loop DON'T REMOVE THIS ELSE I'll KILL YOU (^ . ^) { Native.ClearInterrupt(); Native.Halt(); } ; }
private static void Setup() { IDT.SetInterruptHandler(null); Panic.Setup(); Debugger.Setup(Serial.COM1); // Initialize interrupts PIC.Setup(); IDT.Setup(); GDT.Setup(); //Runtime.Internal.Setup(); }
public static unsafe void Start() { SetThreadID(0); Enabled = true; KernelMessage.WriteLine("Enable Scheduler"); IDTManager.SetPrivilegeLevel((uint)KnownInterrupt.TerminateCurrentThread, 0x03); GDT.Tss->ESP0 = Threads[0].KernelStackBottom; GDT.LoadTaskRegister(); TriggerScheduler(); // Normally, you should never get here Panic.Error("Main-Thread still alive"); }
private static void Setup() { Logger.Log("Initialize Kernel"); IDT.SetInterruptHandler(null); Panic.Setup(); Debugger.Setup(Serial.COM2); // Initialize interrupts PIC.Setup(); IDT.Setup(); GDT.Setup(); Logger.Log("Kernel initialized"); }
/// <summary> /// Main /// </summary> public static void Main() { IDT.SetInterruptHandler(null); Panic.Setup(); Debugger.Setup(Serial.COM1); // Initialize interrupts PIC.Setup(); IDT.Setup(); GDT.Setup(); Runtime.Internal.Setup(); IDT.SetInterruptHandler(ProcessInterrupt); EnterTestReadyLoop(); }
// static void ApplyAddresses() // { // GDT.KernelSetup(GetAddrOfMapType(BootInfoMemoryType.GDT)); // PageTable.KernelSetup( // GetAddrOfMapType(BootInfoMemoryType.PageDirectory), // GetAddrOfMapType(BootInfoMemoryType.PageTable)); // } // static Addr GetAddrOfMapType(BootInfoMemoryType type) // { // var mapLen = Header->MemoryMapLength; // //KernelMessage.WriteLine("Maps: {0}", mapLen); // for (uint i = 0; i < mapLen; i++) // { // if (Header->MemoryMapArray[i].Type == type) // return Header->MemoryMapArray[i].Start; // } // return Addr.Zero; // } private static void ApplyAddresses() { GDT.KernelSetup(GetMap(BootInfoMemoryType.GDT)->Start); PageTable.ConfigureType(Header->PageTableType); PageTable.KernelTable.KernelSetup(GetMap(BootInfoMemoryType.PageTable)->Start); }
public static void Start() { Screen.Color = 0x0; Screen.Clear(); Screen.GotoTop(); Screen.Color = 0x0E; Screen.Write('M'); Screen.Write('O'); Screen.Write('S'); Screen.Write('A'); Screen.Write(' '); Screen.Write('O'); Screen.Write('S'); Screen.Write("!"); Screen.Write(" "); DebugClient.Setup(Serial.COM1); Screen.Write('0'); IDT.SetInterruptHandler(null); Screen.Write('1'); Multiboot.Setup(); Screen.Write('2'); PIC.Setup(); Screen.Write('3'); GDT.Setup(); Screen.Write('4'); IDT.Setup(); Screen.Write('5'); PageFrameAllocator.Setup(); Screen.Write('6'); PageTable.Setup(); Screen.Write('7'); VirtualPageAllocator.Setup(); Screen.Write('8'); ProcessManager.Setup(); Screen.Write('9'); GC.Setup(); Screen.Write('0'); //Runtime.Setup(); Screen.Write('A'); TaskManager.Setup(); Screen.Write('B'); IDT.SetInterruptHandler(ProcessInterrupt); Screen.Write('C'); ConsoleManager.Setup(); Screen.Write('D'); Console = ConsoleManager.Controller.Boot; Screen.Write('E'); Screen.Write('F'); Console.Color = 0x0E; Console.BackgroundColor = 1; Console.WriteLine(); Console.WriteLine(); Console.Write("!MOSA is alive!"); Console.WriteLine(); KernelTest.RunTests(); Console.WriteLine(); DumpStackTrace(); //System.Threading.SpinLock splk = new System.Threading.SpinLock(); //bool lockTaken = false; //splk.Enter(ref lockTaken); //if (splk.IsHeld) // Console.Write("Entered..."); //lockTaken = false; //splk.Enter(ref lockTaken); //Console.Write("Should have looped!!!"); Console.Goto(22, 0); Process(); }
public static void Main() { Screen.Clear(); Screen.BackgroundColor = ScreenColor.Blue; Screen.Color = ScreenColor.Yellow; Screen.Write('M'); Screen.Write('O'); Screen.Write('S'); Screen.Write('A'); Screen.Write(' '); Screen.Write('O'); Screen.Write('S'); Screen.Write("!"); Screen.Write(" "); Multiboot.Setup(); Screen.Write('0'); GDT.Setup(); Screen.Write('1'); IDT.SetInterruptHandler(null); Screen.Write('2'); Debugger.Setup(Serial.COM1); Screen.Write('3'); PIC.Setup(); Screen.Write('4'); IDT.Setup(); Screen.Write('5'); PageFrameAllocator.Setup(); Screen.Write('6'); PageTable.Setup(); Screen.Write('7'); VirtualPageAllocator.Setup(); Screen.Write('8'); GC.Setup(); Screen.Write('9'); Scheduler.Setup(); Screen.Write('B'); IDT.SetInterruptHandler(ProcessInterrupt); Screen.Write('C'); ConsoleManager.Setup(); Screen.Write('D'); Screen.Write('E'); Screen.WriteLine(); Screen.WriteLine(); KernelTest.RunTests(); StackTrace(); StartThreadTest(); // should never get here Screen.Write("!BAD!"); while (true) { Native.Hlt(); } }
public static void Main() { Screen.Clear(); Screen.BackgroundColor = ScreenColor.Blue; Screen.Color = ScreenColor.Yellow; Screen.Write('M'); Screen.Write('O'); Screen.Write('S'); Screen.Write('A'); Screen.Write(' '); Screen.Write('O'); Screen.Write('S'); Screen.Write("!"); Screen.Write(" "); Multiboot.Setup(); Screen.Write('0'); GDT.Setup(); Screen.Write('1'); IDT.SetInterruptHandler(null); Screen.Write('2'); Debugger.Setup(Serial.COM1); Screen.Write('3'); PIC.Setup(); Screen.Write('4'); IDT.Setup(); Screen.Write('5'); PageFrameAllocator.Setup(); Screen.Write('6'); PageTable.Setup(); Screen.Write('7'); VirtualPageAllocator.Setup(); Screen.Write('8'); GC.Setup(); Screen.Write('9'); Scheduler.Setup(); Screen.Write('B'); IDT.SetInterruptHandler(ProcessInterrupt); Screen.Write('C'); ConsoleManager.Setup(); Screen.Write('D'); Screen.Write('E'); Screen.WriteLine(); Screen.WriteLine(); //Screen.Write("CompilerBugTests: "); //bool value1 = Test1(); //if (value1) // Screen.WriteLine("Ok"); //else // Screen.WriteLine("Failed"); //Screen.Write("FindTypeOfTest: "); //bool value3 = Test3(); //if (value3) // Screen.WriteLine("Ok"); //else // Screen.WriteLine("Failed"); //UnitTest(); KernelTest.RunTests(); StackTrace(); TestHash(); int value2 = CallReturn10(); Screen.Write("Return10 Test: "); if (value2 == 10) { Screen.WriteLine("Ok"); } else { Screen.WriteLine("Failed"); } StartThreadTest(); // should never get here Screen.Write("!BAD!"); while (true) { Native.Hlt(); } }
internal static void Start(uint magic, uint address, uint KernelDirectory, uint InitialHeap) { /* Kernel Logger init */ Debug.Init(); /* Initalize Heap */ Heap.Init(InitialHeap); /* Multiboot Info Parsing */ Multiboot.Setup(magic, address); /* Setup Paging */ Paging.Setup(KernelDirectory); /* Setup GDT */ GDT.Setup(); /* Remap PIC */ PIC.Setup(); /* Setup IDT */ IDT.Setup(); /* Enable Interrupt */ Native.Sti(); /* Setup Scheduler */ Scheduler.Init(KernelDirectory); /* Setup System Timer */ Timer.Setup(); /* Install SHM */ SHM.Install(); /* Initialise VBE 2.0 Driver */ VBE.Init(); /* Initialise Virtual File system */ VirtualFileSystem.Setup(); /* Setup Syscall */ Syscall.Setup(); /* Initialise C library */ Libc.Init(); try { Boot.Init(); } catch (Exception e) { Debug.Write("[@SystemThread] => [EXIT]: %s\n", e.Message); } while (true) { ; } }
public static void Main() { //Screen.BackgroundColor = ScreenColor.Green; //Screen.Color = ScreenColor.Red; //Screen.Clear(); //Screen.Goto(0, 0); //Screen.Write('A'); //Serial.SetupPort(Serial.COM1); //Serial.Write(Serial.COM1, "Hello"); BootMemory.Setup(); // Setup Kernel Log var kmsgHandler = new KernelMessageWriter(); KernelMessage.SetHandler(kmsgHandler); KernelMessage.WriteLine("<LOADER:CONSOLE:BEGIN>"); Assert.Setup(AssertError); PerformanceCounter.Setup(); // Parse Boot Informations Multiboot.Setup(); // Parse Kernel ELF section SetupOriginalKernelElf(); // Print all section of Kernel ELF (for information only) DumpElfInfo(); // Copy Section to a final destination SetupKernelSection(); // Collection informations we need to pass to the kernel BootInfo_.Setup(); // Setup Global Descriptor Table var map = BootMemory.AllocateMemoryMap(0x1000, BootInfoMemoryType.GDT, AddressSpaceKind.Both); BootInfo_.AddMap(map); GDT.Setup(map.Start); // Now we enable Paging. It's important that we do not cause a Page Fault Exception, // Because IDT is not setup yet, that could handle this kind of exception. PageTable.ConfigureType(BootInfo_.BootInfo->PageTableType); map = BootMemory.AllocateMemoryMap(PageTable.KernelTable.InitalMemoryAllocationSize, BootInfoMemoryType.PageTable, AddressSpaceKind.Both); BootInfo_.AddMap(map); PageTable.KernelTable.Setup(map.Start); MapMemory(); PageTable.KernelTable.EnablePaging(); // Because Kernel is compiled in virtual address space, we need to remap the pages MapKernelImage(); // Get Entry Point of Kernel uint kernelEntry = GetKernelStartAddr(); if (kernelEntry == 0) { KernelMessage.WriteLine("No kernel entry point found {0:X8}"); KernelMessage.WriteLine("Is the name of entry point correct?"); KernelMessage.WriteLine("Are symbols emitted?"); KernelMessage.WriteLine("System halt!"); while (true) { Native.Nop(); } } KernelMessage.WriteLine("Call Kernel Start at {0:X8}", kernelEntry); // Start Kernel. CallAddress(kernelEntry); // If we hit this code location, the Kernel Main method returned. // This would be a general fault. Normally, this code section will overwritten // by the kernel, so normally, it can never reach this code position. KernelMessage.WriteLine("Unexpected return from Kernel Start"); Debug.Break(); }