Exemplo n.º 1
0
ARMMap::ARMMap()
{
    MemoryBlock::set(m_regions, 0, sizeof(m_regions));

    m_regions[KernelData].virt      = 0;
    m_regions[KernelData].phys      = 0;
    m_regions[KernelData].size      = GigaByte(1) - MegaByte(128);
    m_regions[KernelData].access    = Memory::Readable | Memory::Writable | Memory::Executable;

    m_regions[KernelPrivate].virt   = GigaByte(1) - MegaByte(128);
    m_regions[KernelPrivate].phys   = GigaByte(1) - MegaByte(128);
    m_regions[KernelPrivate].size   = MegaByte(128);
    m_regions[KernelPrivate].access = Memory::Readable | Memory::Writable;

    m_regions[UserData].virt      = 0x80000000;
    m_regions[UserData].size      = MegaByte(256);

    m_regions[UserHeap].virt      = 0xb0000000;
    m_regions[UserHeap].size      = MegaByte(256);

    m_regions[UserStack].virt     = 0xc0000000;
    m_regions[UserStack].size     = KiloByte(4);

    m_regions[UserPrivate].virt   = 0xa0000000;
    m_regions[UserPrivate].size   = MegaByte(256);
}
Exemplo n.º 2
0
IntelMap::IntelMap()
{
    MemoryBlock::set(m_regions, 0, sizeof(m_regions));

    m_regions[KernelData].virt      = 0;
    m_regions[KernelData].size      = GigaByte(1) - MegaByte(128);

    m_regions[KernelPrivate].virt   = GigaByte(1) - MegaByte(128);
    m_regions[KernelPrivate].size   = MegaByte(128);

    m_regions[UserData].virt      = 0x80000000;
    m_regions[UserData].size      = MegaByte(256);

    m_regions[UserHeap].virt      = 0xb0000000;
    m_regions[UserHeap].size      = MegaByte(256);

    m_regions[UserStack].virt     = 0xc0000000;
    m_regions[UserStack].size     = KiloByte(4);

    m_regions[UserPrivate].virt   = 0xa0000000;
    m_regions[UserPrivate].size   = MegaByte(256);

    m_regions[UserShare].virt     = 0xd0000000;
    m_regions[UserShare].size     = MegaByte(256);
}
Exemplo n.º 3
0
ARMProcess::ARMProcess(ProcessID id, Address entry, bool privileged)
    : Process(id, entry, privileged)
{
    DEBUG("id =" << id << " entry =" << entry << " privileged = " << privileged);

    Size size = PAGEDIR_SIZE;
    BitAllocator *memory = Kernel::instance->getMemory();
    Memory::Range range;
    Size framesize = (14+17)*sizeof(u32);

    // Allocate first level page table
    memory->allocate(&size, &m_pageDirectory, KiloByte(16));

    // Initialize memory context
    Arch::Memory mem(m_pageDirectory, memory);
    mem.create();

    // User stack.
    range.phys   = 0;
    range.virt   = mem.range(Memory::UserStack).virt;
    range.size   = mem.range(Memory::UserStack).size;
    range.access = Memory::Present |
                   Memory::User |
                   Memory::Readable |
                   Memory::Writable;
    mem.mapRange(&range);
    setUserStack(range.virt + range.size - MEMALIGN);

    // Kernel stack.
    range.phys   = 0;
    range.virt   = mem.range(Memory::KernelStack).virt;
    range.size   = mem.range(Memory::KernelStack).size;
    range.access = Memory::Present | Memory::Readable | Memory::Writable;
    mem.mapRange(&range);
    setKernelStack(range.virt + range.size - MEMALIGN - framesize);

    // Map kernel stack.
    Arch::Memory local(0, memory);
    range.virt = local.findFree(range.size, Memory::KernelPrivate);
    local.mapRange(&range);
    Address *stack = (Address *) (range.virt + range.size - framesize - MEMALIGN);

    // Zero kernel stack
    MemoryBlock::set((void *)range.virt, 0, range.size);

    // restoreState: fill kernel register state
    stack[0] = (Address) loadCoreState0; /* restoreState: pop {lr} */
    stack += 14;

    // loadCoreState0: fill user register state
    stack[0] = (privileged ? SYS_MODE : USR_MODE) | FIQ_BIT | IRQ_BIT; /* user program status (CPSR) */
    stack++;
    stack[0] = m_userStack; /* user program SP */
    stack[1] = 0;           /* user program LR */
    stack+=15;
    stack[0] = entry;       /* user program entry (PC) */

    local.unmapRange(&range);
}