Endereçamento baseado em Capacidade

Propaganda
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
Download