Beispiel #1
0
        static void MapKernelImage()
        {
            var phys    = Address.KernelElfSection;
            var diff    = Address.KernelBaseVirt - Address.KernelBasePhys;
            var endPhys = phys + OriginalKernelElf.TotalFileSize;
            var addr    = phys;

            KernelMessage.WriteLine("Mapping Kernel Image from physical {0:X8} to virtual {1:X8}", phys, phys + diff);
            while (addr < endPhys)
            {
                PageTable.MapVirtualAddressToPhysical(addr + diff, addr);
                addr += 0x1000;
            }
        }
        /// <summary>
        /// Returns raw, unmanaged Memory.
        /// Consumer: Kernel, Memory allocators
        /// Shoud be used for larger Chunks.
        /// </summary>
        internal unsafe static Addr RequestRawVirtalMemoryPages(uint pages)
        {
            Addr virt = _nextVirtAddr;
            var  head = PageFrameManager.AllocatePages(PageFrameRequestFlags.Default, pages);

            if (head == null)
            {
                return(Addr.Zero);
            }

            var p = head;

            for (var i = 0; i < pages; i++)
            {
                PageTable.MapVirtualAddressToPhysical(_nextVirtAddr, p->PhysicalAddress);
                _nextVirtAddr += 4096;
                p              = p->Next;
            }
            return(virt);
        }