示例#1
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);
        }
示例#2
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));
        }
示例#3
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);
        }
示例#4
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, }));
        }
示例#5
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 }));
        }
示例#6
0
文件: Cpu.cs 项目: andy-uq/TinyOS
        public uint Allocate(uint size)
        {
            var page = new PageInfo();

            while (size > Ram.FrameSize)
            {
                size -= Ram.FrameSize;
                page.Append(Ram.Allocate(CurrentProcess));
            }

            page.Append(Ram.Allocate(CurrentProcess));
            CurrentProcess.PageTable.Add(page);

            return(page.Offset);
        }
示例#7
0
文件: Cpu.cs 项目: andy-uq/TinyOS
        public Stream AllocateCodeBlock(ProcessContextBlock pcb, uint length)
        {
            var page = new PageInfo();

            while (length > Ram.FrameSize)
            {
                length -= Ram.FrameSize;
                page.Append(Ram.Allocate(pcb));
            }

            page.Append(Ram.Allocate(pcb));
            pcb.Code = page;

            return(GetMemoryStream(page));
        }
示例#8
0
文件: Cpu.cs 项目: andy-uq/TinyOS
        public void Run(ProcessContextBlock block)
        {
            if (block == null)
            {
                throw new ArgumentNullException(nameof(block));
            }

            block.Stack.Append(Ram.Allocate(block));
            block.GlobalData.Append(Ram.Allocate(block));
            block.Registers[Register.G] = block.Id;
            block.Registers[Register.H] = block.GlobalData.Offset;

            _processes.Add(block.Id, block);
            ReadyQueue.Enqueue(block);
            block.IsRunning = true;
        }