//---------------------------------------------------------- // INITIALIZE MEMORY MAP //---------------------------------------------------------- void memmap_init() { uint16_t i; // Initialize all memory to be owned by the kernel for (i = 0; i < MEMMAP_TABLE_SIZE; i++){ memmap[i] = BLOCK_FREE_VEC; } printMemMap("Memmap Init:"); }
void MemoryManager::executeCycle() { ++_m_cycle_num; for (unsigned long i = 0; i < _running_queue.size(); ++i) { process_t& _proc = _running_queue[i]; _proc._burst_time = (_proc._burst_time - 1); if (_proc._burst_time == 0) { _proc._can_swap_out = true; } } if (hasReadyProcess()) { if (swapIn(pullNextFromReadyQueue())) { _ready_queue.erase(_ready_queue.begin()); } else { bool proc_swapped = false; for (unsigned long i = 0; i < _running_queue.size(); i++) { process_t& _proc = _running_queue[i]; if (_proc._can_swap_out) { if (swapOut(_proc)) { _proc._can_swap_out = false; _proc._can_swap_in = true; _ready_queue.push_back(_running_queue.at(i)); _running_queue.erase(_running_queue.begin() + i); proc_swapped = true; } } if (proc_swapped) { proc_swapped = false; break; } } } } double _ratio = getMemRatio(); if (_ratio > MAX_MEM_RATION) { std::cout << "\tRUNNING COMPACTION - MAX RATIO HIT (" << _ratio << ")" << std::endl; doCompaction(); printMemMap(); } }
//---------------------------------------------------------- // SET PERMISSIONS FOR A SET OF BLOCKS //---------------------------------------------------------- void memmap_set_perms(void* baseaddr, uint16_t length, uint8_t seg_perms) { blk_num_t blknum, blocksleft; uint16_t memmap_table_index; uint8_t memmap_byte_offset; uint8_t lperms_bm, lperms_set_val; uint8_t perms; if (0 == length) { DEBUG("Length cannot be 0\n"); return; } if ((length & MEMMAP_BLK_OFFSET) != 0){ DEBUG("Length has to be a multiple of block size\n"); return; // Length should be a multiple of block size } blocksleft = length >> MEMMAP_BLK_NUM_LSB; blknum = MEMMAP_GET_BLK_NUM(baseaddr); memmap_table_index = MEMMAP_GET_TABLE_NDX(blknum); memmap_byte_offset = MEMMAP_GET_BYTE_OFFSET(blknum); perms = memmap[memmap_table_index]; lperms_bm = (MEMMAP_REC_MASK << memmap_byte_offset); lperms_set_val = (seg_perms << memmap_byte_offset); while (blocksleft > 0){ perms &= ~(lperms_bm); perms |= lperms_set_val; blocksleft--; lperms_bm <<= MEMMAP_REC_BITS; lperms_set_val <<= MEMMAP_REC_BITS; if (0 == lperms_bm){ memmap[memmap_table_index] = perms; memmap_table_index++; perms = memmap[memmap_table_index]; lperms_bm = MEMMAP_REC_MASK; lperms_set_val = seg_perms; } } memmap[memmap_table_index] = perms; printMemMap("Memmap Set Perms:"); }
//---------------------------------------------------------- // CHANGE PERMISSIONS FOR CURRENT SEGMENT //---------------------------------------------------------- uint16_t memmap_change_perms(void* baseaddr, uint8_t perm_mask, uint8_t perm_check_val, uint8_t perm_set_val) { blk_num_t blknum, nblocks; uint16_t memmap_table_index; uint8_t memmap_byte_offset; uint8_t lperm_mask, lperm_check_val, lperm_set_val, perm_bm; uint8_t perms; nblocks = 0; blknum = MEMMAP_GET_BLK_NUM(baseaddr); memmap_table_index = MEMMAP_GET_TABLE_NDX(blknum); memmap_byte_offset = MEMMAP_GET_BYTE_OFFSET(blknum); perms = memmap[memmap_table_index]; lperm_mask = (perm_mask << memmap_byte_offset); lperm_check_val = (perm_check_val << memmap_byte_offset); lperm_set_val = (perm_set_val << memmap_byte_offset); perm_bm = (MEMMAP_REC_MASK << memmap_byte_offset); while ((perms & lperm_mask) == lperm_check_val){ perms &= ~perm_bm; perms |= lperm_set_val; nblocks++; lperm_mask <<= MEMMAP_REC_BITS; lperm_check_val <<= MEMMAP_REC_BITS; lperm_set_val <<= MEMMAP_REC_BITS; perm_bm <<= MEMMAP_REC_BITS; if (0 == perm_bm){ memmap[memmap_table_index] = perms; memmap_table_index++; perms = memmap[memmap_table_index]; lperm_mask = perm_mask; lperm_check_val = perm_check_val; lperm_set_val = perm_set_val; perm_bm = MEMMAP_REC_MASK; } } memmap[memmap_table_index] = perms; printMemMap("memmap_change_perms:"); return nblocks; }
void DasosPreproc::printSuccess (struct Success s) { s2e()->getDebugStream() << ">> Success densities, overlay: " << s.overlay_density << "; avg: " << s.avg_density << "\n"; printTrace (s.trace, s.mem_map); printMemMap (s.mem_map, cfg.base_addr, cfg.byte_len); return; } // end fn printSuccess