You are on page 1of 8

Modelos de Memória

Segmentação
A segmentação é uma forma de se organizar a memória de nossos
computadores que surgiu junto com o lançamento dos primeiros IBM/PCs.
Na verdade este é um conceito que já existia antes do lançamento de tais
máquinas e era utilizado principalmente em sistemas de grande porte mas que
havia perdido muito terreno para um outro modelo de organização de memória
chamado de paginação.
Os PCs simplesmente ressuscitam esse modelo que a partir de então
passa a ser amplamente utilizado.
De forma bastante simples podemos dizer que a segmentação consiste na
divisão da memória do computador em pequenas porções, segmentos, e assim ao
invés de tratarmos em nossos programas a memória como um todo a trataremos
através destas partes.

Mas por que devemos segmentar nossa memória?

Bem isso se da devido as características que possuía o 8088, o


processador que equipava os primeiros PCs.
Tal processador tinha arquitetura de 16 bits, o que significa que este podia
processar words e portanto para poder armazenar tais estruturas de dados seus
registradores internos eram todos de 16 bits.
Ainda sobre o 8088 este apresentava um barramento de endereços de 20
linhas, o que significava que os endereços de memória nessa máquina tinham 20
bits e com isso o tamanho de nossa memória estava limitado a 1 MB.
Você já percebeu o problema?
O fato é que endereços de 20 bits jamais poderão ser armazenados dentro
de registradores de 16 bits, e a necessidade de se armazenar endereços dentro
do processador é uma constante.
Como os registradores disponíveis no processador eram todos de 16 bits
pensou-se em trabalhar com endereços de 16 bits, porém assim procedendo
estaríamos limitados a trabalhar com apenas 64 KB1.
Isto representava um grande desperdício e assim a idéia amadureceu e
pensou-se em trabalhar com a memória em partes de 64 KB, e desta forma não
mais teríamos problema em representar os endereços pois estes caberiam
exatamente dentro dos registradores do processador.
O problema agora era outro: a repetição de endereços, pois por exemplo o
byte sete existiria em cada um dos segmentos de 64 KB de nossa memória e

1
Com 16 bits conseguimos representar valores numéricos entre 0000h e FFFFh
ou se você preferir valores entre 0 e 65.535 em decimal o que representa
exatamente 64 KB.

Organização e Arquitetura de Computadores 45


solicitando tal byte ao processador este se perderia sem saber qual parte de
memória acessar.
Este outro problema foi facilmente resolvido: atribuímos também um
endereço a cada porção de memória e agora ao nos referirmos a um endereço de
memória devemos informar primeiro o endereço da parte seguido do endereço
byte dentro desta parte que se deseja.
Assim cada endereço de memória seria constituído de duas partes distintas:
o endereço do segmento e o endereço do byte que se deseja dentro do segmento,
este último também conhecido como offset ou deslocamento.
Por esse motivo quando o processador necessitar armazenar um endereço
de memória ele fará uso de dois registradores: um para armazenar o endereço de
segmento e outro para o offset.
Abaixo podemos visualizar a notação utilizada para se representar um
endereço segmentado:

1 Endereço de Memória = Segmento:Offset1

Realmente nossa memória é dividida em segmentos de 64 KB?

Não e isso precisa ficar bem claro....


Na verdade a memória de nosso computador é uma coisa só que começa
no primeiro endereço e termina no último.
A segmentação é uma concepção lógica, ou seja, uma forma de se
enxergar a memória que não corresponde a realidade.
Assim iremos ter o conceito de endereços físicos ou reais e os endereços
lógicos ou segmentados e a ilustração abaixo tenta mostrar exatamente isso.

End. Lógico End. Físico Memória

0000:0000h 00000h
0000:0001h 00001h
0000:0002h 00002h
: : :
: : :
0000:FFFFh 0FFFFh
1000:0000h 10000h
1000:0001h 10001h
: : :
: : :
1000:FFFFh 1FFFFh
2000:0000h 20000h
2000:0001h 20001h
: : :
: : :
: : :
F000:FFFFh FFFFFh

