Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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");
        }
Ejemplo n.º 3
0
        /// <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();
        }
Ejemplo n.º 4
0
        /// <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");
        }
Ejemplo n.º 5
0
 public static void KernelSetup(Addr gdtAddr)
 {
     GdtTableAddress = gdtAddr;
     GdtTable        = (DescriptorTable *)GdtTableAddress;
 }
Ejemplo n.º 6
0
        /// <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();
        }