示例#1
0
 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);
 }
示例#2
0
        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();
        }
示例#3
0
    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();
        }
    }
示例#4
0
        internal static uint SetThreadStorageSegmentBase(ref SysCallContext context, ref SystemMessage args)
        {
            var addr = args.Arg1;

            Scheduler.GetCurrentThread().ThreadLocalStorageBaseAddr = addr;
            GDT.SetThreadStorageSegmentBase(addr);

            return(0);
        }
示例#5
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);
        }
示例#6
0
        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();
            }
            ;
        }
示例#7
0
        private static void Setup()
        {
            IDT.SetInterruptHandler(null);
            Panic.Setup();
            Debugger.Setup(Serial.COM1);

            // Initialize interrupts
            PIC.Setup();
            IDT.Setup();
            GDT.Setup();

            //Runtime.Internal.Setup();
        }
示例#8
0
文件: Scheduler.cs 项目: arakis/abanu
        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");
        }
示例#9
0
        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");
        }
示例#10
0
        /// <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();
        }
示例#11
0
文件: BootInfo.cs 项目: arakis/abanu
        // 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);
        }
示例#12
0
        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();
        }
示例#13
0
        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();
            }
        }
示例#14
0
        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();
            }
        }
示例#15
0
        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)
            {
                ;
            }
        }
示例#16
0
        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();
        }