예제 #1
0
        public void Read()
        {
            var        buffer    = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
            const uint frameSize = 4;
            var        ram       = new Ram(buffer, frameSize);
            var        pageSet   = new PageInfo();

            var pcb = new ProcessContextBlock {
                Id = 1
            };

            ram.Allocate(pcb);
            pageSet.Append(ram.Allocate(pcb));
            pageSet.Append(ram.Allocate(pcb));

            var pageStream = new PageStream(ram, pageSet);

            Assert.That(pageStream.Length, Is.EqualTo(8));

            var b = new byte[6];

            pageStream.Read(b, 0, 6);

            Assert.That(pageStream.Position, Is.EqualTo(6));

            Assert.That(b, Is.EquivalentTo(new[] { 5, 6, 7, 8, 9, 10 }));
        }
예제 #2
0
        public void Write()
        {
            var        buffer    = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
            const uint frameSize = 4;
            var        ram       = new Ram(buffer, frameSize);
            var        pageSet   = new PageInfo();

            var pcb = new ProcessContextBlock {
                Id = 1
            };

            ram.Allocate(pcb);
            pageSet.Append(ram.Allocate(pcb));
            pageSet.Append(ram.Allocate(pcb));

            var pageStream = new PageStream(ram, pageSet);

            Assert.That(pageStream.Length, Is.EqualTo(8));

            var b = new byte[] { 91, 92, 93, 94, };

            pageStream.Position = 2;
            pageStream.Write(b, 0, 4);

            Assert.That(buffer, Is.EquivalentTo(new[] { 1, 2, 3, 4, 5, 6, 91, 92, 93, 94, 11, 12, }));
        }
예제 #3
0
        private ProcessContextBlock CreateProcess(uint pId)
        {
            var p = new ProcessContextBlock {
                Id = pId
            };

            p.Stack.Append(_cpu.Ram.Allocate(p));
            p.Code.Append(_cpu.Ram.Allocate(p));
            p.GlobalData.Append(_cpu.Ram.Allocate(p));
            return(p);
        }
예제 #4
0
        public void SignalEvent()
        {
            var pA = _cpu.CurrentProcess;

            Invoke(InstructionsWithControlByte.WaitEvent, 1);

            var pB = new ProcessContextBlock();

            _cpu.CurrentProcess = pB;
            Invoke(InstructionsWithControlByte.SignalEvent, 1);

            Assert.That(_cpu.CurrentProcess, Is.EqualTo(pB));
            Assert.That(_cpu.ReadyQueue, Contains.Item(pA));
            Assert.That(_cpu.DeviceReadQueue, Is.Empty);
        }
예제 #5
0
        public void SignalEvent()
        {
            var pA = _cpu.CurrentProcess;

            Instructions.Movi(_cpu, Register.A, 1);
            Instructions.WaitEvent(_cpu, Register.A);

            var pB = new ProcessContextBlock();

            _cpu.CurrentProcess = pB;
            Instructions.Movi(_cpu, Register.A, 1);
            Instructions.SignalEvent(_cpu, Register.A);

            Assert.That(_cpu.CurrentProcess, Is.EqualTo(pB));
            Assert.That(_cpu.ReadyQueue, Contains.Item(pA));
            Assert.That(_cpu.DeviceQueue, Is.Empty);
        }
예제 #6
0
        public void Free()
        {
            var ram = new Ram(2, 1);

            var pcb = new ProcessContextBlock {
                Id = 1
            };
            var frame = ram.Allocate(pcb);

            Assert.That(frame, Is.Not.Null);

            frame = ram.Allocate(pcb);
            Assert.That(frame, Is.Not.Null);

            ram.Free(frame);

            frame = ram.Allocate(pcb);
            Assert.That(frame, Is.Not.Null);
        }
예제 #7
0
        public void Allocate()
        {
            var ram = new Ram(2, 1);

            var pcb = new ProcessContextBlock {
                Id = 1
            };
            var page = ram.Allocate(pcb);

            Assert.That(page, Is.Not.Null);
            Assert.That(page.PageNumber, Is.Not.EqualTo(0));

            page = ram.Allocate(pcb);
            Assert.That(page, Is.Not.Null);
            Assert.That(page.PageNumber, Is.Not.EqualTo(0));

            page = ram.Allocate(pcb);
            Assert.That(page, Is.Null);
        }
예제 #8
0
        public void CreateShared()
        {
            var ram    = new Ram(1024, 256);
            var offset = ram.AllocateShared(512);

            Assert.That(offset, Is.EqualTo(0));

            var pcb = new ProcessContextBlock {
                Id = 10
            };
            var p1 = ram.Allocate(pcb);
            var p2 = ram.Allocate(pcb);

            var p1Offset = ram.ToPhysicalAddress(10, p1.VirtualAddress);
            var p2Offset = ram.ToPhysicalAddress(10, p2.VirtualAddress);

            Assert.That(p1Offset, Is.GreaterThan(offset));
            Assert.That(p2Offset, Is.GreaterThan(offset));
            Assert.That(p2Offset, Is.GreaterThan(p1Offset));
        }
        public static uint Compile(this Cpu cpu, ProcessContextBlock pcb, string source)
        {
            var ms = new MemoryStream();

            using (var writer = new CodeWriter(ms))
            {
                var assembler = new Assembler(source);
                foreach (var i in assembler.Assemble())
                {
                    writer.Write(i);
                }

                writer.Close();

                var codeBlock = cpu.AllocateCodeBlock(pcb, (uint)ms.Length);
                ms.WriteTo(codeBlock);

                return((uint )ms.Length);
            }
        }