Menú del dı́a Task Switch y Scheduling 1 Task Switch à la Intel 2 Task Switch a mano 3 Carga de tareas Alejandro Deymonnaz Progrmación Sistemas Operativos 14 de Abril de 2011 - 1c2011 Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 1 / 24 Sabi (PSO - DC) Task Switch à la Intel Task Switch y Scheduling 14 de Abril de 2011 2 / 24 Task Switch à la Intel Definiciones Estructura de una tarea El procesador Intel está diseñado teniendo en cuenta el concepto de tarea. En este diseño, una tarea involucra: Un TSS o Task-State Segment (valores de los registros) Estructura de una tarea El descriptor de la TSS. El selector o Task Register (TR) de la tarea actual. Segmento de código de la tarea. Segmento de datos de la tarea. Segmentos de stack de la tarea. Un directorio de tablas de página (CR3). Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 3 / 24 Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 4 / 24 Task Switch à la Intel Task Switch à la Intel Task-State Segment Task-State Segment (cont.) El estado de una tarea consiste en su memoria y los valores de sus registros. Especı́ficamente: Con todos los registros guardados en el TSS, más las páginas de memoria alcanzables desde el CR3 se define el estado de una tarea. Los 8 registros de propósito general. Selectores de segmento: cs, ss, ds, es, fs, gs Pará, pará, pará, ¿y la pila de nivel 3? En ss:esp se guarda la pila actual, que puede ser Los flags (EFLAGS), el Instruction Pointer (EIP) y un Task link. La pila de nivel 3, si la tarea se encuentra ejecutando en nivel 3. La pila de otro nivel, si la tarea se encuentra dentro de alguna interrupción. Acá la pila de nivel 3 está guardada en el stack de la interrupción. El directorio de tablas de página (CR3) Las pilas de nivel 0, 1 y 2, (ssN y espN). Task-State Segment de 32 bits Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 Sabi (PSO - DC) 5 / 24 Task Switch à la Intel Task Switch y Scheduling 14 de Abril de 2011 6 / 24 Task Switch à la Intel Preguntas Task Switch - jmp far ¿Cómo sabemos en qué nivel de privilegio está ejecutando una tarea, mirando su estado? Por el valor del RPL del selector de código cs que está en la TSS. El procesador define todo esto (TSS, etc.) porque provee una forma de hacer cambio de tareas en hardware, entre otras formas, con la instrucción jmp 1 : jmp far sel:offset Esta instrucción, dependiendo de sel hace: un far jump a un segmento de código (conforming o no). un far jump usando una Call Gate. un task switch. 1 Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 7 / 24 Vea “Far Jumps in Protected Mode” en la instrucción jmp del Volumen 2A. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 8 / 24 Task Switch à la Intel Task Switch à la Intel Task Switch - jmp far Task Switch - qué hace el procesador ¿Qué valor debe tener sel? Veamos: Un TSS o Task-State Segment es un segmento, como lo es el de código. La ejecución (etapa “execute”) de la instrucción jmp far a un descriptor de TSS hace lo siguiente: Un TSS tiene un descriptor de TSS en la GDT que lo define. Cada tarea tiene su TSS y su descriptor de TSS en la GDT. jmp far hace un cambio de tarea, si sel es un selector de un descriptor de TSS. ¿y qué valor debe tener offset? 1 Guarda los registros de la tarea actual en el TSS correspondiente. 2 El EIP en el TSS lo asigna a la instrucción siguiente al jmp far. 3 Carga los registros de la nueva tarea desde la TSS 4 Ahora la tarea actual es la nueva. En el medio, realiza los checkeos (segmentos válidos, presentes, etc) y falla en caso contrario. CUALQUIERA El valor de offset se ignora. El procesador siempre usa el segmento de TSS entero. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 9 / 24 Sabi (PSO - DC) Task Switch à la Intel Task Switch y Scheduling 14 de Abril de 2011 10 / 24 Task Switch à la Intel Task Switch - Tarea actual Task Switch - Dinámica Una única tarea utiliza el CPU en cada momento, la tarea actual, hasta que debe desalojarse por motivos como: Agotó su tiempo de CPU (proveer concurrencia sin necesidad de simultaneidad) Como está definido el concepto de tarea, existe también en el procesador la idea de la tarea actual. Se decide pasar a otra tarea de mayor prioridad (scheduler con prioridades) Se bloqueó o terminó Tarea actual La tarea actual es la que está en el descriptor de TSS apuntado por el Task Register Siempre se pasa el CPU a otra tarea. Nunca se vuelve. Si no hay más, entonces siempre hay una IDLE TASK para ejecutar. Importante: La decisión de cambiar de tarea se produce en el kernel (anillo 0). El kernel decide y el hardware hace todo el cambio de contexto. Cuando se quiera volver a ejecutar una tarea se pasa de nuevo a el TSS de esa tarea. Sigue ejecutando donde diga el EIP (la instrucción siguente al jmp far). Task Register Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 11 / 24 Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 12 / 24 Task Switch à la Intel Task Switch a mano Alternativas relacionadas Del dicho al hecho Se puede hacer un call a una tarea, lo que involucra las tareas Busy y los Task Link para poder volver a una tarea anterior. No lo vamos a usar. Se puede hacer cambio de contexto para atender interrupciones (IDT) Todo lo definido por Intel permite un control muy detallado de las tareas con ayuda del procesador. Pero... ...el uso que se le dió es más simple: Modelo de segmentación FLAT 2 . Todos los selectores de datos apuntan al mismo único segmento de datos del nivel correspondiente. Se usan sólo dos niveles de privilegio: Usuario (anillo 3) y supervisor (anillo 0), a la unidad de paginación. Habiendo pocos segmentos (acotados en cantidad), no se usa la LDT. No se usan las Call Gates, todo pasa por interrupciones. La protección de memoria se hace en la unidad de paginación. Task Gate Descriptor 2 Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 13 / 24 Vea Sección 3.2 Using Segments del Volumen 3A del manual Sabi (PSO - DC) Task Switch a mano Task Switch y Scheduling 14 de Abril de 2011 14 / 24 Task Switch a mano Situación del TSS Alternativa a la TSS De las 26 palabras obligatorias de la TSS, no se usan (son los mismos valores para todas las tareas): Una alternativa es no usar el mecanismo de cambio de tarea del procesador. ¿Cómo cambiamos la tarea entonces? Las 6 de selectores Las 4 correspondientes a stack de nivel 1 y nivel 2. “A mano”: Los valores a guardar de la tarea se salvan en el PCB (ej: cr3, esp0, ss0, etc.), o en el stack de anillo 0 de la tarea (ej: registros, EFLAGS). El Previous Task Link (PTL) El selector de LDT. Algunos registros de propósito general: varios ya son salvados por convención al entrar en la interrupción. Aprox la mitad del TSS no se usa. El cambio de tarea se hace reemplazando (con mov) los valores de los registros por los guardados en el PCB de la tarea nueva. Al volver de la interrupción (volver a anillo 3) el procesador tendrá el CR3 de la tarea nueva, con los registros restaurados de la pila nueva. Task-State Segment de 32 bits Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 15 / 24 Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 16 / 24 Task Switch a mano Task Switch a mano Ventajas vs desventajas Apagar Task Switch Desventajas: El cambio de tarea involucra muchas instruciones (mov), que requieren ser ejecutadas. Se pierde la posiblidad de usar Task Gate para interrupciones y call far. El mecanismo de task switch del procesador no se puede apagar. El procesador está diseñado para usarlo. Ejemplo: qué pasa ante una interrupción con cambio de nivel de privilegio. Ventajas: Se ahorran accesos a memoria (que harı́a el jmp far) para los registros que no cambian o ya fueron salvados (selectores, algunos de propósito general, etc.) Se ahorran accesos de los registros que no se usan (pila 1 y 2). No hay necesidad de administrar un TSS (y su descriptor en la GDT) para cada tarea. Se ahorran registros como EIP. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 Sabi (PSO - DC) 17 / 24 Task Switch a mano 14 de Abril de 2011 18 / 24 Task Switch a mano El TSS siempre está Dinámica del cambio 1 2 La pila del handler se obtiene desde el TSS actual de la tarea actual (TR). 3 Necesitamos un TSS, su descriptor y el TR. 4 Con un único TSS alcanza para todas las tareas, pero hay que guardar al momento del task switch los valores que el procesador espera encontrar allı́: la pila de anillo 0 (cada tarea tiene su pila de anillo 0). 5 6 7 8 9 10 Sabi (PSO - DC) Task Switch y Scheduling Task Switch y Scheduling 14 de Abril de 2011 19 / 24 Llega la interrupción que deriva en la necesidad de un cambio de contexto. Por convención C, el pre-handler (en Assembler) salva eax, ecx y edx si es necesario (depende si es syscall o interrupción). La única función que hace el cambio de tarea (ej: switchto) guarda los demás registros de propósito general (en la pila, o en el PCB). Algunos registros sólo se leen del PCB (ej: CR3, CS, SS, ...) Se guarda la pila de nivel 0 en el PCB. No se puede usar más la pila de la tarea anterior. Se cambia el CR3 por el de la tarea nueva. Se carga la pila de nivel 0 desde el PCB nuevo. Hay que guardar el nuevo pid en algún registro, antes de perder la pila anterior. Se desapila y/o restaura desde el PCB todos los registros. Se actualiza el TSS con los valores que el procesador espera encontrar. Se vuelve de la función switchto, ya en otro contexto. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 20 / 24 Carga de tareas Carga de tareas Inicialización Memoria Para tener tareas hay que crear las tareas. Dependiendo del mecanismo de cambio de tarea hay que realizar la inicialización correspondiente. Una nueva tarea tiene su propia memoria. Hay que reservar: páginas para el directorio de tablas de página y las tablas de página. Para el task switch à la Intel, hay que inicializar el TSS de la tarea y su descriptor con los valores de los registros. páginas para el código de la tarea. Para el otro caso, hay que inicializar los valores en el PCB (los que correspondan) y en la pila de nivel 0, como si la tarea estuviera detenida dentro de switchto dentro de alguna interrupción. páginas para la pila de nivel 3. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 21 / 24 páginas para la pila de nivel 0. Además, hay que copiar datos en muchas de esas páginas. Sabi (PSO - DC) Carga de tareas Task Switch y Scheduling 14 de Abril de 2011 22 / 24 Carga de tareas Memoria - problema Inicialización de registros Al comienzo de la tarea algunos registros que ve el usuario como eax pueden tener cualquier valor, pero otros no: Problema: La tarea se inicializa desde el anillo 0 de otra tarea. No todas las páginas fı́sicas son accesibles desde esta otra tarea (sólo los primeros 4MB). Solución: Ciertas estructuras comunes a todas las tareas (los PCB, memoria para pipes, buffers de handlers de hardware, etc) están visibles con identity mapping en todas las tareas. Las demás páginas no. Para inicializar otra tarea, mapeamos temporalmente al directorio de la tarea actual cada página que necesitemos para copiar o inicializar datos allı́ y luego la quitamos y mapeamos en su lugar definitivo del directorio de la otra tarea. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 23 / 24 Pila de nivel 3 (esp y ebp) deben apuntar a la dirección donde reservamos la pila. EFLAGS, debe tener las interrupciones habilitadas en anillo 3. Sabi (PSO - DC) Task Switch y Scheduling 14 de Abril de 2011 24 / 24