Mudanças entre as edições de "SOP29005-2019-2"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '==AULA 1 - Dia 30/07/2019== ===Objetivos/Conteúdos=== *Apresentação do Plano de Ensino **Objetivos e Conteúdo Programático da Disciplina (ver SIGAA) **Forma de Avaliação...')
 
Linha 1: Linha 1:
==AULA 1 - Dia 30/07/2019==
+
=AULA 1 - Dia 30/07/2019=
  
 
===Objetivos/Conteúdos===
 
===Objetivos/Conteúdos===
Linha 85: Linha 85:
 
</li>
 
</li>
 
</ol>
 
</ol>
 +
 +
==AULA 2 - Dia 2/08/2019==
 +
 +
===Objetivos/Conteúdos===
 +
 +
*Continuação da Aula
 +
*Estruturas do Sistema Operacional (cap.2)
 +
**Serviços do Sistema Operacional (2.1)
 +
**Interfaces com Usuários (2.2)
 +
**Chamadas do Sistema (2.3)
 +
**Tipos de Chamadas de Sistema (2.4) ver Fig.2.8
 +
***Chamadas de Controle de Processos
 +
**Arquiteturas e Estruturas de Sistemas Operacionais (2.7)
 +
**Máquinas Virtuais (2.8)
 +
 +
===Material de Referência===
 +
 +
