/*=============== move_block ===================*/
/* sposta un blocco di processi contigui e ne cambia i relativi slot nella tabella dei processi di MM e FS - La mem_copy sposta materialemnte il blocco - Il ciclo for cambia gli slot dei processi che hanno indirizzo iniziale compreso tra dove bisogna cominciare a copiare il blocco e dove termina il blocco stesso (infatti non vi sono piu` processi attivi in tale area) - La sys_newmap trasmette i cambiamenti alla tabella del kernel - Ritorna l'indirizzo successivo alla fine del blocco spostato */ PUBLIC phys_clicks move_block (addr1_clicks, gap_clicks, addr2_clicks) phys_clicks addr1_clicks; /* dove cominciare a copiare il blocco */ phys_clicks gap_clicks; /* di quanto spostare il blocco */ phys_clicks addr2_clicks; /* dove finisce il blocco da copiare */ { register struct mproc * mp_aux; phys_clicks addr_clicks, len_clicks; long addr_abs, addr1_abs, len_bytes; int i, slot_number; /* copiatura blocco di memoria */ if (addr1_clicks ,=0) panic ("addr1_clicks inconsistent", NO_NUM); addr_clicks = addr1_clicks + gap_clicks; /* dove inizia il blocco */ len_clicks = addr2_clicks - addr_clicks; /* lunghezza del blocco */ addr_abs = (long) addr_clicks << CLICK_SHIFT; addr1_abs = (long) addr1_clicks << CLICK_SHIFT; len_bytes = (long) len_clicks << CLICK_SHIFT; i = mem_copy (ABS, T, addr_abs, ABS, T, addr1_abs, len_bytes); if (i<0) panic ("compact cannot copy", i); /* aggiornamento tabelle MM e Kernel */ for (mp_aux = &mproc[0]; mp_aux < &mproc[NR_PROCS]; mp_aux ++) if ((mp_aux->mp_flags & IN_USE ) && (!(mp_aux->mp_flags & HANGING))) if ((addr1_clicks < mp_aux->mp_seg[T].mem_phys) && (mp_aux->mp_seg[T].mem_phys < addr2_clicks)) { mp_aux->mp_seg[T].mem_phys -= gap_clicks; mp_aux->mp_seg[D].mem_phys -= gap_clicks; mp_aux->mp_seg[S].mem_phys -= gap_clicks; slot_number = mp_aux - mproc; sys_newmap(slot_number, mp_aux->mp_seg); } return (addr2_clicks -gap_clicks); /* dove finisce il blocco copiato */ }