Organização e Arquitetura de Computadores 46


Antes de mais nada perceba que a cada endereço físico corresponde um
endereço segmentado (lógico).
Perceba também que os endereços físicos apresentam cinco dígitos
hexadecimal, e portanto são valores de 20 bits e que tanto os endereços de
segmento como os de offset são valores de quatro dígitos e que portanto cabem
sem nenhum problema dentro dos registradores do 8088.

O processador trata tanto endereços físicos quanto lógicos?

Sim e não...
A nível de arquitetura interna sim os processadores apresenta registradores
específicos para o tratamento de endereços segmentados e circuitos próprios para
tratar tais valores.
No entanto o barramento de endereços como já vimos apresenta apenas 20
linhas e portanto receberá e trabalhará apenas com endereços físicos, ou seja,
endereços de 20 bits.
Portanto fica claro que apesar de todo o nosso processamento ser feito a
nível de endereços segmentados na hora do vamos ver, de se pedir para o
processador localizar um endereço de memória, devemos fornecer ao barramento
de endereços o endereço real e não o segmentado.
E assim acredito que também deva ficar claro a necessidade de conversão
de endereços segmentados em endereços reais na hora de localizá-los.

E como é feita a conversão de endereços lógicos em físicos?

O processo é bastante simples: um algoritmo matemático se encarregará


disso para nós, o difícil será justificar o métdo mas vamos tentar...
Bem vamos pegar um endereço segmentado como exemplo: 1000:FFFFh.
Antes de mais nada volte a ilustração anterior e perceba que tal endereço
segmentado equivale-se ao endereço real 1FFFFh.
Portanto vamos trabalhar com o endereço segmentado até gerar o seu
equivalente real.
Como o processador no fundo, no fundo, só faz somas, vamos tentar nos
virar com elas e como temos dois valores: o segmento e o offset vamos
experimentar somá-los:

(Seg) 1000h
(Offset) FFFFh
10FFFh

É como resultado de fato geramos um valor de 20 bits, mas que não


corresponde ao endereço físico equivalente, no entanto chegamos muito perto.
Se pudéssemos efetuar a soma com o valor do segmento acrescido de uma
casa, então seria perfeito... observe:

Organização e Arquitetura de Computadores 47


(Seg) 10000h
(Offset) FFFFh
1FFFFh

Reparou a simples inserção de um zero a direita do endereço de segmento


resolveu todos os nossos problemas, e para gerar tal zero é muito simples basta
multiplicar o endereço de segmento por 10h.
Desta forma um endereço segmentado é submetido a um algoritmo
matemático simples antes de ser conduzido ao barramento de endereços e esse
algoritmo nada mais faz do que multiplicar o endereço de segmento por 10h e
somar o valor resultante ao endereço de offset gerando assim um valor de 20 bits,
ou seja, o endereço físico equivalente ao endereço segmentado em questão.

Segmento * 10h + Offset

E na sequência podemos observar como tal algoritmo é de fato executado a


nível de processador:

Segmento :Offset Segmento * 10h


16bits:16 bits + Offset
20 bits B 20 bits

I
U

Perceba que antecedendo a BIU (Unidade de Interfaceamento como os


Barramentos), a unidade responsável pelo controle e funcionamento dos
barramentos de meu processador, existe um circuito somador cuja função é a de
executar o algoritmo em questão.
Esse somador recebe os endereços no formato segmento:offset e os
transforma em endereços físicos de 20 bits prontos para serem localizados pelo
barramento de endereços a quem este circuito esta diretamente ligado.

Nos 486s e Pentiums a coisa também funciona assim?

Não. Para ser sincero a coisa é bastante diferente.


