Mudanças entre as edições de "SOP29005-2019-2"
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= | |
===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
- Apresentação sobre histórico visão geral e estruturas básicas de um SO
- Slides Silberschatz Oitava Edição
- Tradução Slides Silberschatz
- Livro do Prof.Maziero
- Université Nice Sophia Antipolis
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.
-
Comando para ver todos os processos no linux:
$ ps aux </syntaxhighlight>
-
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.
-
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>
-
Comunicação entre processos:
$ cat /etc/passwd | grep home | wc -l </syntaxhighlight>
-
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
- [http://docente.ifsc.edu.br/arliones.hoeller/sop/slides/SOP29005-parte1.pdf Apresentação sobre histórico visão geral
- [3]
Leitura Recomendada
- Cap.2 do Silberschatz principalmente:
- 2.1 a 2.8
Exercícios
- 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/
- Estudar e executar o código usando a função (em conformidade com a API POSIX) write() para o hello world:
- include <unistd.h>
main()
{
write(1,"Alo Mundo\n",10);
}
</syntaxhighlight>
- Use o comando strace para verificar todas as chamadas de sistema dos programas acima.
-
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>
Gere o assembly do código em C e discuta a diferença entre uma chamada de função e uma chamada de sistema.
-
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:
- 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>