/// <summary> /// Swaps in the specified <see cref="MemoryPage"/> from disk. Currently implemented as XML for fun. /// </summary> /// <param name="winner">The <see cref="MemoryPage"/> that is being swapped in</param> public void SwapIn(MemoryPage winner) { // Generate a filename based on address and page number string filename = System.Environment.CurrentDirectory + "/page" + winner.pageNumber + "-" + winner.addrVirtual + ".xml"; if (File.Exists(filename) && winner.isValid == false) { //BinaryFormatter ser = new BinaryFormatter(); //Stream reader = new FileStream(filename, FileMode.Open); XmlSerializer ser = new XmlSerializer(typeof(MemoryPageValue)); Stream fs = new FileStream(filename, FileMode.Open); XmlReader reader = new XmlTextReader(fs); // Load the MemoryPageValue in from Disk! MemoryPageValue pageValue = (MemoryPageValue)ser.Deserialize(reader); // Copy the bytes from Physical Memory so we don't pageFault in a Fault Hander for (int i = 0; i < CPU.pageSize; i++) { CPU.physicalMemory[winner.addrPhysical + i] = pageValue.memory[i]; } //Console.WriteLine("Swapping in page {0} at physical memory {1}",winner.pageNumber, winner.addrPhysical); winner.accessCount = pageValue.accessCount; winner.lastAccessed = pageValue.lastAccessed; pageValue = null; reader.Close(); fs.Close(); File.Delete(filename); } else //no swap file, do nothing { //Console.WriteLine(filename + " doesn't exist"); } // We are now in memory and we were involved in Page Fault winner.isValid = true; winner.pageFaults++; }
/// <summary> /// Swaps the specified <see cref="MemoryPage"/> to disk. Currently implemented as XML for fun. /// </summary> /// <param name="victim">The <see cref="MemoryPage"/> to be swapped</param> public void SwapOut(MemoryPage victim) { if (victim.isDirty) { // Generate a filename based on address and page number string filename = System.Environment.CurrentDirectory + "/page" + victim.pageNumber + "-" + victim.addrVirtual + ".xml"; // IFormatter ser = new BinaryFormatter(); // Stream writer = new FileStream(filename, FileMode.Create); XmlSerializer ser = new XmlSerializer(typeof(MemoryPageValue)); Stream fs = new FileStream(filename, FileMode.Create); XmlWriter writer = new XmlTextWriter(fs, new UTF8Encoding()); MemoryPageValue pageValue = new MemoryPageValue(); // Copy the bytes from Physical Memory so we don't pageFault in a Fault Hander byte[] bytes = new byte[CPU.pageSize]; for (int i = 0; i < CPU.pageSize; i++) { bytes[i] = CPU.physicalMemory[victim.addrPhysical + i]; } // Copy details from the MemoryPage to the MemoryPageValue pageValue.memory = bytes; pageValue.accessCount = victim.accessCount; pageValue.lastAccessed = victim.lastAccessed; //Console.WriteLine("Swapping out page {0} at physical memory {1}",victim.pageNumber, victim.addrPhysical); // Write the MemoryPageValue to disk! ser.Serialize(writer, pageValue); //writer.Flush(); //writer.Close(); fs.Close(); } victim.isValid = false; }