Curso sistemas operacionais 2008 Programação aula a aula. 05/5 1 - 1.1 O que é um sistema operacional, 1.2 História dos sistemas operacionais 06/5 2 - Visao do hardware 1.3 conceitos de sistema operacional 12/5 3 - 1.3 conceitos de sistema operacional; 1.4 chamadas de sistema 13/5 4 - 1.4 chamadas de sistema 1.5 estrutra do sistema operacional. 19/5 5 => apresentação dos projetos (fase 1) 20/5 6 - apresentação dos projetos (fase 1) 26/5 - SEM AULA - congresso USP 27/5 02/6 7 - 2.1 introdução aos processos 03/6 8 - 2.2 comunicação interprocesso 09/6 9 - 2.3 problemas clássicos de CIP 10/6 10 - 2.4 agendamento de processo. 16/6 11 => Projetos 2.5 visão geral de processos em minix (fase 2) 17/6 12 => Projetos 2.5 visão geral de processos em minix (fase 2) 23/6 13 => Projetos 2.5 visão geral de processos em minix (fase 2) 24/6 prova 1 30/6 14 - 3.1 Hardware Entrada e Saida 3.2 Software Entrada e Saida 15 - 3.2 Software Entrada e Saida 01/7 16 - 3.3 impasses 07/7 17 - 4.1 gerenciamento básico de memória 4.2 troca (swap) 08/7 18 - 4.3 memória virtual, 4.4 algoritmos de substituição de página. 14/7 19 => Projetos 3.4 visão geral de E/S no minix (fase 3) 15/7 20 => Projetos 3.4 visão geral de E/S no minix (fase 3) 21/7 21 - 4.4, 4.5 questões para sistemas de paginação. 22/7 22 - 4.6 segmentação 28/7 21 => Projetos 4.7 visão geral do gerenciamento de memória do minix (fase 4) 29/7 21 => Projetos 4.7 visão geral do gerenciamento de memória do minix (fase 4) 04/8 22 - 5.1 arquivos 5.2 diretórios 05/8 23 - 5.3 implementação do sistema de arquivos 11/8 24 - Minix filesystem <- (5.4 segurança, 5.5 mecanismos de proteção) 12/8 25 => Projetos 5.6 visão geral do sistema de arquivos minix (fase 5) 18/8 26 Prova 2. 19/8 25 => Projetos 5.6 visão geral do sistema de arquivos minix (fase 5) Livro texto: Sistemas Operacionais - Projeto e Implementação ; Tanenbaum A.S. Woodhull A.S.; Bookman terceira edição Obs: Este livro contém o Minix que serviu de base para a criação do Linux, mas a versão atual é a 3.0. Bons Livros de apoio: - Sistemas Operacionais Modernos 2a. edição; Tanenbaum A.S.; Prentice Hall Obs: Este livro é muito parecido com "Projeto e Implementação" mas não contém o Minix. Por outro lado é mais didático e contém mais informação que o outro. - Sistemas Operacionais com Java; Silberschatz, Galvin, Gane; Editora Campus Obs: Este livro apresenta os conceitos de forma mais clara que os livros do Tanenbaum. avaliação: 3 P1 + 4 P2 + E + 2 P E = exercícios feitos em aula / vale mais contar presença. Projeto 1. familiarização com o Minix: (todos) - instalação - sugestão: usar o Linux/ubuntu + (Boochs,qemu) (um por grupo) - criar aplicativos na linguagem C para rodar no minix utilizando as chamadas do sistema operacional. 1- programa que concatena dois arquivos. Entrada: o nome dos dois arquivos. Saida: o arquivo concatenado resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-anaue-altert-SO-Relatorio-projeto1.1.doc 10 2- programa que imprime os nomes e datas dos arquivos no diretório corrente. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-Bruno,Carol,Davi.pdf 10 3- programa que cria um processo pai e outro filho. O pai escreve continuamente uma string e o filho escreve continuamente outra string. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-fabiokatsumi-fabiohideki-Trabalho Grupo3.rar 10 4- troca o nome dos arquivos de um diretório colocando a string "L" na frente. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-flavio.doc 10 5- Estude o código fonte do comando passwd. Quais são os arquivos que ele manipula? O que é o shadow? Troca o password de um usuário resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-Helio-flavio-relatorio.doc 10 6- programa que escreve "teclou ^C" toda vez que o usuário digitar control-C. O programa deve capturar o signal SIGINT. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-marcio-marcelo-SOproj1.doc 10 7- programa que imprime uma mensagem e depois de 1 segundo imprime outra mensagem. Para isso faz uso de um signal. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/p1-Nathalia-Projeto1.tar.gz 10 8 - Estude o código fonte do comando passwd - que troca o password. Quais são as system calls que ele chama? Em particular, explique as system calls que alteram o user. Exemplo: vamos supor que você esteja logado como user joao. Ao rodar o comando passwd, ele passa a rodar com o poder de outro user (no caso o root). Como isso acontece? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-pedrodaquino.pdf 10 9 - Estude o código fonte do comando ps - que apresenta os processos rodando. Como o comando ps tem conhecimento dos processos que estão rodando? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/p1-rafRuppel-grupo9_kinoshita_v2.doc 10 10 - Estude o código fonte do comando kill - que mata um processo rodando; ou melhor que envia um signal para um processo rodando. Quais são system calls que o comando chama? Rode o programa que a equipe 6 desenvolveu e que captura o ^C, mas ao invés de digitar ^C, envie um signal com o comando kill para causar o signal SIGINT. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-renan_weffort_mielle.doc 10 11 - O processo init faz a inicialização do minix. Estude seu código fonte. Qual o pid do processo init? O que acontece se você tentar matar o "init"? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-VictorFujita.zip 10 12 - Estude o código fonte do comando shutdown. O que ele faz? Quais são as system calls chamadas? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-Yuri.doc 10 13 - Crie um outro user no minix. Qual comando você usou. Estude e explique o código fonte. Quais são as system calls usadas nesse código? 1.3 (Todos) - Escolha uma system call que foi chamada em seu programa. Altere a system call de forma a imprimir uma mensagem toda vez que ela for chamada. Entregar: Relatório com: - objetivo - estudo a ser feito para se criar o programa ou fazer uma experiência. - programa explicado (todas as equipes devem fazer um programa que altera uma das system calls, além do que é proposto no exercício.). - cópias das telas do emulador mostrando o programa rodando. Apresentação com powepoint e telas da saída do emulador. Projeto 2 Processos. O código do minix 3 está alterado em relação ao minix 1 e 2. O objetivo desse trabalho é estudar o código fonte do minix 3. Estude o código do minix 3 (/usr/src/). Responde (geralmente observando /usr/src/kernel): 1 - Estude e explique o item 2.6.6 do livro - Inicialização do minix 3. Altere a inicialização para que o minix inicialize com apenas dois terminais: ttyc1 e ttyc2. Onde está o programa que faz o boot do sistema operacional? Como ele carrega o minix? Onde está a imagem do minix? Quais processos estão na imagem do minix? É viável alterar o programa de boot para que ao invés de carregar o minix, ele simplesmente imprima uma mensagem? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-brunokohn.doc 8 2 - Estude e explique o item 2.6.5 do livro. Em particular, explique a tabela de processos (o que é armazenado - registradores, pid, etc.) e a fila de processos. Explique as filas dos processos prontos para rodar e qual o "time slice" associado. Os drivers possuem um grande de tempo de chaveamento. Introduza um erro em um driver qualquer fazendo com que ele entre em um loop infinito. "Mate" o driver com o loop infinito. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-brunogrisi.zip 10 3 - ex. 50 livro - Modifique o MINIX3 para reunir estatísticas sobre as mensagens enviadas por quem e para quem, e escreva um programa para reunir e imprimir essas estatísticas de uma maneira útil. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2_emilio_fabiogutiyama_fabiokatsumi.zip -> deveria ter alterado o tratamento de mensagens no kernel. 6 4 - Estude e explique o item 2.6.5 do livro. Em particular estude a tabela de privilégios que aparece quando se tecla F4. Por essa tabela é possível que algum processo de usuário envie uma mensagem para algum driver? Crie um processo de usuário que tenta enviar uma mensagem para um driver (dica: estude como o fm gera uma mensagem para um driver). O que acontece?7 resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-flavio.pdf 10 5 - Estude e explique o item 2.6.8 - Tratamento de interrupção no minix. Onde está o código que faz o chaveamento do processo? Os registradores da CPU devem ser trocados para o novo processo que vai rodar. Onde os valores dos registradores são trocados? dica: arquivos .s em kernel. Na página 169 do livro está escrito: "O mecanismo de troca de tarefas de um processador Intel de 32 bits que entra em ação em resposta a uma interrupção é complexo, e alterar o contador de programa para executar outra função e apenas uma parte dele. Se a CPU recebe uma interrupção enquanto está executando um processo ela configura uma nova pilha para uso durante o serviço de interrupção. A localização dessa pilha é determinada por uma entrada em um segmento de estado de tarefa (Task State Segment)." Faça um estudo (via google) sobre o que é a Task State Segment e como isso se relaciona com a tabela de processos. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-helio.doc (trocar para helio.pdf) 9 6 - Estude o item 2.6.9 - Comunicação entre processos no minix3. O kernel do minix oferece uma base para que os procesos troquem mensagens. Quais são essas funções? Apresente exemplos de processos do minix (ex: file system server) usando essas funções de troca de mensagens. Suponha que: . um processo P1 pede a execução da system call "read", P1 fica bloqueado . o processo P2 ganha a CPU e também pede a execução de "read". O pedido de P2 fica em alguma fila aguardando que P1 seja atendido? O que acontece com o pedido de P2? Onde está isso no código? dica: se o mesmo processo servidor (ex: "fs") receber duas mensagens (já que as system calls se transformam em mensagens) de processos diferentes, o que ocorre? Veja: http://www.cis.syr.edu/~wedu/seed/Labs/Documentation/Minix3/System_call_sequence.pdf resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-marceloarbore.doc -> Não explicou bem o que acontece com P2 ao fazer read enquanto P1 faz read. 8 7 - Explique 2.6.10 - Escalonamento no minix 3. Em particular, o que acontece quando não existe nada para ser executado? dica: veja tarefa idle. A tarefa idle fica continuamente executando código em um loop infinito sem fazer nada disperdiçando energia? Como se sai do "idle"? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-nathalia.odt 9 8 - onde está o código do minix que trata dos sinais (signals)? Caso um processo não tenha decladrado o signal handler para tratar SIGINT (control C) qual é o código executado pelo minix? dica: signal.c, SIG_DFL resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-pedrodaquino-kayatt.pdf 10 9 - Explique 2.7 tarefa de sistema. Em particular selecione um dos serviços oferecidos pela tarefa de sistema e apresente como um outro processo usa esse serviço. Em particular, o kernel do minix oferece uma base para que os procesos troquem mensagens. Quais são essas funções? (item 2.6.9) Apresente exemplos de processos do minix usando essas funções de troca de mensagens. Um exemplo interessante é o seguinte: um driver roda em modo usuário e por isso não tem acesso às instruções in e out (que rodam somente em modo kernel). Como o driver faz então o in e out através da troca de mensagens? Com qual processo o driver se comunica? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-rafaelsilva.doc 9 10 - Explique 2.8 tarefa de relógio. Em particular, explique como a tarefa de relógio é usada no chaveamento dos processos. Altere o relógio para que gere interrupções no dobro do tempo em que ocorre geralmente. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-renan.doc 9 11 - O item 2.6.11 do livro "Suporte do núcleo dependendo do hardware" apresenta como o minix faz uso do hardware baseado na intel. Estude esse item relacionando com outros documentos sobre o pentium disponíveis na internet. Em particular, comente sobre a GDT e LDT, a figura 2-44 sobre o formato do descritor de um segmento, os 4 níveis de privelégio do pentium (sendo que o minix faz uso de 3 deles) e como isso foi tratado em protect.c (linha 8589 da listagem no final do livro). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-vitorfujita.rar 9 12 - Quando ocorre a system call, qual é o número de interrupção de software? Onde está o código que chama o serviço correspondente? (Exemplo: como a partir do registrador é feita a chamada de fork?). Altere o número de interrupção relacionada à system call. dica: *** http://www.cis.syr.edu/~wedu/seed/Labs/Documentation/Minix3/System_call_sequence.pdf Este documento contém a sequencia para que uma system call seja realizada. O trap para o kernel ocorre em "int SYSVEC". Veja onde isso ocorre e explique o uso de sendrec. Use o código fonte do minix.iso (isto é, veja o minix que de fato roda no qemu, vmware, etc.) e não o código em minix_source_3_1_1.tar.bz2 (eles não estão compatíveis e o tar.bz2 não contém o código do sendrec). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r2-wilsonleao.doc 10 >> O que entregar? Um relatório contendo: - objetivo do exercício. - uma visão geral dos fontes *.c utilizados. - uma visão mais detalhada observando o código do minix. Enviar este relatório .pdf para o meu email para ser publicado em www.pcs.usp.br/~jkinoshi Apresentação: usar powerpoint. Colocar o código relacionado com a pergunta nos slides. >> Dicas para analisar o fonte do minix 3. - Uma forma de se analisar o fonte do minix 3 é simplesmente ir em www.minix3.org e fazer o download de http://www.minix3.org/download/minix_source_3_1_1.tar.bz2 Se estiver no linux faça: bunzip2 minix_source_3_1_1.tar.bz2 e depois tar -xvf minix_source_3_1_1.tar Vejam os subdiretórios de src: boot/ - contém o init, primeiro processo a ser disparado. drivers/ - código dos drivers. include/ kernel/ - código do kernel que cuida do chaveamento de processos e fornece a base para a comunicação entre processos. tools/ - código de dois scripts que servem como ferramentas mkboot e tell_config. Se estiver no linux, um bom comando para se usar : grep -r "string"./ dentro de src/kernel pode fazer simplesmente: grep "string"*.c Exemplo em relação ao init, o primeiro processo a ser disparado. o código do processo está em: /src/servers/init/init.c e o resultado de sua compilação é o processo 'init' gerado em uma arquivo. Fazendo: grep '"init"'*.c encontramos: src/kernel/table.c Esse arquivo contém os processos que são disparados em main(). Alguns deles são tarefas do minix (ex: idle, fs, pm, etc.) e o init é o primeiro processo na fila de processos de usuário. Obs: a versão do código do minix3 é diferente da imagem iso; assim tome cuidado para não misturar fontes de versões diferentes. Projeto 3 Projeto 3 Albert, Bruno Grisi, Emilio Pietro 1) RAM disk (dispositivo para blocos). O minix possui um driver para RAM disk associado a /dev/ram. - crie um disco em RAM no minix e execute operações como criar arquivo, listar diretórios, etc. nesse RAM disk. - O driver envia mensagens? Para quem? - altere o minix de forma a imprimir as mensagens (processo origem, tipo e parte do conteúdo) que o driver recebe. Experimente imprimir mensagens dentro do driver memory.c em m_transfer. Relacione essas mensagens ao: - criar um arquivo. - escrever em uma arquivo. - fechar um arquivo. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-brunogrisi-emilio.doc -> Será que o minix não consegue criar um driver "normal"em RAM? 8 Anaue, Carolina, Fabio Hideki 2) Porta Paralela (dispositivo para caracteres). - Estude o driver da porta paralela em /usr/src/drivers/printer - altere o minix de forma a imprimir as mensagens (processo origem, tipo e parte do conteúdo) que o driver recebe. Envie uma string para /dev/lp e veja o que ocorre (ex: cat "lixo" > /dev/lp). - altere o minix de forma a imprimir as mensagens que o driver envia para a SYSTEM_TASK. Observe que o minix usa uma biblioteca que contém funções como sys_outb que acabam enviando mensagens para a system_task quando se deseja ler ou escrever nas portas de I/O. Altere a system task para imprimir uma mensagem caso tenha recebido uma mensagem do driver da porta paralela. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-carolina.zip 10 Bruno Kohn, Davi Keiti, Fabio Katsumi 3) Como funciona mknod? O que é o major number e minor number ao se criar um driver? Crie /dev/lpx com um major number diferente de /dev/lp. Recompile o driver da porta paralela para que ele fique associado ao major number dado por /dev/lpx. Sugestão: leia as apostilas do laboratório de microprocessadores, experiências 8 e 9. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-brunokohn-fabiokatsumi.rar -> No relatório não possui telas do que ocorreu depois que o driver foi ativado (se é que foi...) 8 Fabio Mitsuo, Helio Tadashi, Marcelo Moretti 4) Alguns driver foram declarados como driver_task(&m_dtab); Em /home/jk/so/src/drivers/libdriver existe a definição de driver_task. Implemente o exercício semelhante a 11) usando driver_task. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-Helio.doc 10 Fabio Sendoda, Leandro Cordeiro, Marcio Jun 5) Alguns driver foram declarados como driver_task(&m_dtab); Em /home/jk/so/src/drivers/libdriver existe a definição de driver_task. Implemente o exercício semelhante a 8) usando driver_task. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-leandro.doc -> Como o t_transfer sabe se é escrita ou leitura? 9 Flavio Henrique, Luiz Flavio, Marcos Carvalho 6) Porta Paralela - Qual interrupção é associada a porta paralela? Quando ela ocorre? Veja HARD_INT em printer.c. Quem gera a mensagem do tipo HARD_INT? (ex: system task??) Quando ela é gerada? (Ex: quando a impressora acabou de imprimir o que devia, quando papel acabou ...). - Caso alguém estivesse criando um driver novo, como deveria fazer para associar uma interrupção de número N a esse driver? - Crie um driver como em 8), mas que também recebe uma mensagem quando ocorrer a interrupção quando o teclado é pressionado e imprima uma mensagem "teclou". Para isso será necessário alterar o kernel para enviar uma mensagem toda vez que se teclar algo para o seu driver teste. Resposta parcial: http://www.pcs.usp.br/~jkinoshi/2007/r3-6.pdf resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-Flavio-LuizFlavio-Marcos-Relatorio3_SO_G6.pdf 10 Marcos Nogueira, Oduvaldo, Phillip 7) Crie um novo driver para a porta paralela associado a /dev/lpx (declare lpx através de mknod) que funcione assim: echo 1E > /dev/lpx deverá colocar o byte 1E (ou qualquer outro valor) nos pinos da porta 0x37a. Obs: o comando echo tentará escrever a string "1E\0" e não o byte 0x1E assim você deverá fazer uma rotina de conversão de valores. Sugestão: Leia as apostilas do laboratório de microprocessadores, experiências 8 e 9. Sugestão 2) Dependendo da máquina virtual (ex: vmware) é possível ver os dados escritos no pino da porta paralela. Como esse exercício foi resolvido pela turma do ano passado, solicito que ele seja apresentado funcionando em aula (pessoal parece que é fácil simplesmente copiar o do ano passado, mas vocês verão que não é tão simples assim...). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3_phillip_oduvaldo_marcos_porta_paralela_lpx.doc 10 Parabéns! Mark, Pedro Daquino, Rafael Silva 8)A experiência 8 do lab. de microprocessadores: http://www.pcs.usp.br/~jkinoshi/2005/Exp8_revisada_13_08_04.doc tem como objetivo apresentar o que é um driver em linux. Em linux, um driver é um conjunto de rotinas que implentam funções padronizadas como "read" e "write". No caso do minix, um driver é um processo que responde a mensagens padronizadas. Crie um driver muito simples em minix que apenas imprime mensagens quando recebe mensagens padronizadas de outro processo. O driver pode ser associado a /dev/teste. Declare /dev/teste associando um major e minor number e o código do processo associado ao driver. Use "service" para rodar o driver. Gere um relatório sobre isso. As mensagens que o driver deve responder são as mesmas que o driver da impressora respondem, ou seja: * m_type TTY_LINE PROC_NR COUNT ADDRESS * |-------------+---------+---------+---------+---------| * | DEV_OPEN | | | | | * |-------------+---------+---------+---------+---------| * | DEV_CLOSE | | proc nr | | | * ------------------------------------------------------- * | HARD_INT | | | | | * |-------------+---------+---------+---------+---------| * | SYS_EVENT | | | | | * |-------------+---------+---------+---------+---------| * | DEV_WRITE |minor dev| proc nr | count | buf ptr | * |-------------+---------+---------+---------+---------| * | CANCEL |minor dev| proc nr | | | * ------------------------------------------------------- Envie mensagens a /dev/teste como em: echo "lixo" > /dev/teste e veja a mensagem que é impressa pelo seu driver. Faça o driver imprimir a string que recebeu ("lixo"). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-pedrodaquino-Relatorio3.pdf 10 Nathalia, Pedro Kayatt, Rafael Ruppel 9)Crie um driver como especificado em 8). Teste o driver: Envie mensagens a /dev/teste como em: echo "lixo" > /dev/teste e veja a mensagem que é impressa pelo seu driver. Agora faça com que o driver, logo após imprimir a string que recebeu "lixo" entre em um loop infinito simulando um problema no driver. Veja http://en.wikipedia.org/wiki/MINIX_3 Lá está escrito: Tame infinite loops If a driver gets into an infinite loop, the scheduler will gradually lower its priority until it becomes idle. Eventually the reincarnation server will see that it is not responding to status requests, so it will kill and restart the looping driver. In a monolithic system, a looping driver could hang the system. Verifique se a prioridade do driver está sendo alterada. Continue fazendo: echo "lixo" > /dev/teste Se de fato for verdade que o driver é reestartado então uma nova mensagem será escrita na tela. Verifique isso. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-PedroKayatt.doc 10 Muito interessante e foi referenciado pelo último trabalho do Pedro Daquino. Rafael Weffort, Victor Fujita, Wilson Faria 10)Implemente um driver bem simples com em 8). Teste o driver: Envie mensagens a /dev/teste como em: echo "lixo" > /dev/teste e veja a mensagem que é impressa pelo seu driver. Agora faça com que o driver, logo após imprimir a string que recebeu "lixo" entre em um loop infinito simulando um problema no driver. Veja http://en.wikipedia.org/wiki/MINIX_3 Lá está escrito: Restrict access to I/O ports The kernel also maintains a table telling which I/O ports each driver may access. As a result, a driver can only touch its own I/O ports. In monolithic systems, a buggy driver can access I/O ports belonging to another device. A porta 0x37A é usada pela impressora. Tente escrever 0x41 na porta 0x37A (veja sys_outb) e veja o que ocorre (sys_outb(0x37a,0x41)). É verdade que ocorre o erro? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3_wilsonfaria.doc 10 Raphael Mielle, Vitor Araujo, Wilson Leao 11) Implemente um driver bem simples com em 8)mas que também responda a DEV_READ. Faça com que o driver envie a string "fui lido" em resposta à mensagem DEV_READ. Teste o driver: cat /dev/teste e veja o que ocorre. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-wilsonleao.pdf 10 Renan, William Morita, Yuri 12)Como em 11) implemente um driver bem simples como em 8)mas que também responda a DEV_READ. Faça com que o driver envie a string "fui lido" em resposta à mensagem DEV_READ. Teste o driver: cat /dev/teste e veja o que ocorre. Enquanto o driver estiver rodando (deve aparecer várias mensagens "fui lido"na tela), tente matar a task. Você conseguiu? Descubra uma forma de remover a task (service down). O que ocorre? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-renan_william_yuri.pdf 8 -> Não vi o teste do "cat /dev/teste" e o relatório está prolixo... Projeto 4 (Memória) Todos os grupos: Observem que no minix3, ao se teclar F2 aparece uma relação de processos e de como a memória está alocada. Leiam também o livro do Tanenbaum sobre o gerenciamento de memória em minix - item 4.7. Vejam também a figura 4-33 que mostra como os endereços virtuais foram colocados na memória física. A memória do minix é medida em clicks e dividida em segmentos. 1. Mostrar através de um log como a memória foi alocada e desalocada a processos. Toda vez que um processo executar um fork, exec, exit afeta a alocação de memória e isso é registrado no log (em um deterinado arquivo). No log contém informações como: fork - processo /usr/bin/init + segmento 0x30 - 5 clicks. exec - processo /usr/bin/firefox + segmento 0x40 - 7 clicks. exit - processo /usr/bin/firefox - segmento 0x40 - 7 clicks. onde: + : significa que memória está sendo alocada ao processo da posição 0x00230 até 0x00340 - : significa que memória está sendo desalocada e devolvida para a área livre. dica: http://www.pcs.usp.br/~jkinoshi/2007/r4-1.pdf Adicione ao log a informação de qual tipo de segmento (código ou dados) está sendo alocado ou desalocado. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4_brunogrisi.zip 8 -> A informação sobre o tipo de segmento (código/dado) deveria estar na mesma linha onde está "fork", "exec", etc. 2. O minix usa uma lista ligada para marcar onde estão as lacunas. Quando uma memória é alocada ou desalocada a processos, a lista de lacunas é alterada. Onde ocorre isso no código? Comente. Alterar o minix para que ao se teclar F8 ele apresente todas as posições da lacunas (relacione com segmentos e clicks). Dica: http://www.pcs.usp.br/~jkinoshi/2007/r4-2.doc O minix implementa o "first fit" ao procurar um local vago na memória. Altere o minix de forma que ele implemente o "best fit". resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4_anaue_carolina_fabiogutiyama.pdf 10 -> O trabalho ficou muito interessante, principalmente a tentativa de fazer um mapa das lacunas x memória alocada. Da próxima vez, tem que tirar a "foto" da memória alocada e lacunas em um instante apenas. 3. Crie um programa em C que lê o teclado e se o usuário digitou 1 ele cria um processo filho que fica em loop contínuo imprimindo "filho" e se o usuário digitar 2 ele mata o processo filho. Faça experiências teclando F2 para observar o que ocorre com a memória quando o filho é criado ou morto. Dica: http://www.pcs.usp.br/~jkinoshi/2007/r4-3.doc Observe que somente a área de dados é replicada, mas a área de código permanece a mesma. A área de código deve ser retirada somente quando ela não for mais usada por nenhum processo. Uma maneira de verificar se isso é verdade, é fazer com que o programa pai faça um exec em um outro arquivo executável quando o usuário digita 3. Depois ao digitar 2 e matar o processo filho, observe que o área de código do filho também é removida. Relacione isso com o código do minix. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-davikeiti.rar 10 4. Explique o formato do arquivo a.out. Onde está a informação do entrypoint (enderço da primeira instrução executável)? Olhando o código do minix, crie o aplicativo "vememoria programa_executavel" que informa o quanto de área de código, dados e pilha deveriam ser alocados ao programa_executavel; onde programa_executavel corresponde a um arquivo executavel. Experimente criar um arquivo executavel (ex: a.out) que imprime "hello world" e submeta ao vememoria. Verifique se o vemmoria funciona bem na prática teclando F2 (talvez seja interessante deixar o processo em um loop infinito para que sua memória não seja desalocada). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-Helio.doc 10 5. Imagine que um programa queira invadir área de memória de outro programa. Será que o minix impede isso? Crie um programa em C que mexa em alguma área de dados (ex: uma variável global). Compile gerando o código em assembly (teste.s). Altere o teste.s para que ele leia algum dado de algum outro processo (por exemplo: fazendo com que ele referencie dados em um outro segmento que não pertence ao programa). O minix retorna erro? Ou seja: será que o minix está protegendo a área de memória de cada processo? dica: http://www.pcs.usp.br/~jkinoshi/2007/r4-5.doc A equipe do ano passado criou rotinas em assembly para alterar os segmentos. Coloque isso na documentação. Além disso, ao tentar acessar um outro segmento, eles obtiveram a mensagem: "segmentation fault" e a mensagem "core dumped". Veja no minix, qual parte do código escreve "core dumped". Veja o que o código do minix faz quando imprime essa mensagem. Será que ele gera um arquivo com o conteúdo de memória de forma a facilitar o debug do processo? Veja na internet se existe uma forma de se analisar o arquivo gerado pelo erro. No linux, quando o "core" é dumped, aparece o arquivo .core que pode ser visto pelo gdb. Pesquise como lidar o ".core" no minix. Você consegue tirar alguma conclusão observando esse arquivo? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-Leandro-FabioSendoda-Marcio-Relatorio Projeto 4 -Grupo5.doc 10 6. Ex: 4.36 - Na seção 4.7.5 do livro minix3, foi visto que a chamada exec busca primeiro uma lacuna na memória e depois libera a memória do processo. Melhore o algoritmo fazendo com que primeiro a memória do processo seja liberada para depois se buscar a lacuna na memória. dica: http://www.pcs.usp.br/~jkinoshi/2007/r4-6.pdf O código faz chamadas para a system task com o objetivo de fazer com que o processador altere os segmentos (através das funções sys_newmap, sys..., ...). Estude, apresente e coloque no relatório como as funções que foram implementadas na tarefa de sistema (system task) interagem com o processador. Pesquise informações sobre o i386 e o gerenciamento de memória, mas mais voltados para o que o minix faz. Não precisa estudar a parte de memória virtual. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-FlavioLuizFlaviorelat.pdf 8 -> Melhorar a parte que interage com o processador (como a System Task interage com o microprocessador ao lidar com a memória). 7. Ex: 4.37 - Na seção 4.8.4 do livro minix3, foi visto que seria melhor procurar por lacunas para os segmentos de código e dados separadamente. Implemente esta melhora. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-phillip_oduvaldo.doc 10 8. No item 4.7.4 mostra como é feito um fork. Explique o item 4.7.4. Crie um programa que continuamente faz fork() enchendo a tabela de processos. Qual erro ocorre? resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-pedrodaquino.pdf 10 9. Estude e apresente o item 4.7.5 sobre a chamada exec. Existem aplicativos como o passwd que vêm com setuid setado (a fim de que o passwd rode com as permissões do owner e não do usuário que disparou. Altere o código do minix de forma que ele rode qualquer programa como se o setuid estivesse setado. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-ruppel.rar - Interessante com alguns erros inesperados 10 10. Crie um programa bem simples usando o compilador cc do minix. O arquivo executável que foi gerado especifica o código e dados (variáveis globais). Identifique uma sequência de bytes corresponde a uma parte do seu programa (ex: uma string). Identifique em que posição de memória esses bytes foram carregados quando o arquivo foi colocado para ser executado (por exemplo: um programa que imprime uma string (ex: "testando...") e depois fica em loop infinito). Localize a string "testando..." em /dev/mem. Explique porque a string foi carregada naquela posição relacionando com os ponteiros para os segmentos. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-rafaelweffort.doc 10 -> Valeu o esforço de analisar o dump de memória. 11. Crie um programa bem simples em assembly no minix. O arquivo executável que foi gerado especifica o código e dados (variáveis globais). Coloque o programa para rodar (por exemplo: um programa que imprime uma string e depois fica em loop infinito). Identifique onde está o código do programa em /dev/mem. Veja se os bytes da posição onde está o código do programa correspondem ao código de máquina de seu código assembly. Raphael Mielle, Vitor Araujo, Wilson Leao resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-VitorSUST-SO_Fase4.doc 10 -> Seria interessante se marcasse o código que deveria ser carregado na memória (instrução por instrução em hexadecimal) e depois comparasse para ver estava na memória. Foi feito quase isso, mas talvez usando objdump (ou algo parecido no minix) ficasse melhor. 12. Explique o fork segundo o item 4.7.4. Em especial, logo após o fork, o novo processo é colocado na fila de processos com uma certa prioridade. Localize onde isso ocorre no código. Como o PM informa o núcleo inserindo o novo processo? Altere o código do minix de forma que o novo processo rode com em um nível de prioridade menor que o processo pai. Crie um processo pai que continuamente imprime "pai" e um processo filho que continuamente imprime "filho". Compare as impressões de "pai" e "filho" com as do minix original. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4-renan_william_yuri.pdf 10 -> mas provavelmente deve existir uma outra forma de se alterar a prioridade do filho que não fosse usando o "nice". Projeto 5 (FileSystem). Para se entender o como file system é implementado no minix, leia o item 5.6 do livro do minix 3. Gostaria de passar o seguinte exercício para algum grupo: Criar o programa vemapa gera um mapa do disco. A saída é uma listagem contendo para cada bloco da partição minix o que ele contém (item 5.6.2; figura 5-34) Exemplo: vemapa 0: bloco de boot 1: superbloco ... 5: i-node livre 6: i-node diretório /usr 7: i-node arquivo /usr/bin/chdir ... 100: bloco 2 /usr/bin/chdir 101: bloco 3 /usr/bin/chdir ... Mas achei que o exercício ficaria pesado demais. Assim distribuí algumas tarefas desse exercício para alguns grupos. Renan, William Morita, Yuri 1 - Como ocorre a system call read? (item 5.6.10 do livro do minix3). Crie a system call leia (uma cópia de read) que ao fazer a leitura, imprime os blocos do disco que foram lidos. Faça um programa em C que use "leia" e imprima quais blocos foram lidos. Informe se o bloco está sendo lido do cache ou do disco. Resposta: http://www.pcs.usp.br/~jkinoshi/2007/r5-1.pdf http://www.pcs.usp.br/~jkinoshi/2007/r5-1.ppt Altere a resposta fornecida em 2007, para que além de especificar os blocos lidos (do disco ou do cache), também forneça as mensagens enviadas ou recebidas do disk driver. Para isso, altere o disk driver de forma a imprimir as mensagens que recebe quando a função leia estiver sendo usada ou varra todo o código de FS para que ele imprima as mensagens que estão sendo trocadas (o que você achar mais fácil). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-renan_william_yuri.doc 7 -> Não imprimiu as mensagens trocadas com o driver. Bruno Kohn, Davi Keiti, Fabio Katsumi 2 - Em 2007 propomos o seguinte problema: Implemente o comando i-nodes que apresenta para cada i-node informações se ele está livre ou a qual arquivo pertence. Exemplo: i-nodes ... 5: i-node livre 6: i-node diretório /usr 7: i-node arquivo /usr/bin/chdir ... Dica: Veja onde o i-node é utilizado e tente aproveitar as rotinas que lidam com o i-node. Na resposta em http://www.pcs.usp.br/~jkinoshi/2007/r5-2.doc, os alunos apenas indicaram se um determinado i-node estava em uso ou não. Uma solução para o problema é varrer todo o disco a partir da raiz e coletar informações sobre como cada um dos i-nodes está sendo usado. Na esperança de criar um exercício mais simples, vamos pedir apenas que se liste o número do i-node correspondente ao diretório raiz e todos os i-nodes os nomes e i-nodes de arquivos que pertencem ao diretório raiz. Exemplo: /usr i-node = 4; /etc inode = 5; etc. resp: NAO APRESENTOU/ENTREGOU - 0 A) Nathalia, Pedro Kayatt, Rafael Ruppel A= Apresentou antes 3 - Implemente um programa que mostre para cada processo, todos os arquivos que foram abertos por ele. Inspire-se no comando lsof do linux que lista todos os processos e para cada processo, os arquivos por ele abertos. (item 5.6.7). Você deverá consultar a tabela de processos que está no processo fs. Para isso, você pode fazer com que o fs retorne uma mensagem com esses dados. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-ruppel-relatorio.rar 10 A) Anaue, Carolina, Fabio Hideki 4 - Dado um número de i-node, imprimir todos os blocos que fazem parte do arquivo. Para cada bloco especificar se é bloco de dados ou bloco indireto (de ponteiros). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5_anaue_carolina_fabiogutiyama.doc 10 A) Fabio Mitsuo, Marcelo Moretti, Vitor Araujo 5 - Em 2007 propomos o seguinte exercício: Imprimir a tabela filp ao se teclar F7. (fig. 5-39). Faça a experiência. Um processo abre o arquivo "/tmp/lixo" e escreve "1". Ela "forka" e seu filho escreve "2" no mesmo arquivo. O filho "forka" escreve "3" no mesmo arquivo. Qual é a string que você lê em /tmp/lixo? Relacione isso com a tabela filp. Resposta: http://www.pcs.usp.br/~jkinoshi/2007/r5-5.doc Para 2008, estamos passando o mesmo exercício, com a diferença de que ao se teclar F7 apareça para cada entrada de filp, duas linhas: 1. os pid's dos processos que apontam para aquela entrada 2. os dados como em r5-5.doc (no, mode, flags, etc.). resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/p5-VitorSUSTRomera-so_proj5.zip 7 -> Praticamente foi apenas repetida a exp. do ano passado, mas não foi acrescentado o que se pediu para esse ano - os pid's dos processos. A) Fabio Sendoda, Leandro Cordeiro, Marcio Jun 6 - Em 2007, propomos: Crie o vebloco que permita inspecionar um bloco/zona do disco. Passa o número do bloco e apresenta os bytes que estão nele. Inpire-se no comando xxd do linux. O xxd recebe um arquivo e apreseta os bytes. O vebloco recebe o número do bloco e apresenta os bytes nele contidos em um formato semelhante à saída de xxd. Usando vebloco pode-se inspecionar um i-node e os blocos que compõem um arquivo. Resposta: http://www.pcs.usp.br/~jkinoshi/2007/r5-6.doc Nessa resposta, foi criada uma system call para ler um bloco. Estude essa solução, e use vebloco para, dado um arquivo X qualquer: a) inspecionar o i-node de X b) inspecionar um bloco que pertença a X. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-FabioYamate.pdf 10 -> Ficou interessante ao pegar um arquivo e relacionar com seu inode e conteúdo. A) Albert, Bruno Grisi, Emilio Pietro 7 - Como funciona file lock? Estude: http://www.ecst.csuchico.edu/~beej/guide/ipc/flock.html Compile lockdemo.c no minix. Explique a diferença entre write lock (somente um pode escrever e ninguém ler) e read lock (vários podem ler e ninguém escrever). Rode várias instâncias de lockdemo fazendo os locks e observe o que ocorre. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-brunogrisi-Grupo\ 7\ -\ Projeto\ 5.zip 10 Flavio Henrique, Luiz Flavio, Marcos Carvalho 8 - Explique o item 5.6.6 do livro. Crie o programa: mostra-id que mostra qual são os i-inodes usados por um arquivo da raiz até ele. Exemplo: mostra-inodes /usr/bin/teste deve mostrar os i-nodes de /usr, bin e teste. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-luizflavio.pdf 6 -> Pode se considerar que é um começo para a solução... Tem que estudar como passa o path, etc. Marcos Nogueira, Oduvaldo, Phillip 9 - O processo FS comunica-se com um processo usuário e com o driver. Quando o processo usuário faz "open", o FS se comunica com o driver. Altere o FS de forma a apresentar as mensagens recebidas do processo usuário e o driver para que ele apresenta as mensagens recebidas de FS. Para evitar que o FS gere muitas mensagens, faça o seguinte: crie o comando "fale-fs" e "quieto-fs" que fará o FS gerar as mensagens ou parar de gerá-las. Também crie o comando "fale-driver" e "quieto-driver" que fará o disk driver gerar as mensagens ou parar de gerá-las. Crie o comando "fale" e o comando "quieto" que coloca FS e driver para falar ou ficarem quietos, imprimindo as mensagens trocadas entre processo usuário, FS e disk driver. Assim, primeiro dê o comando "fale", depois faça um processo de teste executar um "open" e colete todas as mensagens trocadas pelo FS. Explique o motivo das mensagens. Pedimos a alteração no código do driver para imprimir as mensagens recebidas, mas a alteração poderia ser feita no FS para imprimir todas as mensagens trocadas (enviadas ou recebidas) com os outros processos. Faça o que achar mais simples desde que implemente o "fale" e o "quieto". resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-oduvaldo-so.doc 8 -> Precisa de melhorar já que ajeitou no código um número para imprimir algumas mensagens... Mark, Rafael Silva, Raphael Mielle, 10 - De forma semelhante ao exercício 9, o processo FS comunica-se com um processo usuário e com o driver. Quando o processo usuário faz "open", o FS se comunica com o driver. Altere o FS e o driver de forma a apresentar as mensagens trocadas entre o processo de usuário, FS e o driver, mas insira também os i-nodes e blocos que estão sendo manipulados pelo FS. Para evitar que o FS gere muitas mensagens, implemente e use os comandos "fale" e "quieto" como acima. Assim, primeiro dê o comando "fale", depois faça um processo de teste executar um "open" e colete todas as mensagens trocadas pelo FS. Explique o motivo das mensagens. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/p5-Mark-RafaelSilva-Mielle-Projeto\ 5.pptx (FALTOU O RELATÓRIO) 5 Rafael Weffort, Victor Fujita, Wilson Faria 11 - De forma semelhante ao exercício 10, crie os comandos "fale" e "quieto" e também imprima os i-nodes e blocos sendo manipulados. Veja as mensagens, i-nodes e blocos, quando o processo usuário cria um subdiretório. Faça um históricos disso e comente. resp: NAO FEZ A) Pedro Daquino, Hélio e Wilson Leão. 12 - Observamos que o driver com o loop infinito faz o minix travar e suspeitamos que ele trava porque o FS trava esperando uma resposta do driver que não chega. De forma semelhante ao exercício 9, faça o FS falar com "fale" e "quieto" de forma a se entender o motivo pelo qual ele "trava" em algumas situações quando o driver fica em loop infinito. resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-pedrodaquino.zip 10 - um trabalho muito bom que provavelmente seria bem aproveitado pelos desenvolvedores do minix! Bibliografia O documento em: http://www.cs.vu.nl/~steen/courses/os-slides/notes.02.pdf contém slides sobre o minix e seu código. Pode ajudar alguns grupos a resolverem suas questões. Alguns grupos talvez se interessem em como o 386 (o minix é baseado no 386) lida com o vetor de interrupção e como ele transita do modo protegido para o real e vice-versa. Existem diversos documentos sobre isso na internet. Exemplo: http://www.x86.org/articles/pmbasics/tspec_a1_doc.htm http://my.execpc.com/~geezer/os/pm.htm http://eserver.bell.ac.uk/mirrors/asm/p386_2.htm O site: http://www.raspberryginger.com/jbailey/minix/html/files.html contém o código do minix apresentado como páginas HTML Em: http://www.os-forum.com/minix/boot/index.php existe o código comentado sobre o boot.