Exemplo n.º 1
0
 public static void Break()
 {
     KernelMessage.Write("<BREAK>");
     while (true)
     {
         Native.Nop();
     }
 }
Exemplo 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");
        }
Exemplo n.º 3
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");
        }