/// <summary> /// Sets up the GDT table and entries /// </summary> public static void Setup() { table = (DescriptorTable *)gdtTableAddress; table->Clear(); table->AdressOfEntries = gdtTableAddress + DescriptorTable.StructSize; //Null segment var nullEntry = DescriptorTableEntry.CreateNullDescriptor(); table->AddEntry(nullEntry); //code segment var codeEntry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); codeEntry.CodeSegment_Readable = true; codeEntry.PriviligeRing = 0; codeEntry.Present = true; codeEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; codeEntry.Granularity = true; table->AddEntry(codeEntry); //data segment var dataEntry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); dataEntry.DataSegment_Writable = true; dataEntry.PriviligeRing = 0; dataEntry.Present = true; dataEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; dataEntry.Granularity = true; table->AddEntry(dataEntry); Flush(); }
/// <summary> /// Sets up the GDT table and entries /// </summary> public static void Setup(Addr addr) { KernelMessage.Write("Setup GDT..."); GdtTableAddress = addr; GdtTable = (DescriptorTable *)GdtTableAddress; GdtTable->Clear(); GdtTable->AdressOfEntries = GdtTableAddress + DescriptorTable.StructSize; //Null segment var nullEntry = DescriptorTableEntry.CreateNullDescriptor(); GdtTable->AddEntry(nullEntry); //code segment var codeEntry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); codeEntry.CodeSegment_Readable = true; codeEntry.PriviligeRing = 0; codeEntry.Present = true; codeEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; //codeEntry.CodeSegment_Confirming = true; GdtTable->AddEntry(codeEntry); //data segment var dataEntry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); dataEntry.DataSegment_Writable = true; dataEntry.PriviligeRing = 0; dataEntry.Present = true; dataEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(dataEntry); Flush(); KernelMessage.WriteLine("Done"); }
/// <summary> /// Sets up the GDT table and entries /// </summary> public static void Setup() { table = (DescriptorTable*)Address.GDTTable; table->Clear(); table->AdressOfEntries = Address.GDTTable + DescriptorTable.StructSize; // Null segment var nullEntry = DescriptorTableEntry.CreateNullDescriptor(); table->AddEntry(nullEntry); // Code Segment var kernelCodeEntry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); kernelCodeEntry.CodeSegment_Readable = true; kernelCodeEntry.PriviligeRing = 0; kernelCodeEntry.Present = true; kernelCodeEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; kernelCodeEntry.Granularity = true; table->AddEntry(kernelCodeEntry); // Data Segment var kernelDataEntry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); kernelDataEntry.DataSegment_Writable = true; kernelDataEntry.PriviligeRing = 0; kernelDataEntry.Present = true; kernelDataEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; kernelDataEntry.Granularity = true; table->AddEntry(kernelDataEntry); // User Code Segment var userCodeEntry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); userCodeEntry.CodeSegment_Readable = true; userCodeEntry.PriviligeRing = 3; userCodeEntry.Present = true; userCodeEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; userCodeEntry.Granularity = true; table->AddEntry(userCodeEntry); // User Data Segment var userDataEntry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); userDataEntry.DataSegment_Writable = true; userDataEntry.PriviligeRing = 3; userDataEntry.Present = true; userDataEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; userDataEntry.Granularity = true; table->AddEntry(userDataEntry); // TSS Segment var tssEntry = DescriptorTableEntry.CreateData(Address.TSS, Address.TSSSize); tssEntry.DataSegment_Writable = true; tssEntry.PriviligeRing = 0; tssEntry.Present = true; tssEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; tssEntry.Granularity = true; table->AddEntry(tssEntry); Flush(); }
/// <summary> /// Sets up the GDT table and entries /// </summary> public static void Setup(Addr addr) { KernelMessage.Write("Setup GDT..."); GdtTableAddress = addr; GdtTable = (DescriptorTable *)GdtTableAddress; GdtTable->Clear(); GdtTable->AdressOfEntries = GdtTableAddress + DescriptorTable.StructSize; // 0 - Null segment var entry = DescriptorTableEntry.CreateNullDescriptor(); GdtTable->AddEntry(entry); // 1 - code segment entry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); entry.CodeSegment_Readable = true; entry.PriviligeRing = 0; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; //codeEntry.CodeSegment_Confirming = true; GdtTable->AddEntry(entry); // 2 - data segment entry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); entry.DataSegment_Writable = true; entry.PriviligeRing = 0; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(entry); // 3 - reserved entry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); entry.DataSegment_Writable = true; entry.PriviligeRing = 0; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(entry); // 4 - kernel thread storage entry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); entry.DataSegment_Writable = true; entry.PriviligeRing = 0; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(entry); // 5 - reserved entry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); entry.DataSegment_Writable = true; entry.PriviligeRing = 0; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(entry); // --- // 6 - user code segment entry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); entry.CodeSegment_Readable = true; entry.PriviligeRing = 3; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; entry.CodeSegment_Confirming = false; GdtTable->AddEntry(entry); // 7 - user data segment entry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); entry.DataSegment_Writable = true; entry.PriviligeRing = 3; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(entry); // 8 - thread storage segment for FS register entry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); entry.DataSegment_Writable = true; entry.PriviligeRing = 3; entry.Present = true; entry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; GdtTable->AddEntry(entry); Flush(); KernelMessage.WriteLine("Done"); }
public static void KernelSetup(Addr gdtAddr) { GdtTableAddress = gdtAddr; GdtTable = (DescriptorTable *)GdtTableAddress; }
/// <summary> /// Sets up the GDT table and entries /// </summary> public static void Setup() { table = (DescriptorTable*)gdtTableAddress; table->Clear(); table->AdressOfEntries = gdtTableAddress + DescriptorTable.StructSize; //Null segment var nullEntry = DescriptorTableEntry.CreateNullDescriptor(); table->AddEntry(nullEntry); //code segment var codeEntry = DescriptorTableEntry.CreateCode(0, 0xFFFFFFFF); codeEntry.CodeSegment_Readable = true; codeEntry.PriviligeRing = 0; codeEntry.Present = true; codeEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; codeEntry.Granularity = true; table->AddEntry(codeEntry); //data segment var dataEntry = DescriptorTableEntry.CreateData(0, 0xFFFFFFFF); dataEntry.DataSegment_Writable = true; dataEntry.PriviligeRing = 0; dataEntry.Present = true; dataEntry.AddressMode = DescriptorTableEntry.EAddressMode.Bits32; dataEntry.Granularity = true; table->AddEntry(dataEntry); Flush(); }