* [http://docente.ifsc.edu.br/arliones.hoeller/sop/slides/SOP29005-parte1.pdf Apresentação sobre histórico visão geral
 +
* [http://www.fil.univ-lille1.fr/~sedoglav/OS/TP.html ]
 +
 +
===Leitura Recomendada===
 +
 +
*Cap.2 do Silberschatz principalmente:
 +
**2.1 a 2.8
 +
 +
===Exercícios===
 +
 +
<ol>
 +
<li> Estudar e executar o código em http://cs.lmu.edu/~ray/notes/gasexamples/
 +
Detalhes das chamadas na arquitetura x86_64 ver em https://lwn.net/Articles/604287/
 +
<li>Estudar e executar o código usando a função (em conformidade com a API POSIX)  write() para o ''hello world'':
 +
<code>
 +
#include <unistd.h>
 +
 +
main()
 +
{
 +
  write(1,"Alo Mundo\n",10);
 +
}
 +
</syntaxhighlight>
 +
</li>
 +
<li> Use o comando strace para verificar todas as chamadas de sistema dos programas acima.
 +
</li>
 +
<li>
 +
    DESAFIO 1: Estude a seção "Mixing C and Assembly Language" da http://cs.lmu.edu/~ray/notes/gasexamples/ e construa uma função meu_hello_world() usando o código em assembly do exercício inicial. Estude como poderia disponibilizar esta e outras funções de interface (a sua API) em uma biblioteca. Note que esta função deve ser chamada da forma:
 +
<code>
 +
main()
 +
{
 +
  meu_hello_world();
 +
}
 +
</syntaxhighlight>
 +
</li>
 +
Gere o assembly do código em C e discuta a diferença entre uma chamada de função e uma chamada de sistema.
 +
<li>
 +
    DESAFIO 2: Estude o link http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ e melhore a função meu_hello_world para suportar uma mensagem adicional da forma:
 +
<code>
 +
#include <string.h>
 +
main()
 +
{
 +
  char *p="Tudo bem com vocês?";
 +
  meu_hello_world(p, strlen(p));
 +
}
 +
</syntaxhighlight>
 +
Solução:
 +
{{collapse top|Solução}}
 +
<code>
 +
modificado de http://cs.lmu.edu/~ray/notes/gasexamples/
 +
        .global meu_hello_world
 +
 +
        .text
 +
meu_hello_world:
 +
 +
        push    %rdi                    # salva primeiro parâmetro
 +
        push    %rsi                    # salva segundo parâmetro
 +
        mov    $1, %rax                # system call 1 é write
 +
        mov    $1, %rdi                # file handle 1 é stdout
 +
        mov    $message, %rsi          # endereço da string
 +
        mov    $13, %rdx              # número de bytes da string
 +
        syscall                        # chamada ao sistema
 +
 +
        pop    %rdx                    # o que havia sido passado em rsi (número de bytes) é colocado em rdx
 +
        pop    %rsi                    # o que havia sido colocado em rdi (endereço da string) é colocado em rsi
 +
        mov    $1, %rax                # system call 1 is write
 +
        mov    $1, %rdi                # file handle 1 é stdout
 +
        syscall                        # nova chamada ao sistema
 +
 +
        ret
 +
 +
message:
 +
        .ascii  "Hello, World\n"
 +
</syntaxhighlight>
 +
</li>
 +
</ol>
 +
{{collapse bottom}}

Edição das 12h58min de 2 de agosto de 2019

AULA 1 - Dia 30/07/2019

Objetivos/Conteúdos

  • Apresentação do Plano de Ensino
    • Objetivos e Conteúdo Programático da Disciplina (ver SIGAA)
    • Forma de Avaliação (ver SIGAA)
  • Introdução a Sistemas Operacionais (Cap1. do Silberschatz)
    • O que faz um sistema operacional (1.1)
    • Organização e Arquitetura de um Sistema Computacional (1.2 e 1.3)
      • Importância da Interrupção e Timers (1.2.1)
      • Estrutura de Armazenamento (1.2.2)
      • Estrutura de IO (1.2.3)
    • Estrutura e Operações de um Sistema Operacional (1.4 e 1.5)

Material de Referência

Arliones:

Leitura Recomendada

  • Cap.1 do Silberschatz principalmente:
    • 1.1 a 1.9

Exercícios Práticos de Apoio a Aula

Na sequência. com fins motivacionais, são apresentados alguns exercícios ilustrando conceitos de processos, arquivos e permissionamento.

  1. Comando para ver todos os processos no linux: $ ps aux </syntaxhighlight>
  2. Colocar 2 processos se executando no contexto de um terminal e verificar número dos processos e então "destruí-los": $ yes > /dev/null $ yes > /dev/null $ ps $ kill -9 <pid_yes> $ kill -9 <pid_yes> </syntaxhighlight> Observe que dois processos foram criados a partir do programa "yes". Os processos associados ao terminal são visualizados e então destruídos. Tente destruir também o interpretador de comando (shell) associado ao terminal.
  3. Criar um terminal adicional $ xterm </syntaxhighlight> Ir no terminal criado e listar os processos que se executam associados a este terminal. Verificar qual o dispositivo de entrada e saída associado a ele. Voltar ao terminal original e enviar uma mensagem. Destruir o terminal criado: $ echo Alo Terminal > /dev/pts/2 $ kill -9 <pid_terminal> </syntaxhighlight>
  4. Comunicação entre processos: $ cat /etc/passwd | grep home | wc -l </syntaxhighlight>
  5. Retirando a permissão de leitura de um arquivo em nível de usuário proprietário: $ echo Alo Mundo > alfa.txt $ ls -l alfa.txt $ cat alfa.txt $ chmod u-r alfa.txt $ cat alfa.txt $ chmod u+r alfa.txt $ cat alfa.txt </syntaxhighlight>

AULA 2 - Dia 2/08/2019

Objetivos/Conteúdos

  • Continuação da Aula
  • Estruturas do Sistema Operacional (cap.2)
    • Serviços do Sistema Operacional (2.1)
    • Interfaces com Usuários (2.2)
    • Chamadas do Sistema (2.3)
    • Tipos de Chamadas de Sistema (2.4) ver Fig.2.8
      • Chamadas de Controle de Processos
    • Arquiteturas e Estruturas de Sistemas Operacionais (2.7)
    • Máquinas Virtuais (2.8)

Material de Referência

Leitura Recomendada

  • Cap.2 do Silberschatz principalmente:
    • 2.1 a 2.8

Exercícios

  1. Estudar e executar o código em http://cs.lmu.edu/~ray/notes/gasexamples/ Detalhes das chamadas na arquitetura x86_64 ver em https://lwn.net/Articles/604287/
  2. Estudar e executar o código usando a função (em conformidade com a API POSIX) write() para o hello world:
    1. include <unistd.h>
    main() { write(1,"Alo Mundo\n",10); } </syntaxhighlight>
  3. Use o comando strace para verificar todas as chamadas de sistema dos programas acima.
  4. DESAFIO 1: Estude a seção "Mixing C and Assembly Language" da http://cs.lmu.edu/~ray/notes/gasexamples/ e construa uma função meu_hello_world() usando o código em assembly do exercício inicial. Estude como poderia disponibilizar esta e outras funções de interface (a sua API) em uma biblioteca. Note que esta função deve ser chamada da forma: main() { meu_hello_world(); } </syntaxhighlight>
  5. Gere o assembly do código em C e discuta a diferença entre uma chamada de função e uma chamada de sistema.
  6. DESAFIO 2: Estude o link http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ e melhore a função meu_hello_world para suportar uma mensagem adicional da forma:
    1. include <string.h>
    main() { char *p="Tudo bem com vocês?"; meu_hello_world(p, strlen(p)); } </syntaxhighlight> Solução:
    Solução

    modificado de http://cs.lmu.edu/~ray/notes/gasexamples/

           .global meu_hello_world
    
           .text
    

    meu_hello_world:

           push    %rdi                    # salva primeiro parâmetro
           push    %rsi                    # salva segundo parâmetro
           mov     $1, %rax                # system call 1 é write
           mov     $1, %rdi                # file handle 1 é stdout
           mov     $message, %rsi          # endereço da string
           mov     $13, %rdx               # número de bytes da string
           syscall                         # chamada ao sistema
    
           pop     %rdx                    # o que havia sido passado em rsi (número de bytes) é colocado em rdx
           pop     %rsi                    # o que havia sido colocado em rdi (endereço da string) é colocado em rsi
           mov     $1, %rax                # system call 1 is write
           mov     $1, %rdi                # file handle 1 é stdout
           syscall                         # nova chamada ao sistema
    
           ret
    

    message:

           .ascii  "Hello, World\n"
    

    </syntaxhighlight>