// 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; // } static void ApplyAddresses() { GDT.KernelSetup(GetMap(BootInfoMemoryType.GDT)->Start); PageTable.KernelSetup( GetMap(BootInfoMemoryType.PageDirectory)->Start, GetMap(BootInfoMemoryType.PageTable)->Start); }
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>"); // 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); 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. map = BootMemory.AllocateMemoryMap(PageTable.InitalPageDirectorySize, BootInfoMemoryType.PageDirectory); BootInfo_.AddMap(map); var map2 = BootMemory.AllocateMemoryMap(PageTable.InitalPageTableSize, BootInfoMemoryType.PageTable); BootInfo_.AddMap(map2); PageTable.Setup(map.Start, map2.Start); // 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(); }