Tanto os 486s como os Pentiums bem como a grande maioria dos
processadores disponíveis nos dias de hoje são processadores de 32 bits.
Isto quer dizer que estes tem a capacidade de processar 32 bits ou 4 bytes
por vez e portanto seus registradores internos são também de 32 bits.
Nestes processadores os Barramentos de Endereços tem a largura de 32
linhas e assim sendo os endereços de memória são também de 32 bits, o que lhes

Organização e Arquitetura de Computadores 48


permite trabalhar com valores de memória de até 4 GB, o que é mais do que
suficiente para nossas necessidades atuais.
Assim sendo nesta nova geração de processadores não temos mais o
problema que tínhamos antes e motivou o uso da segmentação: aqui um endereço
de memória cabe perfeitamente em um único registrador do processador.
Assim sendo não temos mais a necessidade da segmentação, porém
mesmo assim ela continua existindo por dois motivos:

• compatibilidade, se não mais existisse a segmentação os programas mais


antigos, originalmente produzidos para XTs e 286s não rodariam nas máquinas
mais novas;
• segurança, hoje os sistemas operacionais são multitarefa o que lhes permite
carregar e processar diferentes programas e assim sendo cada programa é
confinado, vamos assim dizer, em um segmento como forma de garantir sua
integridade, para garantir que um programa não invada a área de memória do
outro2.

E sem o vínculo da obrigatoriedade, a segmentação agora é muito mais


flexível. Por exemplo os segmentos não mais estão limitados a ter 64 KB, eles
podem ser do tamanho que quisermos, ou melhor, do tamanho que nossos
programas precisarem.
No entanto se por um lado isso é bom pois limita a quantidade de
segmentos que o sistema terá que gerenciar, criamos aqui uma complicação no
sentido de localizar tal segmento.
Se os segmentos já não mais possuem tamanho fixo, o algoritmo
anteriormente apresentado para a conversão de endereços segmentados em
endereços reais não mais funcionará.

E como se dará a conversão de endereços lógicos em físicos nos


processadores de 32 bits?

O processo é diferente mas também é bastante simples.


Teremos agora uma tabela denominada de Tabela de Descritores de
Segmento que relacionará todos os segmentos existentes aos seus endereços
reais, ou melhor ao primeiro byte de cada segmento.
Assim ao se solicitar um determinado endereço de forma segmentada como
por exemplo: 2000h:0003h a primeira coisa que o processador fará será consultar
a tabela a fim de localizar o início do segmento 2000h, uma vez descoberto tal
endereço será somado a este o valor do Offset desejado obtendo-se assim o
endereço real equivalente ao endereço segmentado em questão.
Se você não entendeu de uma olhada na ilustração abaixo que esboça um
modelo de memória segmentado em uma máquina de 32 bits.

2
Quando por algum motivo um programa invade a área de memória do outro
temos o que chamamos, e que é muito popular nos ambientes Windows, de GPF
(Falha Geral de Proteção).

Organização e Arquitetura de Computadores 49


End. Lógico End. Físico Memória Bem, primeiro é preciso entender
a figura ao lado.
0000:0000 0000 0000 A primeira coluna representa os
0000:0001 0000 0001 endereços segmentados de memória e a
0000:0002 0000 0002 seu lado na segunda coluna
: : encontramos os endereços reais
: : equivalentes aos endereços
: 01FA 0123 segmentados da primeira coluna.
1000:0124 01FA 0124 Perceba que não há lógica nem
1000:0001 01FA 0125 padrão matemático nenhum que defina o
: : início e fim de um segmento.
: : E voltando ao nosso exemplo, o
: 5000 FF10 endereço segmentado 2000h:00003h
2000:0000 5000 FF10 repare que o endereço físico equivalente
2000:0001 5000 FF11 ao mesmo é 5000FF13.
2000:0002 5000 FF12 Tendo entendido a figura acredito
2000:0003 5000 FF13 agora que você não terá mais nenhuma
2000:0004 5000 FF14 dúvida quanto ao algoritmo.
: : Lembre-se que a primeira coisa
: : que o processador vai fazer quando
: 6FC0 9000 solicitado à localizar um endereço

