Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Driver Disco
Driver Disco
/* Descriptores de dispositivos */ struct dd { char nombre_driver[80]; struct cola cola_driver; int sema_driver; ... } drivers[MAX_DDS];
/* Definiciones para el driver de disco */ #define DRIVER_DISCO ... int estado_disco[N_DISCOS]; const int unidad DRIVE_HD; int cilindro_actual; /* IORBs */ struct iorb { struct item elemento_cola; int pid; int operacion; /* LEER, ESCRIBIR, ... */ int IO_dir; char *pbuff; int longitud; int evento; /* semforo donde esperar respuesta */ int diagnostico; /* a rellenar por el driver */ } peticiones[MAX_IORBS]; /* Rutina de E/S: */ int peticion_disco (int op, int bloque, char *pbuff, int ev) { int id, r; struct iorb *pet; id= quiensoy_nuc(); pet= reservar_iorb(); pet->pid= id; pet->operacion= op; pet->IO_dir= bloque; pet->pbuff= pbuff; pet->evento= ev; encolar_iorb(&drivers[DRIVER_DISCO].cola_driver, pet); signal_nuc(drivers[DRIVER_DISCO].sema_driver); wait_nuc(ev); r= pet->diagnostico; liberar_iorb(pet); return(r); }
/* El driver */ driver_disco() { struct iorb *pet; int cilindro, pista, sector, i, e= OK; inicializar_cola(&drivers[DRIVER_DISCO].cola_driver); encender_motor_nuc(unidad); recalibrar_nuc(unidad); while (1) { wait_nuc(drivers[DRIVER_DISCO].sema_driver); if (estado_disco[unidad]==PARADO) encender_motor_nuc(unidad); tomar_peticion(&drivers[DRIVER_DISCO].cola_driver, pet); traducir(pet->IO_dir, &cilindro, &pista, §or); if (cilindro != cilindro_actual) e= posicionar_cilindro_nuc(unidad, cilindro); if (e != ERROR_POSICIONAR) { cilindro_actual= cilindro; switch (pet->operacion) { case LEER_DISCO: e= leer_sector_nuc(unidad, pista, sector, pet->pbuf); break; case ESCRIBIR_DISCO: e= escribir_sector_nuc(unidad, pista, sector, pet->pbuf); break; } pet->diagnostico= e; } signal_nuc(pet->evento) } }