Curso sistemas operacionais 2009 prof. Jorge Kinoshita. Aulas segunda, terça: 16:00-17:40H Maio 11/5 - aula 1 12/5 - aula 2 18/5 - aula 3 19/5 - aula 4 25/5 - aula 5 26/5 - aula 6 Junho 1/6 - aula 7 2/6 - aula 8 8/6 - aula 9 9/6 - aula 10 15/6 - aula 11 16/6 - aula 12 22/6 => Prova 1 23/6 - aula 13 29/6 - aula 14 30/6 - aula 15 Julho 6/7 - aula 16 7/7 - aula 17 13/7 - aula 18 14/7 - aula 19 20/7 - aula 20 21/7 - aula 21 27/7 - aula 22 28/7 - aula 23 Agosto 3/8 - aula 24 4/8 - aula 25 10/8 - aula 26 11/8 - aula 27 17/8 - aula 28 18/8 => Prova 2 Programação aula a aula. 1 - 1.1 O que é um sistema operacional, 1.2 História dos sistemas operacionais 2 - Visao do hardware 1.3 conceitos de sistema operacional 3 - 1.3 conceitos de sistema operacional; 1.4 chamadas de sistema 4 - 1.4 chamadas de sistema 1.5 estrutra do sistema operacional. 5 => apresentação dos projetos (fase 1) 6 - apresentação dos projetos (fase 1) 7 - 2.1 introdução aos processos 8 - 2.2 comunicação interprocesso 9 - 2.3 problemas clássicos de CIP 10 - 2.4 agendamento de processo. 11 => Projetos 2.5 visão geral de processos em minix (fase 2) 12 => Projetos 2.5 visão geral de processos em minix (fase 2) prova 1 13 - 3.1 Hardware Entrada e Saida 3.2 Software Entrada e Saida 14 - 3.2 Software Entrada e Saida 15 - 3.3 impasses 16 => Projetos 3.4 visão geral de E/S no minix (fase 3) 17 => Projetos 3.4 visão geral de E/S no minix (fase 3) 18 - 4.1 gerenciamento básico de memória 4.2 troca (swap) 19 - 4.3 memória virtual, 4.4 algoritmos de substituição de página. 20 - 4.4, 4.5 questões para sistemas de paginação. 21 - 4.6 segmentação 22 => Projetos 4.7 visão geral do gerenciamento de memória do minix (fase 4) 23 => Projetos 4.7 visão geral do gerenciamento de memória do minix (fase 4) 24 - 5.1 arquivos 5.2 diretórios 25 - 5.3 implementação do sistema de arquivos 26 - Minix filesystem <- (5.4 segurança, 5.5 mecanismos de proteção) 27 => Projetos 5.6 visão geral do sistema de arquivos minix (fase 5) 28 => Projetos 5.6 visão geral do sistema de arquivos minix (fase 5) prova 2 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, porém não usa um sistema operacional próximo da realidade, usa apenas pequenos exemplos em java; e provavelmente o aluno perde a noção do sistema operacional como um todo. avaliação: 3 P1 + 4 P2 + 0.5 E + 2.5 P E = exercícios feitos em aula / vale mais para contar presença. Projetos Este ano vamos pela primeira vez fazer projetos envolvendo: a - MIT: http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-828Fall-2006/CourseHome/ b - opensolaris - scripts d-trace c - Skelix OS - http://en.skelix.org/skelixos/ e já temos alguma experiência (diversos trabalhos de alunos no site da disciplina) com d - minix Projeto, fase 1 1 - O boot do minix é realizado pelo monitor de boot (boot monitor). Faça um relatório explicando como funciona. Leia "Lab 1 - Booting a PC" - MIT para ver como o bochs pode servir para observar as instruções rodando passo a passo. Localize e faça um print screen do momento em que o monitor de boot carrega o minix e o dispara. Instale o monitor de boot em no bochs. Veja: http://os-forum.com/minix/boot/bootsequence.php e http://www.woodhull.com/newfaq/faq/bootother.html 2 - Realizar experiência "Bootstrap em 'real mode' e em 'protected mode' em um computador i386" dos autores (alunos coop9) Hélio Omoto, Pedro d'Aquino, Rafael Ruppel e Wilson Leão. -- Após fazer a apostila (e o relatório com as respostas) estude o boot do minix e encontre no código o momento onde o minix passa para o modo protegido. http://www.pcs.usp.br/~jkinoshi/2009/ExpEX0Final.doc 3,4,5,6,7 - Realizar "Lab 1 - Booting a PC" do curso do MIT. Para fazer isso, use o linux e recompile o bochs para habilitar o modo de debug. 3 -- Faça a experiência focando o exercício 8. 4 -- Faça a experiência focando o exercício 9. 5 -- Faça a experiência focando o exercício 10. 6 -- Faça a experiência focando o exercício 11. 7 -- Faça a experiência focando o exercício 12. 8.9.10 - monitorar "system calls" usando d-trace no opensolaris. 8 -- crie um ranking colocando em primeiro lugar a system call mais chamada. 9 -- monitore o tempo em que cada system call é processada. 10 -- dado um processo, dizer quais foram as system calls por ele chamadas. Veja: http://blogs.sun.com/arbore/entry/basic_demonstration_of_dtrace_feature do Marcelo Arbore (coop9). Bryan M. Cantrill, Michael W. Shapiro and Adam H. Leventhal; Dynamic Instrumentation of Production Systems, Solaris Kernel Development, Sun Microsystems 11,12,13 - O minix faz system calls enviando mensagens a processos. Instale o minix em uma máquina virtual. Crie um mecanismo de monitorar as system calls no minix (monitorar quando um processo usuário envia mensagens a um processo servidor - FS ou PM). 11 -- crie um ranking colocando em primeiro lugar a system call mais chamada. 12 -- monitore o tempo em que cada system call é processada. 13 -- dado um processo, dizer quais foram as system calls por ele chamadas. Veja: diversos trabalhos já apresentados, em particular http://www.pcs.usp.br/~jkinoshi/2008/projs/r1-pedrodaquino.pdf Fase 2 Equipes: 1 Fernando Nobre, Paulo Shindi, Bruno Nigro 2 Bruno Toshyaki Maeda Trevelim, Keila Keiko Matsumura, Hélio Kazuo Nagamachi 3 Alex Oshika Avilla, Érico Hissashi Nikaido, Pedro Victor Losada Cavalcante 4 Henrique Copelli Zambon, Marcio Massaki Horoiwa, André Ivo Kido 5 Rafael Ivan Garcia, Rafael Barbolo Lopes, Filipe Morgado Simões de Campos 6 Alison Akio Paulo Miazaki, Guilherme Almeida Nascimento Fré, Jorge 7 Alencar, André Diniz, Leonardo Mayeda 8 Leandro Moles de Matos, Danilo Elias, Thiago Bosco 9 Rafael Medeiros Teixeira, João Misko, Eduardo Russo 10 Bruno Duarte Corrêa, Thiago Dias Pastor, Yuri Duarte 11 Robert, Bruno Paschoal, Bruno Oliveira Kohn, Victor de Souza Fujita. 12 Alexandre del Nero, Ricardo Moreira Muniz, Tárik Savietto Feres 13 Bruno Igor R. Domingues, Fernando Tahara Takagi, Thiago Koji Masuki 1-3. Implementar semáforos no minix. Será necessário estudar o kernel do minix, observando como manter o processo em estado bloqueado ao fazer uma operação de down. Implmente as seguintes system calls: int inicia(int valor); exemplo: S = inicia(3); # inica um semáforo com 3 e retorna o número do semáforo em S. O número zero é reservado; se S == 0 então deu erro em inicia. int down(int S); faz a operação de down no semáforo S; se der problema retorna -1. int up(int S); faz a operação de up no semáforo S int status(int S, int *valor, int *procbloqueados); coloca em valor, o valor do semáforo S e em procbloqueados, o número de processos bloqueados no semáforo. Essas system calls devem ser implementadas pelo processo PM (antigo MM). Dica: dado que existe apenas um processo PM, é fácil pensar que up e down serão mutualmente exclusivos pois o PM estará tratando a mensagem up ou a mensagem down não podendo tratar as duas ao mesmo tempo. Isto é: não será necessário desabilitar as interrupções para se implementar o up e o down. Como o processo usuário vai enviar uma mensagem ao PM então o estado de bloqueado pode ser conseguido, simplesmente se o PM não responder ao processo enquanto o semáforo não subir. 1 -- Use os semáforos no programa produtor-reprodutor. 2 -- Use os semáforos no programa filósofos jantando. 3 -- Use os semáforos no programa um-escreve, muitos-lêem em um banco de dados. 4-10, Use o bochs em modo debug (deve ser compilado para isso de acordo com o lab1 do MIT) para estudar o minix. Para todas as equipes de 4 a 10 façam o tutorial em http://en.skelix.org/skelixos/tutorial04.php Leiam: Manuais da intel (na internet) como por exemplo: Pentium® Processor Family, Developer’s Manual Volume 3: Architecture and Programming Manual. Rspondam: 4 - Para que serve o chip 8259? Como ele foi programado no minix? Faça um print screen do momento em que o minix programa os 8259 ao debugar o minix no bochs. O que acontece ser houver dois pedidos de interrupção ao mesmo tempo? Como o 8259 lida com isso? 5 - Para que serve a IDT (Interrupt Descript Table)? Onde ela é programada no minix? Com que valor o IDTR é inicializado? Localize no código do minix onde a IDT é alterada. Rode o minix até essa área e faça um print screen onde a IDT está sendo alterada. O que faz a instrução LIDT? Onde é usada no minix? 6 - Após a inicialização do minix, coloque um breakpoint na interrupção de teclado. Faça um print screen do bochs mostrando a primeira instrução logo ao entrar no tratamento de interrupção do teclado. Relacione o valor do endereço que você vê, com o declarado na IDT, GDT e LDT. O minix guardará os registradores. Como o hardware e o código do minix fazem isso? Em particular, como é armazendo o Program Counter (ou Instruction Pointer, EIP)? Onde o estado do processo é armazenado? Relacione isso com o código do minix e explique. Ao sair da rotina de interrupção, um outro processo foi escalonado para rodar? Qual processo? Apresente um print screen dos registradores antes de sair da interrupção. Como ao sair da interrupção, o novo processo passa a rodar? Com que Program Counter (EIP)? Explique. 7 - Após a inicialização do minix, coloque um breakpoint na interrupção de teclado. Faça um print screen do bochs mostrando a primeira instrução logo ao entrar no tratamento de interrupção do teclado. Relacione o valor que você vê, com o declarado na IDT. O minix guardará os registradores na tabela de processos. Em que nível (ring) o processador estava antes trabalhando antes da interrupção? Como você pode descobrir isso? (dica: olhe flags em algum registrador) Houve troca de modo de operação? Se não houve, deixe o minix rodar até a próxima interrupção de teclado. Qual o ponteiro de pilha que o processo usa? Relacione isso com a TSS. Explique no relatório o que é a TSS e localiza no código do minix onde a TSS foi orignalmente alterada. Faça um print screen dos dados que foram empilhados assim que você entrou na interrupção de teclado. Em que nível de interrupção o processador trabalha dentro da interrupção de teclado? 8 - Como o minix trata a divisão por zero? Explique o código. É de se esperar que o minix envie um signal para o processo que fez a divisão por zero. Se o minix não fizer isso, implemente. Faça um programa executável que faz a divisão por zero e que capture o signal imprimindo na tela uma mensagem toda vez que for feita a divisão por zero. Faça um print screen do bochs logo ao entrar na rotina que faz o tratamento da divisão por zero. 9 - Explique como o minix faz o escalonamento dos processos. Coloque um breakpoint para que o minix pare quando o escalonador de processos for chamado e faça um print screen da tela. 10 - Faça um print screen de quando um processo sai do estado "pronto" e passa para o estado "bloqueado" e um print screen de quando um processo sai (exit). Como a fila de processos "prontos" a receber a CPU é alterada toda vez que um processo sai do estado de "pronto"? Explique isso relacionando com o código do minix. 11,12,13 - usando o dtrace (colaboração do Marcelo Arbore). 11 - Construa um script p/ o DTrace que liste a prioridade atual de um dado processo, assim como os aumentos e os decrécimos de prioridade do mesmo (A idéia é poder acompanhar a prioridade que o kernel aplica a este processo ao longo do tempo). Um teste a se fazer é acompanhar como varia a prioridade de um processo que faz uso intensivo da CPU e outro que faz mais I/O. 12 - Faça um relatório sobre signals. Construa um programa em C que imprime "teclou control C" através de um signal handler que trata o sinal ^C. Construa um script p/ o DTrace que liste os sinais enviados entre processos. É preciso imprimir o nome do sinal, o produtor(processos que envia) e o consumidor(processos que recebe) do sinal). Faça um teste usando o seu próprio programa. 13 - Escreve um script em DTrace que liste as interrupções ocorridas no sistemas, bem como as system calls. Forneça uma dica do motivo (interrupção de relógio, interrupção de periférico, etc). Por exemplo: é de se esperar que quando a system call read for chamada, haverá alguma interrupção vinda do winchester avisand que os dados estão prontos a serem usados. Fase 3 Para a fase 3, temos que a maioria dos grupos pode achar o seguinte trabalho interessante: 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"). Em 2008, tivemos a seguinte resposta para o problema acima: http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-pedrodaquino-Relatorio3.pdf. Vamos chamar esse driver de driver-padrão. Aqui vão as tarefas: 1 - gerar uma onda quadrada pela porta paralela. Criar /dev/pp e associar um driver, baseado em driver padrão, que: echo "AB" > /dev/pp faz o caracter hexa "AB" ser colocado nos pinos da paralela. Já fizemos trabalhos com essa idéia. Use relatório antigos apenas como base apenas, rode no bochs (os trabalhos antigos rodavam no vmware). 2 - Fazer o exercício 12 de "Lab 1 - Booting a PC" do curso do MIT. Para fazer isso, use o linux e recompile o bochs para habilitar o modo de debug. Esou repassando o mesmo trabalho para o Hélio... 3 - Cada driver no minix deveria ser responsável apenas por uma área de I/O e se ele tentasse usar outra área, deveria ser barrado. Fizemos algumas experiências no passado, usando minix3 e constatamos que isso não funciona. Faça novos testes e proponha uma forma de corrigir o problema. 4 - Levante as mensagens trocadas entre o FS e o driver do disco, desde a inicializacao, durante a leitura de um determiado arquivo. (Escolha um arquivo pequeno e bem simples). Você pode se basear no último trabalho do grupo do Pedro, Wilson, Hélio ( http://www.pcs.usp.br/~jkinoshi/2008/projs/r5-pedrodaquino.zip) para levantar as mensagens trocadas entre FS e driver. 5 - Levante as mensagens trocadas entre o FS e o driver do disco, desde a inicializacao, durante a escrita de um determiado arquivo. (Escolha um arquivo pequeno e bem simples). 6 - Estude o que é a mensagem IO_SCATERED tratada por um driver de blocos. Altere o código do minix, colocando um printf de forma que você saiba quando essa mensagem é enviada. Force alguma situacao onde essa mensagem é enviada e tratada. 7 - simule o minix dentro do bochs. Coloque um breakpoint quando ocorrer uma interrupcao sinalizando que houve o término de uma leitura de disco. Imprima a tela do bochs mostrando que voce conseguiu interceptar essa interrupcao. Após isso, como essa interrupcao é sinalizada para o driver de disco? É possível que essa interrupção desbloqueie o driver? 8 - Já ocorreu diversas vezes no lab. de microprocessadores do hyperterminal travar, mas ninguém saber qual o processo que estava segurando o hyperterminal levando os alunos a rebootarem o windows. No Linux existe o comando lsof e alguém poderia fazer algo como: lsof |grep /dev/ttyS0 para descobrir qual processo ficou associado a qual dispositivo. Estude e explique isso. Procure o equivalente disso no Windows XP e Windows Vista. 9 - O minix3 roda os drivers em modo usuário. Assim, para que um driver execute um I/O, ele faz essa requisicao à tarefa de sistema. Altere o minix de forma a que toda vez que se teclar F5 (por exemplo), então aparece na tela uma informaćao contendo os ultimos acessos ao I/O, onde em cada linha temos: (numero da porta de I/O, escrita/leitura, valor). Já existem diversos trabalhos antigos que fazem com um tecla F5 imprima algo na tela. 10 - O minix3 apresenta o reincarnation server. Um processo no microkernel que constantemente verifica como estão os drivers e os reinicializa se considerar que eles possuem algum erro. Altere o driver padrão em http://www.pcs.usp.br/~jkinoshi/2008/projs/r3-pedrodaquino-Relatorio3.pdf de forma a que ele responda ao RS. Coloque o RS de forma a monitorar o driver padrão. Introduza um erro no driver padrao de forma que ele deixe de responder depois de um certo tempo. Verifique se o RS reinicializa o driver. 11 - Explique como funciona a tarefa de relógio do minix3. Altere o código do minix para que o relógio tenha a metada da frequencia original. O que faz clock-handler? Que problemas essa frequencia pela metada acarreta no minix3? 12 - Criar o /dev/pp de forma que ele imprime uma mensagem toda vez que houver um sinal de "fim de papel" no pino correspondente da porta paralela. Crie um mecanismo de gerar essa interrupção pelo bochs. 13 - Vamos imaginar que as interrupcoes do minix estivessem desabilitadas enquanto chega um tique do relógio. Poderia acontecer do minix perder algum tique de relógio? Será que seria possível se ter um mecanismo que detecte perdas em tiques de relógio olhando o relógio externo (pois mesmo com o computador desligado, seu relógio da bios continua funcionando)? Fase 4 As questões 1-8 foram elaboradas pelo pelo Phillip Viana. Envolvem o uso do dtrace. 1) (Desafio) Colete informações arbitrárias sobre a memória virtual de um processo (crie um script que ative os probes que você desejar, como sugestão utilize maj_fault, pgin, pgout e os probes de páginas anônimas). Altere o funcionamento do algoritmo de troca de páginas e então colete as informações novamente. Estabeleça comparações entre as definições formais dos algoritmos e as observações práticas utilizadas pelo DTrace, apontando quais características do algoritmo levaram a uma mudança de comportamento na paginação. Dica: ao editar o arquivo /etc/system, é possível alterar alguns parâmetros do kernel, inclusive relativos a paginação (é necessário reiniciar o sistema operacional!). Observe que é necessário ter o sistema em um estado conhecido em ambos os casos, caso o SO seja reiniciado. 2) Como seria uma implementação dinâmica que substitua parcialmente o vmstat(1M)? Implemente um script em linguagem D que seja capaz de fornecer as principais informações com efeito de probe zero. Dica: utilize o provider PROFILE, que rastreia interrupções de relógio. 3) Crie um script em linguagem D que conte os page-ins e page-outs para um determinado processo. Dica: utilize predicados. 4) Crie um script em linguagem D que rastreie todos os probes acionados por um processo dentro do provedor vminfo (memória virtual). Exiba as estatísticas agrupadas para cada probe (isto é, dado um determinado processo, faça um script D que exiba estatísticas de page-in, page-outs, acessos à memória anônima, minor faults, major faults, etc.). Neste caso, será essencial utilizar arrays associativos. 5) Após iniciar um processo, execute um script D que reconheça o momento (e a quantidade) em que as páginas são liberadas. Faça estatísticas e compare a liberação de páginas anônimas, do sistema de arquivos e páginas de executáveis. 6) Descubra a quantidade de páginas trocadas com o disco (swap) através dos respectivos probes. Crie um script D que gere estatísticas para um determinado processo. Utilize arrays associativos. 7) Crie um script em linguagem D que contabilize o número de major faults para um determinado processo. 8) Pesquise sobre as ferramentas vmstat(1M) e kstat(1M), que fornecem estatísticas sobre o estado da memória RAM e o kernel (incluindo dados de memória, é claro), respectivamente. Quais são as informações que podem ser obtidas com essas ferramentas? Sabendo que a ferramenta vmstat(1M) está sob a biblioteca libdtrace(3LIB), quais as vantagens e desvantagens dessa implementação em comparação com a criação de um script em linguagem D? As questões a seguir envolvem o minix: 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. 9) Estouro de pilha: descobrir onde acontece e colocar um breakpoint quando ocorre a excessão (interrupção) avisando do estouro de pilha usando o bochs. Fazer um processo chamar recursivamente uma rotina até dar o estouro de pilha. Escrever no relatório como o minix trata do estouro de pilha e colocar o print screen na tela mostrando a entrada dessa interrupção no bochs. 10) O minix faz uso do pentium para alocar uma área para o processo e para isso ele acerta a base e o limite da área alocada; ou seja, é necessário um processador que gere uma excessão (interrupção) caso ele acesse uma área fora de seus limites. Expliqiue que instruções do pentium o minix usa para fazer essa reserva de área. Isso é feito pelo PM ou pelo microkernel? (deve ser pelo microkernel). Invasão em área de outro processo: descobrir onde acontece e colocar um breakpoint lá usando o bochs. Escrever como a rotina de interrupção trata dessa invasão. 11) Em que situacões quando um processo morre seus filhos vão para o pai e em que situacoes os filhos morrem junto? No minix, os processos filhos podem se tornar do avô quando o pai é morto; mas em que situações os filhos morrem com o pai? Experimente esses casos e apresente no relatório. 12) Replique o seguinte exercício apresentado à turma do ano passado: 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. A resposta dada pela turma está em: resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4_brunogrisi.zip Faça com que a informação sobre o tipo de segmento (código/dado) esteja na mesma linha onde está "fork", "exec", etc. 13) Replique o seguinte exercício apresentado à turma do ano passado: 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. A resposta dada pela turma está em: resp: http://www.pcs.usp.br/~jkinoshi/2008/projs/r4_brunogrisi.zip Faça um programa que fique em loop executando o fork e veja o que ocorre no log. O processo deverá fazer algo como: while (1) { fork(); } Esse tipo de processo vai travar o sistema porque vai consumir toda a memória. Fique apresentando o log na tela do computador. Tire printscreens da tela enquanto o processo que gera processos roda. Fase 5 1 - montar um filesystem em um diretório não vazio. É possível montar o seu pendrive com o diretório /etc em cima do /etc original do Linux, mas para isso é necessário ter a senha de root. Um arquivo importante é /etc/passwd que contém os users. O seu pendrive pode ser feito de tal forma que, crie um usuário novo ou altere a senha do root. Experimente fazer uma experiência: troque a senha de root ao montar o seu pendrive. Assim, é possível entender que se alguém pudesse executar o comando "mount" não tendo a senha de root poderia invadir um sistema. Faça essa experiência e gere um relatório sobre isso. 2 - De fato não é necessário ter o poder de root para se executar alguns comandos. O comando passwd que altera a senha roda com o poder de root que é o owner do arquivo. Troque a permissão do passwd (retire o stick bit) e veja que você nào consegue mais alterar a sua senha de usuário normal. Experimente levantar o stick bit do comando "mount" e veja se agora é possível montar um filesystem mesmo sendo um usuário normal. Faça essa experiência e gere um relatório sobre isso. 3 - Faça um relatório explicando como funciona o ext2 e o ext3. Explique como o ext2 foi criado, onde ficam os i-nodes, se os i-nodes podem ser criados e destruídos, tamanho máximo de um arquivo, número máximo de arquivos, etc. 4 - Faça um script dtrace que monitora todos os acessos ao arquivo /etc/passwd (ou correspondente no opensolaris). Veja que esse arquivo é acessado toda vez que um log é feito ou que uma senha é alterada. 5 - O opensolaris tem varios niveis de seguranca e não apenas usuário x superusuário. No opensolaris um programa em C pode pedir permissão para utilizar apenas system calls que lidam com a rede, por exemplo, e depois do uso retirar suas permissões. CCrie um dscript que monitora que aplicativos rodam com quais privilégios, mostrando quando eles recebem/devolvem privilégios. 6 - Como funciona o filesystem do Windows Vista? (Como ele sabe quais blocos pertencem a quais arquivos? Compare com os inodes. Como ele gerencia os blocos livres?). 7 - É possível travar apenas uma parte de um arquivo por um processo. Como isso é feito? Faça experiências sobre isso no Linux. 8 - Estude e explique como funciona o Log Structured Filesystem. Como os i-nodes são mapeados? O que é escrito no log? Compare esse filesystem com outros em termos de desempenho. Quais são os projetos com LFS no Linux? Qual é o mais promissor? 9 - Faça um relatório comparando diversos FileSystems. Foque no ZFS do opensolaris mostrando as vantagens (e possíveis desvantagens). 10 - grupo x usuários - criar grupos de usuário e dar permissao ao grupo. Fazer com que o usuario pertença a dois grupos diferentes: g1 e g2, sendo que ele tem acesso a um conjunto de arquivos quando g1 e outro conjunto quando g2. Mostrar como o usuario acessa os arquivos quando g1 e quando g2. Rodar no linux. 11 - o LFS (log structured filesystem) foi criado originalmente para o Sistema Operacional Sprite. Muitos sistemas operacionais são descontinuados devido à dificuldade em acrescentar novas funcionalidades à medida que o kernel cresce. Um caso de sucesso é o Linux. Pesquise como o Linux vem se modificando ao longo do tempo e como funciona o gerenciamento do kernel - quem são os desenvolvedores, as propostas de alteração, como as propostas são aceitas, etc. Pesquise também como funciona o gerenciamento do Mozilla e compare ambos os projetos. 12 - Explique como funciona o filesystem do minix, como são gerenciados os blocos vazios, e como funciona o cache em memória dos blocos. 13 - Como funciona o RAID? É mais algo de hardware ou o sistema operacional deve estar ciente de seu uso? 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.