finish(maybe...)

This commit is contained in:
2026-04-14 21:30:38 +08:00
parent 785e92ec8b
commit 2c61ef07ff
172 changed files with 202485 additions and 68 deletions
+8 -8
View File
@@ -11,7 +11,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 48,
vaBits = 24,
pageSizeKB = 4,
physicalMemoryMB = 64,
tlbEntries = 16,
@@ -26,7 +26,7 @@ namespace VMdemo.Tests.EditMode
Assert.That(derived.PageSizeBytes, Is.EqualTo(4096UL));
Assert.That(derived.PhysicalMemoryBytes, Is.EqualTo(67108864UL));
Assert.That(derived.OffsetBits, Is.EqualTo(12));
Assert.That(derived.VpnBits, Is.EqualTo(36));
Assert.That(derived.VpnBits, Is.EqualTo(12));
Assert.That(derived.FrameCount, Is.EqualTo(16384UL));
}
@@ -35,7 +35,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 40,
vaBits = 12,
pageSizeKB = 4,
physicalMemoryMB = 64,
tlbEntries = 16,
@@ -54,7 +54,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 32,
vaBits = 16,
pageSizeKB = 6,
physicalMemoryMB = 64,
tlbEntries = 16,
@@ -73,9 +73,9 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 32,
pageSizeKB = 4 * 1024 * 1024,
physicalMemoryMB = 8192,
vaBits = 8,
pageSizeKB = 1,
physicalMemoryMB = 8,
tlbEntries = 16,
accessCount = 10,
pageFaultPenalty = 100
@@ -92,7 +92,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 32,
vaBits = 16,
pageSizeKB = 2048,
physicalMemoryMB = 1,
tlbEntries = 16,
+36 -18
View File
@@ -6,9 +6,9 @@ namespace VMdemo.Tests.EditMode
{
public class Step2AddressSplitTests
{
[TestCase(32)]
[TestCase(48)]
[TestCase(64)]
[TestCase(8)]
[TestCase(16)]
[TestCase(24)]
public void AddressGenerator_NextVirtualAddress_StaysWithinRange(int vaBits)
{
var generator = new AddressGenerator(vaBits, seed: 7);
@@ -23,8 +23,8 @@ namespace VMdemo.Tests.EditMode
[Test]
public void AddressGenerator_SameSeed_GeneratesDeterministicSequence()
{
var a = new AddressGenerator(48, seed: 99);
var b = new AddressGenerator(48, seed: 99);
var a = new AddressGenerator(24, seed: 99);
var b = new AddressGenerator(24, seed: 99);
for (var i = 0; i < 20; i++)
{
@@ -35,8 +35,8 @@ namespace VMdemo.Tests.EditMode
[Test]
public void AddressGenerator_DifferentSeed_GeneratesDifferentSequence()
{
var a = new AddressGenerator(48, seed: 99);
var b = new AddressGenerator(48, seed: 100);
var a = new AddressGenerator(24, seed: 99);
var b = new AddressGenerator(24, seed: 100);
var hasDifference = false;
for (var i = 0; i < 20; i++)
@@ -51,9 +51,9 @@ namespace VMdemo.Tests.EditMode
Assert.IsTrue(hasDifference);
}
[TestCase(0x12345ABCUL, 32, 12, 0x12345UL, 0xABCUL, 0x48UL, 0x345UL)]
[TestCase(0x0000ABCDEF123456UL, 48, 12, 0xABCDEF123UL, 0x456UL, 0x2AF37UL, 0x2F123UL)]
[TestCase(0xFEDCBA9876543210UL, 64, 16, 0xFEDCBA987654UL, 0x3210UL, 0xFEDCBAUL, 0x987654UL)]
[TestCase(0xAFUL, 8, 4, 0xAUL, 0xFUL, 0x2UL, 0x2UL)]
[TestCase(0xABCDUL, 16, 8, 0xABUL, 0xCDUL, 0xAUL, 0xBUL)]
[TestCase(0x123456UL, 24, 8, 0x1234UL, 0x56UL, 0x12UL, 0x34UL)]
public void SplitVirtualAddress_SupportedVaBits_ReturnsExpectedParts(
ulong va,
int vaBits,
@@ -75,19 +75,19 @@ namespace VMdemo.Tests.EditMode
[Test]
public void SplitVirtualAddress_OddVpnBits_UsesCeilFloorBitSplit()
{
const int vaBits = 32;
const int offsetBits = 13;
const ulong va = 0xDEADBEEFUL;
const int vaBits = 24;
const int offsetBits = 5;
const ulong va = 0xABCDEFUL;
var parts = AddressTranslatorUtils.SplitVirtualAddress(va, vaBits, offsetBits);
AddressTranslatorUtils.GetPageTableBitLayout(vaBits - offsetBits, out var l1Bits, out var l2Bits);
Assert.That(l1Bits, Is.EqualTo(10));
Assert.That(l2Bits, Is.EqualTo(9));
Assert.That(parts.Vpn, Is.EqualTo(0x6F56DUL));
Assert.That(parts.Offset, Is.EqualTo(0x1EEFUL));
Assert.That(parts.L1Index, Is.EqualTo(0x37AUL));
Assert.That(parts.L2Index, Is.EqualTo(0x16DUL));
Assert.That(parts.Vpn, Is.EqualTo(0x55E6FUL));
Assert.That(parts.Offset, Is.EqualTo(0xFUL));
Assert.That(parts.L1Index, Is.EqualTo(0x2AFUL));
Assert.That(parts.L2Index, Is.EqualTo(0x6FUL));
}
[Test]
@@ -107,7 +107,25 @@ namespace VMdemo.Tests.EditMode
public void SplitVirtualAddress_AddressOutOfRange_Throws()
{
Assert.Throws<System.ArgumentOutOfRangeException>(() =>
AddressTranslatorUtils.SplitVirtualAddress(0x1_0000_0000UL, 32, 12));
AddressTranslatorUtils.SplitVirtualAddress(0x1_000000UL, 24, 8));
}
[Test]
public void AddressGenerator_SequentialArrayLoop_FollowsClassicForLoopOrderAndWraps()
{
var generator = new AddressGenerator(
vaBits: 16,
seed: 7,
mode: AddressGenerationMode.SequentialArrayLoop,
arrayLengthBytes: 16,
arrayElementBytes: 4,
arrayBaseAddress: 0x20);
Assert.That(generator.NextVirtualAddress(), Is.EqualTo(0x20UL));
Assert.That(generator.NextVirtualAddress(), Is.EqualTo(0x24UL));
Assert.That(generator.NextVirtualAddress(), Is.EqualTo(0x28UL));
Assert.That(generator.NextVirtualAddress(), Is.EqualTo(0x2CUL));
Assert.That(generator.NextVirtualAddress(), Is.EqualTo(0x20UL));
}
}
}
@@ -40,6 +40,29 @@ namespace VMdemo.Tests.EditMode
Assert.IsFalse(entry.Present);
}
[Test]
public void TwoLevelPageTable_Probe_CanDistinguishLookupReasons()
{
var pageTable = new TwoLevelPageTable(3, 2);
var missingL1 = pageTable.Probe(1UL, 0UL);
Assert.That(missingL1.Status, Is.EqualTo(PageTableProbeStatus.MissingL1Table));
pageTable.SetPresent(1UL, 2UL, 7UL);
var missingL2 = pageTable.Probe(1UL, 3UL);
Assert.That(missingL2.Status, Is.EqualTo(PageTableProbeStatus.MissingL2Entry));
pageTable.MarkNotPresent(1UL, 2UL);
var notPresent = pageTable.Probe(1UL, 2UL);
Assert.That(notPresent.Status, Is.EqualTo(PageTableProbeStatus.NotPresentEntry));
Assert.IsTrue(notPresent.HasEntry);
pageTable.SetPresent(1UL, 2UL, 9UL);
var present = pageTable.Probe(1UL, 2UL);
Assert.That(present.Status, Is.EqualTo(PageTableProbeStatus.PresentEntry));
Assert.That(present.Entry.Pfn, Is.EqualTo(9UL));
}
[Test]
public void PhysicalMemoryManager_AllocateForVpn_EvictsInFifoOrder()
{
@@ -73,7 +73,7 @@ namespace VMdemo.Tests.EditMode
{
var engine = CreateEngine(frameCountMb: 1, tlbEntries: 2, seed: 99);
const ulong va = 0x0000_89ABUL;
var parts = AddressTranslatorUtils.SplitVirtualAddress(va, 32, engine.OffsetBits);
var parts = AddressTranslatorUtils.SplitVirtualAddress(va, engine.VaBits, engine.OffsetBits);
engine.PageTable.SetPresent(parts.L1Index, parts.L2Index, pfn: 3UL);
engine.SetNextVirtualAddress(va);
@@ -109,7 +109,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 32,
vaBits = 24,
pageSizeKB = 1024, // 1MB per page
physicalMemoryMB = 1, // 1 frame total
tlbEntries = 4,
@@ -178,7 +178,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 32,
vaBits = 24,
pageSizeKB = 4,
physicalMemoryMB = frameCountMb,
tlbEntries = tlbEntries,
@@ -121,7 +121,7 @@ namespace VMdemo.Tests.EditMode
{
var config = new SimulationConfig
{
vaBits = 32,
vaBits = 24,
pageSizeKB = 4,
physicalMemoryMB = 1,
tlbEntries = 4,