segmentado será consultar a Tabela de Descritores de Segmento.

Segmentos End. Inicial Outras Informações

: : :
: : :
2000h 5000 FF10 Tamanho, Tipo...
: : :
: : :

Procedendo desta forma logo o processador descobrirá que o referido


segmento inicia-se de fato no endereço físico 5000FF10, no entanto eu não quero
o primeiro byte deste segmento, o offset nos informa que desejamos o byte de
número 3 de tal segmento e agora será só somar o offset ao endereço encontrado
em tal tabela.

5000 FF10h
0003h
5000 FF13h

E assim chegamos ao endereço real (5000 FF13h) equivalente ao endereço


segmentado 2000:0003h.
Ainda sobre a Tabela de Descritores de Segmento, perceba que esta
possui uma terceira coluna com outras informações.

Organização e Arquitetura de Computadores 50


Ali encontraremos entre outras coisas o tamanho do segmento em questão
e o tipo do segmento que pode ser público ou privado.
Um segmento é dito público quando pode ser acessado por outros
programas além daquele contido nele mesmo. Um exemplo de programa
carregado em um segmento público seria a Área de Transferência do Windows.
Já um segmento privado é aquele que só permite o acesso ao programa
nele contido e a ninguém mais.

O algoritmo de conversão de endereços lógicos em físicos é desenvolvido


por qual unidade funcional do processador?

Por nenhuma daquelas que você conhece.


Dentro destes processadores existe uma unidade denominada de Unidade
de Segmentação que é a responsável por desenvolver tal trabalho.
Assim neste momento deveríamos voltar a todos aqueles diagramas de
bloco que apresentei capítulos atrás como sendo a arquitetura interna de um
processador e atualizá-los com a presença de tal unidade.

Onde se localiza a Tabela de Descritores de Segmento?

A princípio na memória RAM de nosso computador.


Afinal esta tabela é bastante dinâmica sendo alterada sempre que se inicia
ou finaliza um programa.
Se você não entendeu lembre-se de que quando iniciamos um programa o
sistema operacional determina um segmento à este e assim devemos registrar tal
segmento na tabela, quando finalizamos um programa temos que liberar o
segmento em questão e portanto o retiramos da tabela.
No entanto temos um problema sério em mantermos tal tabela em memória,
esta acessada sempre que o processador precisa localizar um endereço em
memória, como isto é uma constante na rotina do processador, esta tabela será
constantemente consultada.
Você já percebeu o problema?
O processador deseja acessar o endereço 2000:0003h, então ele vai a
Tabela de Descritores de Segmento a fim de descobrir onde este segmento se
inicia. Como a referida tabela se localiza em memória um acesso a memória é
feito para isso.
O endereço onde o segmento se inicia é então levado ao processador que
o soma ao endereço de offset em questão obtendo-se o endereço físico
equivalente ao endereço segmentado em questão conforme já vimos.
Em posse do endereço físico novo acesso a memória acontece, agora com
o objetivo de se acessar a posição solicitada anteriormente.
Ou seja, o que acabamos de fazer foi transformar um acesso à memória em
dois, duplicando assim o tempo gasto para tal.
É óbvio que as coisas não podem ficar assim...
Você lembra da Unidade de Segmentação?
Sim a unidade dentro do processador responsável pela conversão de
endereços lógicos em físicos, esta unidade possui em seu interior o que

Organização e Arquitetura de Computadores 51


chamaremos de cache de descritores, que nada mais é do que uma memória
cache específica para o armazenamento das linhas da Tabela de Descritores de
Segmento mais frequentemente solicitadas.
Assim podemos dizer que a referida tabela se localiza dentro do
processador, mais especificamente no cache de descritores da Unidade de
Segmentação.

Organização e Arquitetura de Computadores 52

You might also like