Endereçamento baseado em Capacidade Bruno Brandão Crı́ston Souza Deise Côrtes Romildo Martins Ricardo Dias 6 de junho de 2001 1 2 Introdução 2.1 Em ambientes multiprogramados o esquema de endereçamento de segmentos pode apresentar problemas, como o problema de referência em segmentos compartilhados[1]. Quando um processo está em execução, ele tem acesso a uma tabela que guarda a localização de cada segmento usado pelo programa, chamada de tabela de segmentos. Tabelas de segmento de diferentes processos não são necessariamente iguais1 , mesmo executando o mesmo programa. Suponhamos então que dois processos, A e B, estão executando um código compartilhado. Neste código existe uma referência para uma sub-rotina S. Na tabela de A esta subrotina está na posição x e em B na posição y, com x 6= y. Com qual ı́ndice esta instrução deve referenciar a sub-rotina S na tabela de segmentos? Este é o problema de referência em segmentos compartilhados. Soluções e suas restrições Endereçamento uniforme O mesmo ı́ndice nas tabelas de segmentos de cada processo possuem o mesmo significado. O problema desta solução consta em garantir que não haverá conflitos de endereço, para isto, o sistema Burroughs exige que todos os processos sejam compilados juntos. 2.2 Avaliação indireta Nesta solução, utilizamos uma tabela de segmentos por processo e uma outra tabela chamada segmento de ligação para cada subprograma dentro do processo. Podemos usar qualquer ı́ndice na tabela de segmentos para apontar para os segmentos e utilizamos o segmento de ligação para fazer a conversão do endereço referenciado pela sub-rotina no endereço real do segmento na tabela de segmentos do processo. Logo, se tivermos m processos, cada um com n sub-rotinas, teremos um total de m*(n+2) tabelas de endereçamento no sistema, pois são necessárias ainda um segmento de ligação por programa principal e uma tabela de segmento por processo. Os principais problemas na utilização desta técnica são a necessidade de maior espaço para armazenar os segmentos de ligação e o overhead de processamento para o gerenciamento das indireções. Na seção 2 apresentamos as soluções inicialmente propostas para este problema e suas restrições. Em seguida, na seção 3, mostramos como o problema pode ser solucionado usando capacidades. Considerações que devem ser observadas por quem deseja implementar este mecanismo - endereçamento usando capacidades - em hardware são apresentadas na seção 4. 1 Por razões de flexibilidade, que não discutiremos aqui. 1 4 CONSIDERAÇÕES SOBRE A IMPLEMENTAÇÃO DE CAPACIDADES EM HARDWARE2 2.3 Múltiplas tabelas de segmentos Existe uma única tabela de endereçamento por sub-programa. Logo, endereços na tabela de segmentos não podem mais ser compartilhados por subprogramas do mesmo processo. 3 Solução usando Capabicidades Existe uma tabela de segmentos por processo. Segmentos que já se sabe a priori que serão alocados, são acessados por avaliação indireta, através de um ı́ndice na tabela de segmentos do processo. Já os segmentos que são alocados dinamicamente, são acessados diretamente, usando capacidades. 4 Considerações sobre a implementação de Capacidades em Hardware Implementação por hardware Para utilizar adequadamente a capacidade é necessário que a máquina e o sistema operacional forneça meios para isto. São poucos sistemas que disponibilizam isso. Vários computadores implementam capacidade a nı́vel de sistema operacional, outros possuem potencial para implementação de capacidade, em compensação o sistema operacional não suporta. 4.1 Integridade das Capabicidades É necessário proteger as capacidades contra adulterações por parte de usuários ou programas. Existem duas propostas para manter a integridade das capacidades. A primeira utiliza um bit extra (bit de tag) em cada palavra ou registrador para definir se a informação armazenada é uma capacidade ou não. A configuração do bit de tag é feita pelo processo a cada acesso a palavra e a regra para manter a integridade consiste em: checar se o segmento de endereço é uma capacidade; ao fazer uma cópia de uma palavra deve-se manter o mesmo bit tag da palavra de origem na palavra copiada; o bit tag não é utilizado em operações aritméticas nem de comparação , mas sempre é produzido o bit de tag no resultado da operação. A segunda proposta, chamada partição, consiste em dividir os segmentos em dois tipos: segmentos de dados e segmentos de capacidades. Existe um conjunto de registradores de dados e outro de capacidades. As regras para manter a integridade são semelhantes as da proposta acima e consiste em copiar capacidades somente em segmentos de capacidades e dados em segmentos de dados. A partição possui algumas vantagens, pois os segmentos de capacidades estão em um local definido, separado dos segmentos de dados, mas requer uma forma para acessar e manipular ambos os segmentos. 4.2 Tradução de endereços Quando o hardware tentar acessar um segmento podem ocorrer três situações. O segmento pode estar em memória primária, neste caso a palavra apropriada é acessada. O segundo caso, O segmento pode estar na tabela hash mas não estar na memória primária, neste caso o hardware causa uma exceção de tipo A. O segmento pode não estar na tabela hash, neste caso o hardware causa uma exceção de tipo B. No caso de uma exceção de tipo A, o sistema operacional inicia lendo o endereço de armazenamento secundário e tamanho obtido na entrada da tabela hash e blocos do processo que estavam fazendo o acesso. Quando o segmento estiver sendo lido, a entrada na tabela hash é atualizada e o processo é habilitado a continuar. No caso de uma exceção de tipo B, o sistema operacional primeiro obtém o tamanho 5 CONCLUSÃO do segmento e endereço de armazenamento secundário, e os coloca numa entrada da tabela hash recentemente alocada e então procede como com uma exceção de tipo A. Para otimizar esta implementação, podemos alocar numa memória associativa, os tamanhos e os endereços na memória principal dos segmentos mais recentemente usados. 4.3 Conjunto de instruções É necessário que o conjunto de instruções adote capacidades como forma de endereçamento básica e, por tanto, cada instrução de endereçamento deve reservar bits para as capacidades além dos necessários para usar o barramento. Um novo tipo de acesso (Acesso de Entrada), permite que uma rotina invoque outra sem que para isto tenha qualquer tipo de permissão de leitura sobre a mesma, garantindo a proteção de suas capacidades. 4.4 A pilha Se o processo chama rotinas de diferentes domı́nios de execução e a pilha for única para o processo, uma destas rotinas pode armazenar a capacidade do segmento de pilha e influenciar na execução das demais. A manipulação da pilha ainda é um problema nos dias de hoje. O Buffer Overflow Exploit em sistemas Unix são baseados no principio de se alterar o endereço de retorno da sub-rotina. O artigo deixa o problema em aberto, já que apresenta uma solução complexa via hardware e uma pouco eficiente via software. 4.5 O problema da variável própria O artigo diz que o conceito de variáveis próprias de Algol deve desaparecer a longo prazo. Isto ainda está longe de acontecer. Em linguagens Orientada a Objetos, é necessário manter o estado de objetos, e por tanto, cada 3 objeto mantém um conjunto de variáveis instancializadas independente do controle de fluxo. Algo semelhante às variáveis próprias. 5 Conclusão Endereçamento baseado em capacidade fornece uma maneira eficiente de resolver o problema da referência de segmentos compartilhados. Entretando, implementações em hardware de capacidades não tem sido uma escolha dos principais desenvolvedores de sistemas computacionais. Sistemas mais recentes que o do artigo de R. S. Fabry[1] optaram por não implementar capacidades, resolvendo referências de segmentos em tempo de compilação ou por linkagem dinâmica, os quais se encaixam melhor nas outras soluções apresentadas - seção 2. Nas novas arquiteturas de 64bits, se 1GB for alocado por segundo, a memória só se esgota em 500 anos. As desvantagens de uso de um sistema não segmentado, ou seja, memória plana, estão sendo questionadas, já que é possı́vel implementar proteção sem segmentação. O uso de endereçamento direto com arquiteturas de 64bits acabaria com o problema de endereço absoluto descrito no artigo e tem a vantagem de funcionar com arquiteturas mais semelhantes às atuais. Referências [1] R. S. Fabry. Capability-Based Addressing. Communications of the ACM, Vol. 17, Number 7 [2] Andrew S. Tanenbaum. Modern Operating Systems. Prentice-Hall, Inc. [3] Abraham Silberschartz e Peter Baer Galvin. Sistemas Operacionais Conceitos. Prentice-Hall, Inc. REFERÊNCIAS [4] Dennis, J. B.. Segmentation and the design os multiprogrammed computing systems. J. ACM 12, 4, 589-602. 4