Exemplo n.º 1
0
 /// <summary>
 /// Создает новый экземпляр "зеркала страницы рабочего набора"
 /// </summary>
 public WSClockEntryMirror(ref PageTableEntry pageTableEntry, int currentVirtualTime, int index)
 {
     PageTableEntryIndex = index;
     PageTableEntry      = pageTableEntry;
     LastUseTime         = currentVirtualTime;
     Referenced          = false;
     Modified            = false;
     WrittenIntoFile     = false;
 }
        private void lst_Pages_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            PageTableEntry selectedEntry = (PageTableEntry)lst_Pages.SelectedItem;

            if (selectedEntry != null)
            {
                if (selectedEntry.SwappedOut)
                {
                    btn_Swap_Out.Content = "SWAP IN";
                }
                else
                {
                    btn_Swap_Out.Content = "SWAP OUT";
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Sets up the PageTable
        /// </summary>
        public static void Setup(Addr addrPageDirectory, Addr addrPageTable)
        {
            KernelMessage.WriteLine("Setup PageTable");

            AddrPageDirectory = addrPageDirectory;
            AddrPageTable     = addrPageTable;

            // Setup Page Directory
            PageDirectoryEntry *pde = (PageDirectoryEntry *)AddrPageDirectory;

            for (int index = 0; index < 1024; index++)
            {
                pde[index]                = new PageDirectoryEntry();
                pde[index].Present        = true;
                pde[index].Writable       = true;
                pde[index].User           = true;
                pde[index].PageTableEntry = (PageTableEntry *)(uint)(AddrPageTable + (index * 4096));
            }

            // Map the first 128MB of memory (32786 4K pages) (why 128MB?)
            for (int index = 0; index < 1024 * 32; index++)
            {
                PageTableEntry *pte = (PageTableEntry *)AddrPageTable;
                pte[index]                 = new PageTableEntry();
                pte[index].Present         = true;
                pte[index].Writable        = true;
                pte[index].User            = true;
                pte[index].PhysicalAddress = (uint)(index * 4096);
            }

            // Unmap the first page for null pointer exceptions
            MapVirtualAddressToPhysical(0x0, 0x0, false);

            // Set CR3 register on processor - sets page directory
            KernelMessage.WriteLine("Set CR3 to {0:X8}", PageTable.AddrPageDirectory);
            Native.SetCR3(AddrPageDirectory);

            KernelMessage.Write("Enable Paging... ");

            // Set CR0.WP
            Native.SetCR0(Native.GetCR0() | 0x10000);

            // Set CR0 register on processor - turns on virtual memory
            Native.SetCR0(Native.GetCR0() | 0x80000000);

            KernelMessage.WriteLine("Done");
        }
Exemplo n.º 4
0
        private void WritePageToDrive(TextWriter writer, PageTableEntry pageTableEntry, int pageIndexInPageTable)
        {
            uint adress = (uint)(pageTableEntry.Adress * PageSize);

            for (int i = 0; i < hardware.RAMs.Length; i++)
            {
                uint endPhisycalAdress = hardware.RAMs[i].PhysicalAdress + (uint)(hardware.RAMs[i].ByteCells.Length * (bitDepth / 8));
                if (adress >= hardware.RAMs[i].PhysicalAdress && adress < endPhisycalAdress)
                {
                    uint pageStartIndex = (adress - hardware.RAMs[i].PhysicalAdress) / (uint)(bitDepth / 8); // стартовый индекс BitArray, с которого начинается страница
                    uint pageEndIndex   = pageStartIndex + (uint)PageSize / 4;                               // блоки по 32 бита
                    writer.WriteLine("[ " + pageIndexInPageTable + " ]");
                    for (uint j = pageStartIndex; j < pageEndIndex; j++)
                    {
                        writer.Write(GetBitArrayStringFormat(hardware.RAMs[i].ByteCells[j]) + " ");
                    }
                    writer.WriteLine();
                }
            }
        }
Exemplo n.º 5
0
        //
        // создать механизмы создания файлов в директории для каждого процесса
        //
        /// <summary>
        /// Записывает страницу процесса на диск. В случае неудачи перезаписи вернет false.
        /// </summary>
        /// <param name="processFileName">имя файла, отвечающего за данный процесс</param>
        /// <param name="pageTableEntry">сведения о странице в таблице страниц</param>
        /// <param name="pageNumber">номер страницы в таблицы страниц</param>
        /// <param name="rewrite">Если true, то данные указанной страницы перезаписываются, если false, то данные просто добавляются в конец файла</param>
        /// <returns></returns>
        private bool WritePageToDrive(string processFileName, PageTableEntry pageTableEntry, int pageNumber, bool rewrite)
        {
            if (rewrite)
            {
                StreamWriter writer = new StreamWriter(CurrentDirectoryName + "\\" + "tmp.prc", true);
                StreamReader reader = new StreamReader(CurrentDirectoryName + "\\" + processFileName);

                string   pageIndexInPageTable;
                string[] buffer;
                int      number    = 0;
                bool     isRewrite = false;
                while (!reader.EndOfStream)
                {
                    if (!isRewrite)
                    {
                        pageIndexInPageTable = reader.ReadLine();
                        buffer = pageIndexInPageTable.Split(new char[] { ' ', '[', ']' }, StringSplitOptions.RemoveEmptyEntries);

                        bool isNumber = false;
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            if (Int32.TryParse(buffer[i], out number))
                            {
                                isNumber = true;
                                break;
                            }
                        }
                        if (!isNumber)
                        {
                            return(false);
                        }

                        if (number == pageNumber)
                        {
                            WritePageToDrive(writer, pageTableEntry, pageNumber);
                            isRewrite = true;
                            reader.ReadLine(); // чтобы скипнуть содержиммое этой страницы
                        }
                        else
                        {
                            writer.WriteLine("[ " + number + " ]");
                            writer.WriteLine(reader.ReadLine());
                        }
                    }
                    else
                    {
                        writer.Write(reader.ReadToEnd());
                    }
                }
                reader.Close();
                writer.Close();
                File.Delete(CurrentDirectoryName + "\\" + processFileName);
                File.Move(CurrentDirectoryName + "\\" + "tmp.prc", CurrentDirectoryName + "\\" + processFileName);
            }
            else
            {
                StreamWriter writer = new StreamWriter(CurrentDirectoryName + "\\" + processFileName, true);
                WritePageToDrive(writer, pageTableEntry, pageNumber);
                writer.Close();
            }
            return(true);
        }
        public void PageTableEntryTest()
        {
            PageTableEntry entry = new PageTableEntry(0, 0, 0, false, new MemoryPage(0, 0, "Unit Test", -1));

            Assert.IsInstanceOfType(entry, typeof(PageTableEntry));
        }