AMBIENTES OPERACIONAIS 1.1 Uma revisão de arquitetura dos computadores Arquitetura: conjunto de recursos existentes a nível de hardware, utilizados para suportar a implementação dos níveis de software. As camadas de software (sistema operacional, aplicativos, programas de usuário) facilitam a utilização do computador, mas, ao fim e ao cabo, as ações do computador são realizadas pelos componentes de hardware, os quais são diretamente acionados por instruções de máquina executadas pela unidade central de processamento (UCP). Componentes de uma arquitetura: Conjunto de instruções Tipos de dados e organização da memória Modos de endereçamento à memória Registradores acessíveis ao programador Entrada / saída e sistema de interrupção Modelo de Von Newmann Na década de 40, John Von Newmann propôs um modelo de máquina onde os programas e os dados usados por ele eram armazenados na memória (máquina de programa armazenado). Ainda hoje, os computadores digitais são baseados neste modelo, o qual é composto de cinco unidades essenciais: Unidade Lógica e Aritmética (ULA), Unidade de Controle (UC), Memória (MEM), Unidade de Entrada (UE) e Unidade de Saída (US): Memória Un. Entrada ULA UC Un. Saída Unidade Central de Processamento Figura 1 – Modelo de Von Newmann AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 1 Na figura 2, os componentes da arquitetura são considerados em detalhe. As linhas finas (1, 6, 10 e 11) são usadas para o envio de sinais de controle (barramento de controle) e as demais são usadas para tranferir dados e endereços. Na verdade, a única linha para envio de endereços é a 7, conforme será explicado a seguir. MEMÓRIA 9 8 2 10 Unidade de Entrada 12 6 7 Unidade de Controle 4 11 Unidade de Saída 1 3 Unidade de Lógica e Aritm. 5 Figura 2 – Modelo de Von Newmann mais detalhado Unidade de Lógica e Aritmética (ULA): A ULA é a parte do computador onde são realizadas as operações aritméticas (soma, subtração, multiplicação, etc.), bem como as operações lógicas (and, or, etc.) sobre os dados. A operação a ser executada é determinada pelo sinal que a UC envia para a ULA (seta 1 na figura 2). Os dados a serem operados podem vir tanto da memória (seta 2) quanto da Unidade de Entrada (seta 3). Os resultados das operações realizadas pela ULA podem ser transferidos tanto para a memória (seta 4), quanto para a Unidade de Saída (seta 5). Memória: A Unidade de Memória é organizada como uma seqüência de células, denominadas palavras (em inglês, words)1, cada célula possuindo um endereço único e podendo ser acessada individualmente. Cada palavra armazena um grupo de dígitos binários que pode representar um dado ou uma instrução. Portanto, a memória contém os dados a serem operados e as instruções (programa) para manipular os dados ou acionar as unidades de entrada e saída (E/S). A operação da memória (leitura ou escrita) é controlada pela UC, que envia o sinal informando o tipo de operação (seta 6). O endereço de memória a ser acessado é enviado pela UC, através do barramento de endereços (seta 7). As informações podem ser escritas na memória a partir da ULA (seta 4) ou da Unidade de Entrada (seta 8), novamente sob controle da UC. As 1 Em alguns computadores atuais, a célula corresponde a um BYTE (conjunto de 8 bits), sendo uma palavra um múltiplo de 8 bits (normalmente, 32 bits, isto é, 4 bytes). AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 2 informações podem ser enviadas da memória para a ULA (seta 2) ou para a Unidade de Saída (seta 9). Unidade de Entrada: A Unidade de Entrada é o dispositivo que permite a entrada de dados a partir do ambiente externo. Esses dados podem ser introduzidos na memória (seta 8) ou na ULA (seta 3). A UC determina para onde a informação de entrada será enviada (seta 10). Hoje em dia um computador admite utilizar vários tipos de periféricos como unidades de entrada (teclado, mouse, digitalizadores de imagens, unidades de CDROM, etc.). Unidade de Saída: A Unidade de Saída é o dispositivo que permite a saída de informações para o ambiente externo. A Unidade de Saída é dirigida pela UC (seta 11) e pode receber dados da memória (seta 9) ou da ULA (seta 5) os quais são colocados então na forma apropriada para o uso externo. Hoje em dia um computador admite vários tipos de periféricos como unidades de saída (terminais de vídeo, impressora, discos magnéticos, etc.).2 Unidade de Controle: A UC dirige a operação de todas as unidades, fornecendo os sinais de controle que acionam os diversos componentes do hardware. Esta unidade contém circuitos lógicos e de temporização (ou de sincronização) que geram os sinais necessários à execução de cada instrução de um programa. A UC busca uma instrução na memória enviando um endereço (seta 7) e um comando de leitura (seta 6) para a memória. A palavra de instrução armazenada é então transferida para a UC (seta 12). Esta palavra de instrução é decodificada pelos circuitos lógicos da UC para determinar a ação a ser executada (adição, subtração, carga de registrador, etc.). A UC utiliza esta informação para gerar os sinais necessários para a execução da instrução. Mais detalhes são apresentados na seção a seguir. A Unidade Central de Processamento e o Mecanismo de Acesso à Memória A Unidade Central de Processamento (UCP ou CPU, do inglês Central Processing Unit) é composta pela UC e pela ULA. Além destes componentes, a UCP contém um conjunto de registradores. Um registrador é uma unidade de armazenamento de informação interna, de acesso muito rápido, podendo ser de uso geral ou específico. Um registrador tem uma capacidade de armazenamento que varia de 8 a 64 bits. A estrutura dos registradores (quantidade, tipo, tamanho, etc.) varia de processador para processador e é uma das características que definem uma arquitetura. A organização básica de uma UCP é mostrada na figura 3. 2 O modelo de Von Newmann não inclui unidades que sirvam de entrada e saída (discos magnéticos, por exemplo). Nas máquinas atuais, estes periféricos são essenciais, sendo referidos como dispositivos de armazenamento secundário ou auxiliar. Eles possuem uma característica importante: após serem acionados pela UC, são capazes de transferir grandes volumes de dados de/para a unidade de memória (memória RAM), através de um mecanismo denominado DMA (Direct Memory Access). AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 3 a Registrador de endereço (REM) Registrador de dados (RDM) MEMÓRIA ULA b Contador de prog. (PC) Registrador de inst. (RI) Decodificador de instruções Gerador de sinais controle Unidade de Controle Figura 3 – A UCP e o mecanismo de acesso à memória - Registradores REM e RDM Todo e qualquer acesso à memória é feito através desse par de registradores, o qual faz parte do mecanismo de acesso à memória. O registrador REM (registrador de endereço) contém o endereço da célula (word ou byte) a ser acessada na memória. O RDM (registrador de dado) serve como entrada ou saída. Em uma uma operação de escrita, é necessário colocar previamente no RDM o dado a ser escrito na célula indicada no REM. Em uma operação de leitura, o RDM vai receber o dado lido da célula indicada no REM. Portanto, considerado de forma isolada, o controlador de memória é um hardware que transfere dados entre o RDM e a memória. Se a memória do computador é formada por vários módulos e cada um possui seu próprio mecanismo de acesso, então é possível realizar acessos simultâneos à memória (desde que os acessos envolvam módulos diferentes). Caso contrário, os acessos têm que ser serializados e realizados um por vez. - Contador de Programa (PC) O contador de programa (Program Counter) é o registrador que indica o endereço (localização na memória) da próxima instrução a ser executada. Durante a execução de uma instrução, esse contador é incrementado com o valor do tamanho da instrução, de modo que ele passe a conter o endereço da instrução seguinte. O tamanho do PC é igual ao número de bits de endereço que o microprocessador pode manipular. Assim, se a máquina trabalha com endereços de 16 bits, o PC terá 16 bits. O contador de programa também pode ser referido por IC (do inglês Instruction Counter) ou IP (Instruction Pointer). AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 4 - Registrador de Instruções (RI) Quando a UC busca uma instrução na memória, o código de operação da instrução vem para o registrador denominado RI (Registrador de Instruções). Este registrador é utilizado somente pelo microprocessador, não podendo ser acessado pelo programador. A instrução fica armazenada no RI enquanto o decodificador de instruções a analisa. Se a instrução tem um operando (endereço de dado a ser operado), o mesmo é colocado no REM (isto é, o endereço do dado a ser utilizado na execução da instrução é copiado do RDM para o REM – isto é indicado pela seta a, na figura acima). No caso de uma instrução de transferência, o operando é copiado para o PC (seta b, na figura acima), pois, nesse caso, o operando é o endereço da próxima instrução a ser executada. - Decodificador de Instruções O decodificador de instruções tem a função de analisar a instrução presente no RI e, de acordo com a mesma, enviar a codificação apropriada ao gerador de sinais de controle. - Gerador de Sinais de Controle O gerador de sinais de controle gera os sinais que dirigem o funcionamento de todas as unidades de hardware. Para cada instrução decodificada, são enviados os sinais de sincronização e de controle que colocam em ação os componentes envolvidos na execução da instrução. - O registrador PSW (Processor Status Word) O registrador “palavra de estado do processador” ou simplesmente “registrador de estado”, não fazia parte da máquina de Von Newmann (nem existia nos computadores mais antigos). Contudo, ele é essencial para o funcionamento de um sistema operacional moderno e, atualmente, faz parte de qualquer UCP. O uso desse registrador passou a ser necessário quando os computadores começaram a utilizar sistemas de interrupção, conforme será explicado adiante. - O registrador SP (Stack Pointer) O registrador “ponteiro da pilha” (em inglês, stack pointer) é outro que não existia na máquina de Von Newmann, mas que hoje em dia faz parte da UCP de quase todos os computadores. Ele é necessário porque todo programa em execução precisa usar uma pilha para realizar chamadas e retornos de procedimentos. Assim, cada programa possui uma pilha própria e o registrador SP indica o topo da pilha do programa correntemente em execução. Quando a execução passa de um programa para outro, o valor do SP é alterado de modo que ele passa a apontar para a pilha do novo programa em execução. AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 5 O ciclo sem fim da UCP A UCP funciona repetindo indefinidamente o processo de busca, decodificação e execução de instrução. Isto se repete até que seja executada uma instrução especial, normalmente denominada HALT, que faz a UCP parar. Esta instrução é protegida e não pode ser executada diretamente por um programa de usuário (instruções protegidas serão consideradas adiante, nos modos de execução da UCP). Desta maneira, desde que o computador é ligado, a “vida da UCP” consiste em repetir o ciclo: 1. 2. 3. 4. busca instrução analisa (decodifica) a instrução executa a instrução volta ao passo 1 Na verdade, nos computadores atuais, após executar o passo 3 e antes de executar o passo 4, a UCP verifica os sinais de interrupção e, se ocorreu alguma interrupção, o hardware coloca no PC, automaticamente, o endereço da rotina3 que trata da interrupção sinalizada. Deste modo, a instrução buscada no passo 1 será a primeira instrução da rotina de interrupção. A seguir é detalhada a transferência de dados entre os elementos da UCP, por ocasião no primeiro passo do ciclo (busca da próxima instrução): 1. 2. 3. 4. 5. REM PC Sinal de leitura para o controlador de memória (enviado pela UC) RDM Mem[REM] RI RDM PC <- PC + tamanho da instrução Os cinco passos acima constituem o ciclo de busca da instrução (instruction fetch cycle). O tempo necessário para executar o ciclo de fetch é constante para cada computador. Já o tempo para executar uma instrução é variável, pois depende do tipo da instrução e do modo de endereçamento utilizado na mesma. A execução da instrução (geração dos sinais que acionam os componentes eletrônicos) é realizada no denominado ciclo de execução da instrução (execution cycle). Conforme visto acima, desde que o computador é ligado, o que a UCP faz é repetir o ciclo “busca, decodificação e execução de instrução”. Portanto, desde o início, já deve haver um programa na memória para ser executado. A existência do software de controle na memória é garantida através de um processo automático (realizado de forma automática pelo hardware), denominado carga inicial ou bootstrapping. O processo de bootstrapping Quando o computador é ligado, automaticamente o hardware executa um pequeno programa que está gravado em ROM (memória permanente). Esse pequeno programa faz a carga de um programa maior (que está no disco do sistema) e transfere a 3 O mecanismo de interrupção, responsável pela carga do endereço da rotina de interrupção no PC é descrito adiante. AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 6 execução para ele. O programa maior, por sua vez, faz a carga do kernel e dos processos do SO, bem como faz a inicialização das estruturas de dados do sistema, e, finalmente, transfere a execução para o SO. Este procedimento de carga do SO é conhecido como bootstrapping. Observe que durante todo o tempo, desde a execução inicial do pequeno programa armazenado em ROM, o que a UCP faz é simplesmente repetir o seu ciclo infinito. Considerando que a UCP é capaz de executar um conjunto relativamente pequeno de instruções, é impressionante o resultado obtido pelo SO. De fato, há quem diga que um elefante é um rato com um SO (isto significa que um SO conseguiria dar a um rato o poder de um elefante). O mecanismo de interrupção Hoje em dia, praticamente todos os computadores são dotados de um mecanismo de interrupção. Neste caso, a UC, logo após terminar a execução de uma instrução (antes de iniciar o ciclo de fetch da próxima instrução) verifica as linhas de interrupção para ver se alguma interrupção foi sinalizada. Se foi, o hardware, automaticamente, salva os registradores da UCP na pilha do programa que estava em execução e carrega no PC o endereço da rotina que trata da interrupção que foi sinalizada (as rotinas de interrupção fazem parte do kernel do Sistema Operacional). O mecanismo de interrupção é fundamental para a organização e o funcionamento dos sistemas operacionais modernos. Pode-se dizer que as interrupções são as forças que movimentam e dirigem os SOs. Na verdade, um SO só recebe o controle da UCP (só trabalha) quando ocorre alguma interrupção. Essas “forças motrizes” podem ser geradas por hardware ou por software. - Interrupção de hardware Uma interrupção de hardware é um sinal originado em algum dispositivo físico, que faz com que a UCP suspenda a execução do programa que vinha executando (guardando informações para continuar a execução desse programa, mais tarde) e passe a executar uma rotina específica que trata da interrupção ocorrida. Interrupções de hardware são geradas pelos vários dispositivos periféricos (disco, impressora, teclado, etc.) ou pelo relógio (timer). O relógio é um dispositivo que decrementa automaticamente o conteúdo de um registrador, com uma freqüência constante, e interrompe a UCP quando o valor do registrador atinge zero. O SO garante que ocorra pelo menos uma interrupção (e ele volte a trabalhar) dentro de um tempo T, colocando no relógio um valor que demore T unidades de tempo para ser decrementado até zero (o SO faz isso antes de entregar a UCP para um programa de usuário). Os computadores possuem instruções especiais para desabilitar (mascarar, inibir) o sistema de interrupção. Enquanto as interrupções estão desabilitadas elas podem ocorrer, mas não são sentidas pelo processador. Nesse caso, elas ficam pendentes (enfileiradas) e só voltam a ser sentidas quando a UCP executa uma instrução especial que habilita (desmascara, desinibe) as mesmas. AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 7 - Interrupção de software (trap ou system call) Uma interrupção de software é um sinal de interrupção gerado por uma instrução especial (portanto, por software) denominada chamada do sistema (system call) ou chamada do supervisor (supervisor call). Alguns autores também chamam as interrupções geradas por software de traps (armadilhas). Um trap desencadeia as mesmas ações desencadeadas por uma interrupção de hardware, isto é, o programa em execução é suspenso, informações são salvas e uma rotina específica do SO é executada. A diferença fundamental entre as interrupções de software e as de hardware é que as primeiras (traps) são eventos previsíveis. Isto é, dado um programa e seus dados, é possível determinar os pontos em que as interrupções de software irão ocorrer. Por outro lado, as interrupções de hardware são geradas por dispositivos periféricos (para sinalizar erros ou finais de operações) em pontos que são imprevisíveis. É comum que a denominação interrupção seja subentendida como interrupção de hardware. Esta convenção será usada daqui para a frente. As interrupções de software serão referidas explicitamente por traps ou chamadas do sistema. Pode-se dizer que à cada interrupção ou trap corresponde uma porta de entrada no SO e que a execução só entra no SO através de uma dessas portas. A seguir é explicado o mecanismo que faz a UCP transferir automaticamente a execução para a porta de entrada correta, quando ocorre uma interrupção ou um trap. Tabela de interrupções Em tempo de projeto do computador, é escolhida uma área da memória para conter uma tabela, denominada tabela de interrupções, que irá conter uma linha (entrada) para cada interrupção ou trap que possa ocorrer no sistema. Cada entrada da tabela contém dois valores: um para ser carregado no PC (program counter) e outro para ser carregado no registrador de estado. O registrador de estado é normalmente referido como PSW (Processor Status Word) e já foi citado anteriormente. Trata-se de um registrador especial que fornece basicamente duas informações: quais as interrupções que estão habilitadas e qual é o modo de execução4 atual da UCP. O hardware é projetado e construído de tal maneira que, quando ocorre uma interrupção ou um trap, a UCP salva automaticamente os conteúdos do PC e da PSW na pilha do programa que estava em execução e carrega novos valores nesses dois registradores, a partir da entrada correspondente da tabela de interrupções. Em tempo de carga do SO, a tabela de interrupções é inicializada corretamente, de modo que cada entrada passa a indicar uma rotina do Kernel do SO. Os modos de execução da UCP Os traps surgiram (tornaram-se necessários) quando os projetistas de computadores e de sistemas operacionais decidiram proibir o uso de certas instruções para os programas de usuário. As instruções proibidas são ditas protegidas ou privilegiadas. 4 O modo de execução pode ser normal (isto significa que um programa de usuário está em execução) ou privilegiado (significa que o SO está em execução). AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 8 Tratam-se de instruções perigosas, pois o uso incorreto delas (intencional ou não) pode gerar problemas para o SO. Portanto, estas instruções devem ficar para uso exclusivo do SO. Exemplos são instruções para desabilitar interrupções e instruções para acionar periféricos. Este controle no uso de instruções é conhecido como proteção de controle5 ou proteção de instruções. Para implementar esta proteção, o hardware teve que passar a distinguir dois modos de processamento: modo privilegiado (também chamado de modo supervisor, modo sistema ou modo mestre) e modo normal (também chamado de modo usuário, modo programa ou modo escravo). Se a UCP, no modo normal, tenta executar uma instrução protegida, a UC gera um trap do tipo “instrução ilegal” (illegal instruction trap). Sendo assim, sempre que um programa de usuário precisa realizar uma operação que envolva alguma instrução privilegiada, ele tem que passar o controle para o SO, mudando o modo de execução. Aqui chegamos a um ponto que é muito importante para o entendimento do esquema utilizado (aqui os projetistas deram o “pulo do gato”). Observe que a instrução de transferência para o SO não poderia ser protegida, pois esta instrução seria executada por um programa de usuário. Também não poderia ser uma instrução de transferência simples, pois isto permitiria transferir a execução para qualquer ponto do SO, sem controle. Tampouco poderia ser uma instrução de transferência para subrotina com troca (automatica) do modo para privilegiado, pois uma instrução destas poderia ser usada por um usuário mal intencionado para obter o controle total da máquina. Era necessário, portanto, que a instrução de transferência para o SO tivesse alguma “armadilha” associada, para pegar intrusos. Daí vem o nome trap (armadilha) para o esquema adotado. A solução dos projetistas foi a de permitir a ação de transferir a execução para o SO (com troca para modo privilegiado) apenas para pontos fixos e bem definidos do SO, através da tabela de interrupções6. Nestas poucas portas de entrada, o SO pode fazer as verificações que julgar necessárias e implementar as armadilhas que desejar. Hoje em dia, praticamente todos os computadores possuem instruções privilegiadas e dois modos de processamento. Sempre que ocorre uma interrupção ou um trap, a UCP passa para o modo privilegiado. Posteriormente, ao devolver o controle para um programa de usuário, o SO recoloca a UCP no modo normal. Quando um programa de usuário precisa realizar uma operação que envolva instrução protegida, o mesmo tem que executar um trap, passando como argumentos para o SO a identificação da operação e os parâmetros para a sua execução. Um sistema de interrupção típico A seguir é apresentada uma arquitetura clássica de computador. Trata-se do minicomputador PDP-11, muito popular na década de 70, sobre o qual foi implementado o primeiro sistema operacional UNIX. As arquiteturas dos computadores atuais seguem os mesmos princípios básicos. 5 Outro tipo de proteção implementado por hardware é a proteção de memória. A proteção de arquivos (informações) é normalmente implementada por software. 6 Observe que a tabela de interrupções também precisa ficar protegida contra acessos de usuários. AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 9 No PDP-11, os registradores da UCP eram nove: PC (program counter), PSW (Processor Status Word), SP (stack pointer) e seis registradores de uso geral R0, R1,...R5. A palavra de estado do processador (PSW) possuía um bit especial para indicar o modo de processamento (1 = modo supervisor, 0 = modo usuário). Além disso, a PSW tinha um campo de três bits para mascarar interrupções. Quando o valor desse campo era 7, todas as interrupções estavam desabilitadas. Quando o valor era 0, todas as interrupções estavam habilitadas. Quando o valor era n (n<7), qualquer dispositivo com prioridade maior que n podia interromper. As prioridades dos dispositivos variavam de 1 a 7. Cada programa utilizava uma pilha própria e o topo da pilha do programa em execução era apontado pelo registrador SP. Sempre que ocorria uma interrupção (ou era executado um trap), o hardware salvava automaticamente os valores do PC e da PSW no topo da pilha corrente e carregava novos valores nesses dois registradores, a partir da tabela de interrupções (localizada em uma área fixa da memória). O novo valor do PC era o endereço da rotina correspondente à interrupção ocorrida. O novo valor da PSW continha 7 no campo para mascarar interrupções e 1 no bit para indicar o modo de execução. Portanto, após a mudança de contexto, a UCP passava a trabalhar com interrupções desabilitadas e no modo privilegiado. Era função da rotina de interrupção salvar os demais registradores da UCP (SP e registradores de uso geral R0, R1, ..., R5). Para voltar a executar um programa de usuário, existia uma instrução especial denominada RTI (ReTurn from Interrupt) cuja execução consistia em carregar os registradores PC e PSW com os valores contidos na pilha corrente (apontada pelo SP). As últimas ações do SO, após arealização do seu serviço (isto é, após o atendimento da interrupção), eram: (1) escolher o próximo programa a ser executado, (2) restaurar os valores dos registradores SP, R0, R1, ..., R5, correspondentes a esse programa, e (3) executar a instrução RTI. A figura 4 mostra os principais componentes envolvidos no tratamento de interrupções. interrupção (salva estado) Programa de usuário (modo normal) Sistema Operacional (modo privilegiado) retorno de interrupção (restaura estado) SP Tipos de interrupções: interrupção de periférico interrupção do relógio interrupção de proteção (erro de execução) chamada do sistema ou trap PC PSW ... ... PILHA (após uma interrupção) Figura 4 – Principais elementos de um sistema de interrupção AMBIENTES OPERACIONAIS Revisão de arquitetura dos computadores Prof. Simão Sirineo Toscani p. 10