Está en la página 1de 2

Sistemas Operativos 2 (ITIS)

Tema 5, Ejercicio 6: Driver de disco sencillo


Alberto Lafuente, Dep. ATC Universidad del Pas Vasco Euskal Herriko Unibertsitatea

/* Descriptores de dispositivos */ struct dd { char nombre_driver[80]; struct cola cola_driver; int sema_driver; ... } drivers[MAX_DDS];

/* cola donde encolar la peticin */ /* semforo donde sealar la peticin */

/* 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); }

/* PARADO, TRANSITORIO, EN_MARCHA */

SO2 Clases prcticas: Cdigo de E/S sobre disco


/* Declaracin de primitivas del ncleo */ int int int int int int int int int quiensoy_nuc(); wait_nuc(int semaforo); signal_nuc(int semaforo); encender_motor_nuc (int unidad); apagar_motor_nuc (int unidad); posicionar_cilindro_nuc (int unidad, int cilindro); leer_sector_nuc (int unidad, int pista, int sector, char *buff); escribir_sector_nuc (int unidad, int pista, int sector, char *buff); recalibrar_nuc (int unidad);

/* 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, &sector); 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) } }

También podría gustarte