Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
| ppos-v2:trocas_de_contexto [2026/02/24 17:25] – [Tarefa] maziero | ppos-v2:trocas_de_contexto [2026/07/30 19:24] (atual) – [Tarefa] maziero | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | ====== Trocas de contexto ====== | ||
| + | |||
| + | Este projeto faz parte do [[PPOS-v2: | ||
| + | |||
| + | Implementar tarefas simultâneas dentro de um processo de usuário não é uma tarefa difícil, embora alguns detalhes de baixo nível possam assustar os iniciantes, como a manipulação de registradores para as trocas de contexto. | ||
| + | |||
| + | Este projeto visa explicar o funcionamento básico das trocas de contexto, usando uma pequena **biblioteca de trocas de contexto** em modo usuário. Essa biblioteca foi escrita em linguagem de máquina, pois a manipulação direta de registradores é difícil de fazer em linguagens de alto nível. | ||
| + | |||
| + | <note important> | ||
| + | A biblioteca usada é específica para processos Linux executando em processadores Intel/AMD de 64 bits. Sua execução em outros ambientes exige diversas adaptações. O padrão POSIX definiu uma biblioteca portável para trocas de contexto em modo usuário, chamada [[https:// | ||
| + | </ | ||
| + | |||
| + | ===== Tarefa ===== | ||
| + | |||
| + | * Estude o conteúdo dos arquivos em {{ context.tgz |}}: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Compile e execute o programa ('' | ||
| + | * Explique o objetivo da estrutura '' | ||
| + | * Explique o objetivo e os parâmetros das funções definidas em '' | ||
| + | * Explique cada linha do código de teste que chame uma dessas funções. | ||
| + | * Para visualizar melhor as trocas de contexto, desenhe o [[so: | ||
| + | |||
| + | <note important> | ||
| + | A depuração passo a passo desse código com o '' | ||
| + | </ | ||
| + | |||
| + | ===== A entregar ===== | ||
| + | |||
| + | =) Nada! | ||
| + | |||
| + | :-D Basta estudar e entender o código da biblioteca e do teste... | ||
| + | |||
| + | ===== Curiosidade ===== | ||
| + | |||
| + | Trocas de contexto são implementadas dentro do núcleo, por código sucinto mas geralmente complexo. Veja um [[https:// | ||
| + | |||
| + | <code c> | ||
| + | /* | ||
| + | * Switch to stack of the new process and set up | ||
| + | * his segmentation registers. | ||
| + | */ | ||
| + | retu(rp-> | ||
| + | sureg(); | ||
| + | /* | ||
| + | * If the new process paused because it was | ||
| + | * swapped out, set the stack level to the last call | ||
| + | * to savu(u_ssav). | ||
| + | * which is executed immediately after the call to aretu | ||
| + | * actually returns from the last routine which did | ||
| + | * the savu. | ||
| + | * | ||
| + | * You are not expected to understand this. < | ||
| + | */ | ||
| + | if(rp-> | ||
| + | rp-> | ||
| + | aretu(u.u_ssav); | ||
| + | } | ||
| + | /* | ||
| + | * The value returned here has many subtle implications. | ||
| + | * See the newproc comments. | ||
| + | */ | ||
| + | return(1); | ||
| + | </ | ||
| + | |||
| + | ===== Outras informações ===== | ||
| + | |||
| + | * Duração estimada: 2 horas. | ||