예제 #1
0
파일: memmap.c 프로젝트: nesl/sos-2x
//----------------------------------------------------------
// 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:");
}
예제 #2
0
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();
	}

}
예제 #3
0
파일: memmap.c 프로젝트: nesl/sos-2x
//----------------------------------------------------------
// 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:");
}
예제 #4
0
파일: memmap.c 프로젝트: nesl/sos-2x
//----------------------------------------------------------
// 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;
}
예제 #5
0
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