5
Linguagens de Programação
UFJF
9
Linguagens de Programação
UFJF
5
Linguagens de Programação
UFJF
8
Linguagens de Programação
UFJF
15
Linguagens de Programação
UFJF
Texto de pré-visualização
Universidade Federal de Minas Gerais Departamento de Ciência da Computação Sistemas Operacionais 20222 Trabalho Prático 1 1 Introdução Ao longo desse trabalho utilizaremos um sistema operacional de aprendizado chamado XV6 O XV6 é simples o bastante para modificar e entender em poucas semanas e ao mesmo tempo abrange os conceitos mais importantes da estrutura do UNIX Para rodálo você irá precisar de compilar os arquivos fontes e usar o emulador de processador QEMU Dica O XV6 era e ainda é desenvolvido como parte da disciplina de Sistemas Operacionais do MIT Você poderá encontrar informações úteis aqui httppdoscsailmitedu68282014xv6html Dica O XV6 também tem um manual bastante útil Esse manual irá te ajudar muito no trabalho httpspdoscsailmitedu68282018xv6xv6rev11pdf e o livro httpspdoscsailmitedu68282014xv6bookrev8pdf 2 Obtendo o XV6 Primeiramente devemos baixar o XV6 a partir do repositório no github do MIT Abra o shell no seu sistema operacional crie uma pasta para o trabalho por exemplo tp1 e acesse essa pasta mkdir tp1 cd tp1 Execute o comando abaixo git clone httpsgithubcommitpdosxv6publicgit Esse comando irá baixar o XV6 para a pasta xv6public Execute o comando a seguir para instalar o QEMU sudo apt install qemu Agora acesse a pasta xv6public e compile o XV6 com o make cd xv6public make BALEIA Para rodar o XV6 dentro do QEMU execute o comando abaixo make qemu Esse comando irá compilar o QEMU e vai iniciar automaticamente o XV6 em uma janela separada dentro do QEMU Para sair feche a janela ou digite o comando quit no emulador 3 Tarefa 1 Seu trabalho consistem em adicionar novas chamadas de sistemas no XV6 A primeira delas é a chamada trace int traceint Quando chamado com um parâmetro não zero por exemplo trace1 o rastreio de chamadas do sistema é ativado para o processo chamador apenas Cada chamada de sistema a partir desse processo deverá ser impressa para o terminal no formato descrito abaixo mostrando ID do processo nome do processo número de chamada do sistema nome da chamada do sistema Formado ID numero NOME nome do processo NUMCALL numero da chamada CALLNAME nome da chamada Quaisquer outros processos não terão as suas chamadas de sistema impressas a menos que também chamem a trace1 A chamada de trace0 desliga o rastreio para esse processo Em todos os casos a chamada de sistema de rastreio também devolve o número total de chamadas de sistema que o processo efetuou desde o seu início Crie um programa testSysCallc para testar o seu código e o adicione ao Makefile na seção EXTRA 4 Como adicionar chamadas de sistema Você precisa editar vários arquivos para adicionar uma chamada de sistema em xv6 Veja a implementação das chamadas de sistema existentes para orientação sobre como adicionar uma nova chamada de sistema Os arquivos que você precisa editar para adicionar uma nova chamada de sistema incluem userh Contém os protótipos de funções do lado do usuário de chamadas de sistema assim como funções de biblioteca de utilitários stat strcpy printf etc syscallh Este arquivo contém as definições simbólicas dos números de chamadas de sistema Você precisa definir um número único para sua chamada de sistema Certifiquese de que os números sejam consecutivos Ou seja não faltam números na seqüência Estes números são índices em uma tabela de indicadores definidos em syscallc veja o próximo item syscallc Este arquivo contém o código de entrada para o processamento da chamada ao sistema A função syscallvoid é a função de entrada para todas as chamadas de sistema Cada chamada de sistema é identificada por um número inteiro único que é colocado no registro eax do processador A função syscall verifica o inteiro para assegurar que ele está no intervalo apropriado e então chama a função correspondente que implementa essa chamada fazendo uma chamada indireta para uma função na tabela syscalls Você precisa assegurar que a função do kernel que implementa sua chamada ao sistema esteja na seqüência apropriada na matriz syscalls usysS Este arquivo contém macros para o código assembler para cada chamada de sistema Este é o código de usuário será parte de um programa em nível de usuário que é usado para fazer uma chamada de sistema A macro simplesmente coloca o número da chamada de sistema no registro eax e depois invoca a chamada de sistema Você precisa adicionar uma macro de entrada para sua chamada de sistema aqui sysprocc Esta é uma coleção de chamadas de sistema relacionadas ao processo As funções neste arquivo são chamadas do syscall Você pode adicionar sua nova função a este arquivo O estado por processo é armazenado em uma estrutura proc struct proc em proch Você precisará estender essa estrutura para acompanhar as métricas exigidas por esta atribuição Você também precisará encontrar onde a estrutura proc é alocada para que você possa garantir que os elementos sejam inicializados apropriadamente Quando você implementar sua chamada de rastreamento você precisará recuperar o parâmetro de entrada O arquivo sysprocc define algumas funções de ajuda para fazer isso As funções argint argptr e argstr recuperam o nésimo argumento de chamada de sistema como um número inteiro ponteiro ou uma string argint usa o registro esp para localizar o argumento pontos esp no endereço de retorno para o stub de chamada do sistema 5 Tarefa 2 Agora você vai adicionar outra chamada de sistema ao xv6 Esta é chamada de cs int csvoid que retorna o número de trocas de contexto que aconteceram no processo desde seu início A implementação exigirá manter um contador adicional na estrutura do processo Para testálo tente o código de acordo com as linhas abaixo no programa teste Adicione computações inúteis para avaliar diversos cenários int cs1 cs2 cs3 cs4 cs1 cs cs2 cs sleep4 cs3 csinfo sleep6 cs4 csinfo printf1 context switch counts d d d d cs1 cs2 cs3 cs4 Os valores de cs1 e cs2 geralmente serão os mesmos já que normalmente não haverá uma mudança de contexto entre eles Como uma mudança de contexto pode ocorrer em um momento arbitrário é possível que o cs2 possa ser maior que o cs1 mas é claro que nunca será mais que isso A chamada de sleep definitivamente colocará o processo para dormir 4 e 6 segundos portanto o cs3 será um maior que o cs2 e o cs4 será um maior que o cs3 6 Entrega Esse trabalho poderá ser feito em dupla e entregue via Moodle Seu grupo deverá submeter no moodle um único arquivo no formato zip contendo o código fonte do XV6 pasta xv6public e relatório Lembrese de executar make clean antes de compactar o código fontes Você também precisa escrever um relatório pdf contendo nomes dos componentes do grupo explicando as alterações feitas e apresentando os resultados das execuçõestestes 7 Esclarecimentos 1 Leia o manual do XV6 2 Não deixe para fazer esse trabalho na última hora Comece a fazêlo o quanto antes 3 Bom trabalho a todos
5
Linguagens de Programação
UFJF
9
Linguagens de Programação
UFJF
5
Linguagens de Programação
UFJF
8
Linguagens de Programação
UFJF
15
Linguagens de Programação
UFJF
Texto de pré-visualização
Universidade Federal de Minas Gerais Departamento de Ciência da Computação Sistemas Operacionais 20222 Trabalho Prático 1 1 Introdução Ao longo desse trabalho utilizaremos um sistema operacional de aprendizado chamado XV6 O XV6 é simples o bastante para modificar e entender em poucas semanas e ao mesmo tempo abrange os conceitos mais importantes da estrutura do UNIX Para rodálo você irá precisar de compilar os arquivos fontes e usar o emulador de processador QEMU Dica O XV6 era e ainda é desenvolvido como parte da disciplina de Sistemas Operacionais do MIT Você poderá encontrar informações úteis aqui httppdoscsailmitedu68282014xv6html Dica O XV6 também tem um manual bastante útil Esse manual irá te ajudar muito no trabalho httpspdoscsailmitedu68282018xv6xv6rev11pdf e o livro httpspdoscsailmitedu68282014xv6bookrev8pdf 2 Obtendo o XV6 Primeiramente devemos baixar o XV6 a partir do repositório no github do MIT Abra o shell no seu sistema operacional crie uma pasta para o trabalho por exemplo tp1 e acesse essa pasta mkdir tp1 cd tp1 Execute o comando abaixo git clone httpsgithubcommitpdosxv6publicgit Esse comando irá baixar o XV6 para a pasta xv6public Execute o comando a seguir para instalar o QEMU sudo apt install qemu Agora acesse a pasta xv6public e compile o XV6 com o make cd xv6public make BALEIA Para rodar o XV6 dentro do QEMU execute o comando abaixo make qemu Esse comando irá compilar o QEMU e vai iniciar automaticamente o XV6 em uma janela separada dentro do QEMU Para sair feche a janela ou digite o comando quit no emulador 3 Tarefa 1 Seu trabalho consistem em adicionar novas chamadas de sistemas no XV6 A primeira delas é a chamada trace int traceint Quando chamado com um parâmetro não zero por exemplo trace1 o rastreio de chamadas do sistema é ativado para o processo chamador apenas Cada chamada de sistema a partir desse processo deverá ser impressa para o terminal no formato descrito abaixo mostrando ID do processo nome do processo número de chamada do sistema nome da chamada do sistema Formado ID numero NOME nome do processo NUMCALL numero da chamada CALLNAME nome da chamada Quaisquer outros processos não terão as suas chamadas de sistema impressas a menos que também chamem a trace1 A chamada de trace0 desliga o rastreio para esse processo Em todos os casos a chamada de sistema de rastreio também devolve o número total de chamadas de sistema que o processo efetuou desde o seu início Crie um programa testSysCallc para testar o seu código e o adicione ao Makefile na seção EXTRA 4 Como adicionar chamadas de sistema Você precisa editar vários arquivos para adicionar uma chamada de sistema em xv6 Veja a implementação das chamadas de sistema existentes para orientação sobre como adicionar uma nova chamada de sistema Os arquivos que você precisa editar para adicionar uma nova chamada de sistema incluem userh Contém os protótipos de funções do lado do usuário de chamadas de sistema assim como funções de biblioteca de utilitários stat strcpy printf etc syscallh Este arquivo contém as definições simbólicas dos números de chamadas de sistema Você precisa definir um número único para sua chamada de sistema Certifiquese de que os números sejam consecutivos Ou seja não faltam números na seqüência Estes números são índices em uma tabela de indicadores definidos em syscallc veja o próximo item syscallc Este arquivo contém o código de entrada para o processamento da chamada ao sistema A função syscallvoid é a função de entrada para todas as chamadas de sistema Cada chamada de sistema é identificada por um número inteiro único que é colocado no registro eax do processador A função syscall verifica o inteiro para assegurar que ele está no intervalo apropriado e então chama a função correspondente que implementa essa chamada fazendo uma chamada indireta para uma função na tabela syscalls Você precisa assegurar que a função do kernel que implementa sua chamada ao sistema esteja na seqüência apropriada na matriz syscalls usysS Este arquivo contém macros para o código assembler para cada chamada de sistema Este é o código de usuário será parte de um programa em nível de usuário que é usado para fazer uma chamada de sistema A macro simplesmente coloca o número da chamada de sistema no registro eax e depois invoca a chamada de sistema Você precisa adicionar uma macro de entrada para sua chamada de sistema aqui sysprocc Esta é uma coleção de chamadas de sistema relacionadas ao processo As funções neste arquivo são chamadas do syscall Você pode adicionar sua nova função a este arquivo O estado por processo é armazenado em uma estrutura proc struct proc em proch Você precisará estender essa estrutura para acompanhar as métricas exigidas por esta atribuição Você também precisará encontrar onde a estrutura proc é alocada para que você possa garantir que os elementos sejam inicializados apropriadamente Quando você implementar sua chamada de rastreamento você precisará recuperar o parâmetro de entrada O arquivo sysprocc define algumas funções de ajuda para fazer isso As funções argint argptr e argstr recuperam o nésimo argumento de chamada de sistema como um número inteiro ponteiro ou uma string argint usa o registro esp para localizar o argumento pontos esp no endereço de retorno para o stub de chamada do sistema 5 Tarefa 2 Agora você vai adicionar outra chamada de sistema ao xv6 Esta é chamada de cs int csvoid que retorna o número de trocas de contexto que aconteceram no processo desde seu início A implementação exigirá manter um contador adicional na estrutura do processo Para testálo tente o código de acordo com as linhas abaixo no programa teste Adicione computações inúteis para avaliar diversos cenários int cs1 cs2 cs3 cs4 cs1 cs cs2 cs sleep4 cs3 csinfo sleep6 cs4 csinfo printf1 context switch counts d d d d cs1 cs2 cs3 cs4 Os valores de cs1 e cs2 geralmente serão os mesmos já que normalmente não haverá uma mudança de contexto entre eles Como uma mudança de contexto pode ocorrer em um momento arbitrário é possível que o cs2 possa ser maior que o cs1 mas é claro que nunca será mais que isso A chamada de sleep definitivamente colocará o processo para dormir 4 e 6 segundos portanto o cs3 será um maior que o cs2 e o cs4 será um maior que o cs3 6 Entrega Esse trabalho poderá ser feito em dupla e entregue via Moodle Seu grupo deverá submeter no moodle um único arquivo no formato zip contendo o código fonte do XV6 pasta xv6public e relatório Lembrese de executar make clean antes de compactar o código fontes Você também precisa escrever um relatório pdf contendo nomes dos componentes do grupo explicando as alterações feitas e apresentando os resultados das execuçõestestes 7 Esclarecimentos 1 Leia o manual do XV6 2 Não deixe para fazer esse trabalho na última hora Comece a fazêlo o quanto antes 3 Bom trabalho a todos