XV6
|
|
Título del Test:
![]() XV6 Descripción: Test xv6 de ASO |



| Comentarios |
|---|
NO HAY REGISTROS |
|
En xv6, ¿qué devuelve la llamada a la función walkpgdir(pgdir , va , 0)?: En caso de éxito, devuelve la dirección virtual correspondiente a la dirección física del marco de página donde se mapea va. En caso de éxito, devuelve la dirección virtual correspondiente a la dirección física de la entrada de la tabla de páginas (nivel 2) donde se mapea va. En caso de éxito, devuelve la dirección de memoria física de la entrada del directorio de páginas (nivel 1) donde se mapea va. En xv6, el cambio de proceso... Se realiza cuando el proceso origen ejecuta la función swtch() con el contexto del proceso destino como parámetro. Se realiza ejecutando la función scheduler(). Se realiza usando swtch() para hacer un cambio de contexto al hilo del scheduler y, posteriormente, otro del scheduler al proceso seleccionado. En xv6, La gestión de la memoria libre: Se implementa en el primer mega de memoria, al inicio del kernel. Se implementa mediante una tabla estática global junto con su correspondiente cerrojo. Se implementa mediante una lista ligada usando como nodos los mismos marcos físicos libres. En xv6, la reserva del espacio de memoria virtual para la pila en modo usuario se realiza en la función del núcleo: fork(). exec(). allocproc(). En xv6, La función switchuvm(p): Hace que la CPU pase a utilizar la tabla de páginas del proceso p. Guarda en el struct proc del proceso p la tabla de páginas. Rellena la zona de memoria virtual del proceso p dedicada al usuario. En xv6, para dar de alta una llamada al sistema nueva, ¿qué fichero NO hay que modificar?: syscall.h. usys.S. sysproc.h. En xv6, la función argptr(1, a, 16): Devuelve en la variable a la que apunta a el argumento 1 de la llamada al sistema en curso, que es un array de 16 enteros. Devuelve en la variable a la que apunta a el argumento 1 de la llamada al sistema en curso. Dicho argumento es un puntero a un bloque de 16 bytes. Devuelve en la variable a la que apunta a el argumento 16 de la llamada al sistema en curso. Dicho argumento es un puntero a un bloque de 1 byte. La macro P2V(n): Convierte el número n, que representa una dirección física, en una dirección virtual que apunta a dicha dirección física sumándole la constante 0x80000000. Convierte el número n, que representa una dirección virtual, en la dirección física a la que apunta, restándole la constante 0x8000000. Convierte el número n, que representa una dirección física en la zona de usuario a una dirección física en la zona del kernel, sumándole la constante 0x80000000. ¿Cuál de las siguientes operaciones extraería el número de página física de una entrada PTE de la tabla de páginas de Intel?. (PTE << 12) & 0xFFFF. (PTE >> 20) & 0xFFF. (PTE >> 12) & 0xFFFF. ¿Cuál de las siguientes direcciones sería el valor que se asignaría al registro CR3 del i386 en el sistema operativo xv6 al cambiar de proceso?. myproc()->pgdir. V2P(myproc()->pgdir). P2V(myproc()->pgdir). En xv6, ¿qué devuelve la llamada a la función walkpgdir(pgdir , va , 0) ?: En caso de éxito, devuelve la dirección virtual correspondiente a la dirección física del marco de página donde se mapea va. En caso de éxito, devuelve la dirección virtual correspondiente a la dirección física de la entrada de la tabla de páginas (nivel 2) donde se mapea va. En caso de éxito, devuelve la dirección de memoria física de la entrada del directorio de páginas (nivel 1) donde se mapea va. Indica cuál de las siguientes a rmaciones es CIERTA con respecto a la versión de la llamada que se pide en la práctica: Devuelve el valor de myproc()->sz después de la actualización. Debe devolver un error si se pide tanta memoria que alcanza el límite del kernel (KERNBASE). Tanto si aumenta el tamaño como si disminuye, es imprescindible ejecutar lcr3(V2P(curproc->pgdir)); para limpiar el TLB. En xv6, La función switchuvm(p) : Hace que la CPU pase a utilizar la tabla de páginas del proceso p. Guarda en el struct proc del proceso p la tabla de páginas. Rellena la zona de memoria virtual del proceso p dedicada al usuario. ¿Qué comprueba la condición (tf->cs && 3) == 0 en el fichero trap.c ?: Si es cierta, quiere decir que no hay ningún proceso creado y por tanto estamos arrancando el sistema operativo. Se usa para comprobar si al trap se procede de código en modo usuario o modo núcleo. Si es cierta, quiere decir que el proceso que se está ejecutando es el init y por tanto no debería producir excepciones. En xv6, la función argptr(1, a, 16) : Devuelve en la variable a la que apunta a el argumento 1 de la llamada al sistema en curso, que es un array de 16 enteros. Devuelve en la variable a la que apunta a el argumento 1 de la llamada al sistema en curso. Dicho argumento es un puntero a un bloque de 16 bytes. Devuelve en la variable a la que apunta a el argumento 16 de la llamada al sistema en curso. Dicho argumento es un puntero a un bloque de 1 byte. En la llamada al sistema setprio(pid, prioridad) y en las condiciones de la implementación del planificador de múltiples colas de la práctica, ¿cuál de las siguientes afirmaciones es cierta?: Solo se puede cambiar la prioridad de un proceso que esté en estado RUNNABLE. Un proceso que se encuentra en estado SLEEP, puede cambiar su propia prioridad. Si un proceso está en estado RUNNING y cambia su prioridad, solo tendrá efecto cuando cambie a estado RUNNABLE. En xv6, ¿para qué sirve el argumento opcion de la función walkpgdir(pgdir , va , opcion) que puede ser 0 o 1?: Decide si se creará el segundo nivel de la tabla de páginas si no existe antes de devolver el puntero a la entrada correspondiente a la página de va . Decide si se devuelve la dirección de memoria virtual de la entrada del segundo nivel correspondiente a la página de va o directamente el contenido de dicha entrada de la tabla . En caso de éxito, devuelve la dirección de memoria física o la dirección de memoria virtual (dependiendo de si es 0 o 1) de la entrada del directorio de páginas (nivel 1) donde se mapea va . En xv6, la función que proporciona memoria al propio sistema operativo para sus estructuras internas es kalloc(), pero ¿qué devuelve?: Devuelve la dirección física de una página física libre. Devuelve la dirección virtual de una página física libre. Devuelve la dirección virtual más baja de la zona de memoria virtual reservada para el kernel. Indica cuál de las siguientes afirmaciones es VERDADERA respecto a la implementación del planificador de procesos de múltiples colas que se pidió en las prácticas: La llamada setprio() no puede cambiar la prioridad de un proceso que está SLEEPING. Cuando se le da la CPU a un proceso de una cierta prioridad, al devolver la CPU al scheduler, este mira si hay más procesos en la misma lista de prioridad y, si hay, le dará la CPU al siguiente de esa lista. Un proceso que se está ejecutando puede cambiar su propia prioridad. Indica cuál de las siguientes a rmaciones es CIERTA con respecto a la versión de la llamada sys_sbrk() que se pide en la práctica: Devuelve el valor de myproc()->sz antes de la actualización. Debe devolver un error si se pide tanta memoria que supera el valor myproc()->sz. Tanto si aumenta el tamaño como si disminuye, es imprescindible ejecutar lcr3(V2P(curproc->pgdir)); para limpiar el TLB. En xv6, ¿qué realiza la llamada a la función allocproc() ?: Recibe como parámetro la cantidad de memoria virtual que queremos añadir al proceso, y reserva páginas hasta alcanzar ese valor. Devuelve el puntero al comienzo de la zona reservada. Localiza una entrada libre en la tabla de procesos y la inicializa, asignándole un nuevo PID y configurando su pila. Pone el proceso en estado RUNNABLE. Devuelve el puntero a la entrada creada. Localiza una entrada libre en la tabla de procesos y la inicializa, asignándole un nuevo PID y configurando su pila. Pone el proceso en estado EMBRYO. Devuelve el puntero a la entrada creada. La llamada dup2 que habéis implementado clase de prácticas... Utiliza argfd() para leer de la pila los dos descriptores que recibe como parámetros. Utiliza argfd() para leer de la pila el descriptor que se va a duplicar, y donde se duplicará. Utiliza argfd() para leer de la pila el descriptor que se va a duplicar, y argptr() para leer el descriptor donde se duplicará. Indica cuál de las siguientes descripciones es una forma de calcular el valor que devuelve la llamada alsistema phmem() que se ha implementado en esta convocatoria. Contabiliza el número de páginas que tiene la lista de páginas físicas de memoria disponibles, multiplicándolo por el tamaño de página en KB. Recibe como parámetro un PID y recorre la tabla de páginas del proceso contabilizando las entradas que tienen una página física mapeada, multiplicando ese valor por el tamaño de página en KB. Recibe como parámetro un PID y recorre la tabla de páginas del proceso contabilizando el número de entradas que hay disponibles aún sin mapear. Después multiplica ese valor por el tamaño de página en KB. Indica cuál de las siguientes afirmaciones es FALSA respecto a la implementación del planificador de procesos de múltiples colas que se pidió en las prácticas: Si un proceso pasa al estado SLEEPING, se saca de la cola correspondiente. Un proceso puede cambiar su propia prioridad esté en el estado que esté (RUNNING, RUNNABLE o SLEEPING). La prioridad de un proceso que se encuentra en estado SLEEPING solo puede ser cambiada por otro proceso. En algunos lugares de la función trap() se comprueba si la siguiente expresión booleana es cierta: (tf->cs&3) == 0 . ¿Qué significa que dicha comprobación sea verdadera?. Que el código que se estaba ejecutando cuando se produjo el trap era del kernel. Que el código que se estaba ejecutando cuando se produjo el trap era de usuario. Que no se está ejecutando ningún proceso en el sistema, y estamos arrancando o apagando el sistema operativo. Tras implementar la modificación de las funciones exit/wait que se pide en las prácticas, si en la función trap() se decide matar a un proceso, indica cuál de las siguientes afirmaciones es correcta: Se ejecutará una llamada a la función exit() pasándole como parámetro 1 más el número de la excepción que ha provocado la muerte del proceso. Se ejecutará una llamada a la función exit() pasándole como parámetro 1 más el número de la excepción que ha provocado la muerte del proceso desplazado este valor 8 bits a la izquierda. Se ejecutará una llamada a la función kill() ya que exit() se usa solamente en el código de usuario para salir del programa, no en el kernel en casos excepcionales. Cuando se produce una excepción por fallo de página en xv6 modificado para aceptar asignación de páginas físicas bajo demanda, cuál de los siguientes métodos para detectar que un proceso ha accedido a la página de guarda NO es correcto: Comprobar el bit PTE_P del valor tf->err , que indicará si la excepción se ha producido por una página no mapeada o por una violación de protección de memoria. Comprobar si la página correspondiente al valor que devuelve crc2() coincide con la página de guarda, que tendrá que almacenarse en algún lugar adecuado, como puede ser la estructura de datos del proceso. Comprobar si la dirección de memoria que ha provocado el fallo de página coincide con la página que hay justo encima de la página donde se encuentra el puntero de pila tf->esp al producirse la excepción. ¿Cuándo se llama a la función del planificador scheduler() ?. Cuando un proceso pasa al estado SLEEPING para cederle la CPU a otro proceso en estado RUNNABLE. Cuando un proceso pasa de estado RUNNABLE a RUNNING, para que empiece a ejecutarse. Nunca se llama a la función scheduler() porque es un hilo. A scheduler() se llega con un cambio de contexto dentro del kernel. Supongamos que tprio es la tabla de listas de prioridades del planificador que se ha implementado en las prácticas, donde cada entrada es una estructura de dos campos ( primero y ultimo ) implementadas con punteros a entradas struct proc . Si queremos insertar un proceso struct proc *p en su lista correspondiente, ¿cuál de los siguientes códigos sería una implementación válida?. p->siguiente = NULL; if (tprio[p->prioridad].primero) tprio[p->prioridad].ultimo->siguiente = p; else tprio[p->prioridad]->primero = p; tprio[p->prioridad]->ultimo = p;. p->siguiente = NULL; if (tprio[p->prioridad].ultimo) tprio[p->prioridad].primero->siguiente = p; else tprio[p->prioridad]->ultimo = p; tprio[p->prioridad]->primero = p;. p->siguiente = NULL; if (tprio[p->prioridad].primero) p->siguiente = tprio[p->prioridad].primero; tprio[p->prioridad].primero = p; else tprio[p->prioridad]->primero = p; tprio[p->prioridad]->ultimo = p;. ¿Qué comprueba la condición (tf->cs && 3) == 0 en el chero trap.c ?. Si es cierta, quiere decir que no hay ningún proceso creado y por tanto estamos arrancando el sistema operativo. Se usa para comprobar si al trap se procede de código en modo usuario o modo núcleo. Si es cierta, quiere decir que el proceso que se está ejecutando es el init y por tanto no debería producir excepciones. En xv6, la función argptr(1, a, 16) : Devuelve en la variable a la que apunta a el argumento 1 de la llamada al sistema en curso, que es un array de 16 enteros. Devuelve en la variable a la que apunta a el argumento 1 de la llamada al sistema en curso. Dicho argumento es un puntero a un bloque de 16 bytes. Devuelve en la variable a la que apunta a el argumento 16 de la llamada al sistema en curso. Dicho argumento es un puntero a un bloque de 1 byte. En xv6, ¿para qué sirve el argumento opcion de la función walkpgdir(pgdir , va , opcion) que puede ser 0 o 1?: Decide si se creará el segundo nivel de la tabla de páginas si no existe antes de devolver el puntero a la entrada correspondiente a la página de va . Decide si se devuelve la dirección de memoria virtual de la entrada del segundo nivel correspondiente a la página de va o directamente el contenido de dicha entrada de la tabla . En caso de éxito, devuelve la dirección de memoria física o la dirección de memoria virtual (dependiendo de si es 0 o 1) de la entrada del directorio de páginas (nivel 1) donde se mapea va . Indica cuál de las siguientes afirmaciones es VERDADERA respecto a la implementación del planificador de procesos de múltiples colas que se pidió en las prácticas: La llamada setprio() no puede cambiar la prioridad de un proceso que está SLEEPING. Cuando se le da la CPU a un proceso de una cierta prioridad, al devolver la CPU al scheduler, este mira si hay más procesos en la misma lista de prioridad y, si hay, le dará la CPU al siguiente de esa lista. Un proceso que se está ejecutando puede cambiar su propia prioridad. |





