/// <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"; } } }
/// <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"); }
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(); } } }
// // создать механизмы создания файлов в директории для каждого процесса // /// <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)); }