Processos no Minix 3.1.7 Prof. Alexandre Beletti Conteúdo do Material Visão de Geral Processos no Minix (2.5 3ª ed.) Implementação de Processo (2.6 3ª ed.) Estrutura do Código Fonte Arquivos de include 1
Estrutura em Camadas Alguns detalhes Modo núcleo x Modo kernel A Tarefa de Sistema e o Relógio tem seu escalonamento realizado separadamente Boa parte de código do Minix é escrito em C Tratamento de Interrupções e Chaveamento de Processos é escrito em Assembly 2
Chamadas de Núcleo x de Sistema Chamadas de Núcleo = funções de baixo nível fornecidas pela Tarefa de Sistema para permitir que drivers e servidores trabalhem (Ex: ler uma porta de E/S) Chamadas de Sistema (POSIX) = chamadas de alto nível disponíveis para os programas de usuário (Ex: read, fork e unlink) Daemon Processo em segundo plano executando periodicamente e que espera a execução de algum evento Servidor iniciado independentemente e executado como um processo de usuário 3
Inicialização da Árvore de Processos Init = primeiro processo de usuário e o último processo a ser carregado como parte da imagem de boot, possui PID = 1 CLOCK e SYTEM não tem PID (na verdade possuem PID negativo) PM = primeiro processo a ser executado em espaço de usuário, possui PID = 0 Principais Componentes do Minix 4
Init (PID = 1) Init se torna um dos filhos do RS, assim como outros servidores Executa o script: /etc/rc Esse script inicia drivers que não fazem parte da imagem do kernel Todo programa executado por esse script será filho de Init Um dos primeiros é o utilitário service RS (PID = 4) RS = Reincarnation Server O service é a interface do usuário com o RS Inicia um programa padrão e o converte em processo de sistema Por exemplo o servidor is Adota como filho todos os processos de sistema, exceto o gerenciador de processos 5
/etc/rc = Outros detalhes Executar alguns servidores e comandos /sbin = servidores e drivers /bin = alguns comandos p/ inicialização Montar o diretório Verificar erros no sistema de arquivos Verifica a última linha de /usr/adm/wtmp Se for o comando shutdown então OK Senão faz uso do fsck Init + Login (getty + sh) Init lê o arquivo /etc/ttytab (lista com terminais) Por padrão até 3 consoles virtuais (ttyc1 a ttyc3) Existe uma entrada no campo getty (/etc/ttytab) Init cria um proc.filho para cada terminal de login Cada filho executa /usr/bin/getty que imprime uma msg e espera o login Nome de usuário e senha verificados por /usr/bin/login Se login OK, chama /bin/sh (veja /etc/passwd) 6
Estrutura do Código Fonte Source CADAMA 1 - Kernel Diretório: /usr/src/kernel Contéudo: Escalonador, Mensagens, Relógio e Tarefas de Sistema CAMADA 2 - Drivers Diretório: /usr/src/drivers Conteúdo: Drivers de disco, console, impressora. CAMADA 3 - Servers Diretório: /usr/src/servers Conteúdo: PM, FS, etc. 7
Compilando o Kernel Acesse o diretório: /usr/src/tools Digite: make image O que ocorre na compilação: kernel/ = Binário do núcleo servers/pm = Binário do PM (Process Management) servers/fs = Binário do FS (File System) servers/rs = Binário do RS (Reincarnation Server) drivers/memory drivers/log drivers/tty Imagem de Boot= (kernel + PM + FS + Init...) Diretório da Imagem = /boot Arquivos de include 8
Arquivos de Include /usr/src/include signal.h = Sinais de Processos fcntl.h = Símbolos de operações com arquivos sys/dir.h = Estrutura de Diretórios minix/config.h = Alterações do Hardware minix/sys_config.h = Definições para um programador de sistemas minix/type.h = Mapa de Memória signal.h 9
signal.h dir.h 10
IPC - Mensagens 7 formatos distintos de mensagens (mess_1 a mess_8, exceto mess_6) Campos de Mensagem m_source = origem m_type = tipo (Ex: SYS_EXEC) Primitivas de comunicação: send = Envio de Mensagem (Bloqueante) receive= Recebimento (Bloqueante) sendrec = Envio/Receb. (Bloqueante) notify = Notificação (NÃO BLOQUEANTE!) ipc.h - Tipos de Mensagens 11
ipc.h Estrutura da Mensagem ipc.h Primitivas de Mensagens 12