Mapa da memória de um PC

Como é que a memória do seu PC é usada? Onde está a RAM? Onde está a ROM? Eu já falei por aqui que a memória RAM não é contínua, existem “buracos” no grande array de bytes que denominamos “memória”. É importante, se você quer desenvolver um sistema operacional, saber como a memória está organizada!

Para falar em organização de memória podemos usar aproximações diferentes. A primeira é encará-la com base na especificação de um endereço efetivo no modo real, ou seja, segmento:offset. Mas isso só nos permite acesso ao primeiro megabyte de memória, talvez um pouco mais, já que 0xffff:0xffff, se o sinal gate A20 estiver habilitado, especifica o endereço efetivo 0x10ffef, que tem 21 bits de tamanho. Ou seja, 65520 bytes além do limite superior do primeiro megabyte… A outra aproximação é encarar um endereço efetivo como sendo um índice para o grande array da memória, ou seja, usando um endereço efetivo de fato… No caso do modo i386, o endereço efetivo tem 32 bits de tamanho. No caso do x86-64, 48 bits (sim! 48!).

A terceira maneira, que só será útil mais tarde, é encararmos a memória como contendo blocos de 4 kB que não se sobrepõem… Essa é a maneira simples de lidar com memória no modo de paginação…

Dois “tipos” de espaços de memória:

É costume dividir a memória dos PCs em dois tipos: A memória baixa (o primeiro megabyte), que é acessível ao modo real de 16 bits, e a memória “alta”, acima de 1 MB em diante. A memória baixa é endereçável usando-se apenas os 20 primeiros bits de um endereço (por causa do esquema segmento:offset), qualquer endereço além desses corresponde à memória alta.

Em sistemas de 32 ou 64 bits pode haver uma divisão na “memória alta”. Os primeiros 4 GB de memória, no modo protegido, são chamados de “memória baixa”, o que excede isso é a memória “alta”. Essa diferença existe especialmente por causa do modo x86-64 e porque, nessa “memória baixa” temos “buracos” correspondentes ao mapeamento de I/O em memória (Local e I/O APIC e outros controladores e chipsets)… É também nessa memória “baixa” que fica a ROM de seu computador…

É importante notar que, no modo real, a ROM localiza-se nos segmentos mais altos, dentro do primeiro megabyte de memória… Mas, isso é uma “ilusão”… O que temos aqui é uma cópia lógica (via decodificação de endereços nos circuitos do seu computador) ou uma cópia em RAM (chamada Shadow ROM) da ROM que, de fato, localiza-se na “memória baixa” do modo protegido (no final do bloco de 4 GB). Algumas BIOS usam o artifício de guardar versões atualizadas da ROM em memórias Flash, internas, e as copiam para as respectivas regiões durante o power up do sistema…

É bom lembrar que mesmo no modo i386, graças à paginação e a extensão PAE, podemos endereçar até 64 GB de RAM física! E no modo x86-64, até 256 TB!

Então, quando falarmos de “memória baixa” e “memória alta”, temos que especificar o contexto (modo real? modo protegido? O PAE está ativado? Estamos no modo real, i386 ou x86-64?).

O primeiro 1 MB:

Quando você liga ou reseta o computador, o processador “acorda para a vida” no modo real, de 16 bits… Não importa se você tenha um Core i7, 128 GB de RAM e o escambau… O seu processador começa enxergando, no máximo, 1 MB de RAM e trabalhando em 16 bits!

O primeiro 1 MB de RAM é dividido assim:

0x00000 ~ 0x003ff - Tabela de vetores de interrupções
0x00400 ~ 0x004ff - Área de dados da BIOS (BDA - Bios Data Area)
0x00500 ~ 0x005ff - Área de dados "extra" da BIOS
0x00600 ~ 0x9ffff - RAM livre
0xA0000 ~ 0xbffff - Memória de Vídeo
0xc0000 ~ 0xdffff - Áreas reservadas para ROMs e I/O de placas ISA.
0xe0000 ~ 0xfffff - ROM

Se você fizer as contas, a área da “RAM livre” tem 653824 bytes, ou seja 638,5 kB (não chega aos famosos 640 kB que Bill Gates disse que jamais precisaria extrapolar!).

Ainda, a “Memória de Vídeo” aqui refere-se ao modo real apenas. No modo protegido este bloco de 128 kB continua acessível, mas para resoluções maiores não é suficiente. O driver de sua placa de vídeo reconfigura o circuito de vídeo para que este enxergue outra área que conteria RAM como frame buffer. A especificação VESA, por exemplo, informa ao requisitante qual é o endereço do frame buffer e o divide em “bancos”. Neste modo a tela é dividida em pedaços e você precisará mudar de “banco” para plotar pixels no lugar desejado.

A manipulação de vídeo, diretamente, é muito complicada e, hoje em dia, depende muito do fabricante. A nVidia, por exemplo, não divulga documentação alguma sobre suas GPUs, felizmente a ATI e a Intel o fazem…

Depois de 1 MB

Acima do primeiro megabyte temos o restante da memória RAM instalada na sua placa-mãe. Mas, espere! Tem um monte de buracos ai… Alguns PCs colocam um buraco de 1 MB acima dos 15 MB (não me perguntem porque! tenho lá minhas suspeitas!) e, acima disso, garantidamente, temos um buracão entre o endereço efetivo 0xfec00000 e 0xffffffff, reservados para APICs, I/O de outros dispositivos e ROMs. Acessar esses endereços é acessar registradores de dispositivos, chipsets ou ROMs…

Que droga é essa de mapeamento de I/O?… Bem, os dispositivos no seu PC geralmente são acessíveis via um espaço de endereçamento diferente da memória chamado portas de I/O. Instruções como IN e OUT usam esse espaço de endereçamento alternativo para lidar com HDs, diskettes, portas seriais, paralelas etc. Assim, os registradores desses dispositivos não estão na “memória”, mas num lugar diferente, isolado.

Porém, os controladores modernos usam espaços da memória como se fossem portas de I/O. Essas portas são ditas “mapeadas na memória”, mas não fazem parte da RAM…

Um mapa preliminar da memória acima de 1 MB pode ser mais ou menos assim:

    0x00100000 ~     0x00efffff - RAM (14 MB)
    0x00f00000 ~     0x00ffffff - Possível buraco entre 15 MB e 16 MB
    0x01000000 ~     0xfebfffff - RAM* (4096 MB)
    0xfec00000 ~     0xfec00fff - I/O APIC (1 página)
    0xfec01000 ~     0xfedfffff - Outros mapeamentos de I/O (511 páginas)
    0xfee00000 ~     0xfee00fff - Local APIC (1 página)
    0xff000000 ~     0xfffdffff - Mais mapeamentos de I/O (4064 páginas)
    0xfff80000 ~     0xfffdffff - Área extendida da BIOS** (PIIX4 - 80 páginas) 
    0xfffe0000 ~     0xffffffff - ROM (1 MB).
0x000100000000 ~ 0xffffffffffff - RAM (262140 GB max).

A terceira linha, marcada como RAM*, contém outros “buracos”. Por exemplo, ICH9 usa:

0xfec10000 ~ 0xfec38fff - PCI Express Ports 0-6
0xfed0?000 ~ 0xfed0?fff - HPET.

Além de reservar 128 kB (32 páginas) para a LAN onboard, 2 kB (1 página, 4 kB) para USB EHCI etc…

A “Área extendida da BIOS”, marcada com **, pode estar presente ou não, dependendo do chipset. Ela pode estar habilitada no PIIX4, por exemplo.

Repare que todos os blocos começam em endereços com os primeiros 12 bits zerados e terminam em endereços com esses bits setados. Isso significa que podemos mapear páginas diretamente sobre essas regiões. Isso é importante porque temos que desabilitar o uso do cache da CPU para essas regiões.

Ahhh… na região dos “Outros mapeamentos” podemos ter páginas de RAM válida também…

DMA sempre ocorre abaixo dos 16 MB!

DMA é um recurso onde um dispositivo pede para tomar o controle do barramento de endereços e dados pra realizar acesso direto à memória (Direct Memory Access). Isso é feito pelo chip controlador de DMA (DMAC – DMA Controller), onde exceto pelos casos onde um controlador mais especializado for usado, ele usa endereços de 24 bits para ler/gravar dados na memória física diretamente, com um porém: Os 8 bits superiores são fixos.

O DMAC tradicional transfere blocos de 64 kB, no máximo, e os 8 bits superiores do endereço (chamados de “página” pelo controlador) não são incrementados/decrementados… Assim, se o DMAC for programado para acessar memória a partir de 0x100000, ele conseguirá ler/escrever até 0x10ffff. Ao chegar nesse limite ele volta ao endereço 0x100000.

Assim, é prudente reservar blocos de 64 kB na memória abaixo dos 16 MB para buffers de DMA…

Mas, atenção… chipsets como o ICH9 e PIIX possuem uma versão estendida do controlador de DMA que permite uso de endereçamento em 32 bits.

Espaços reservados para o chipset

Anteriormente, mostrei como usar esse serviço da BIOS para obter as regiões “usáveis” de RAM do seu PC. Mas, ela só nos lista o que é RAM usável e o que não é. Não temos como saber se as regiões reservadas são mapeadas para I/O ou ROMs. Outros testes devem ser feitos para determinar isto! Esses testes devem levar em conta arquiteturas de chips de suporte conhecidas. Por exemplo, a maioria dos PCs modernos usa controladores para I/O com padrões conhecidos como o PIIX3 (PCI-to-ISA bridge and IDE Xcelerator)  e ICH9 (Intel I/O Controller Hub). Esses hubs fornecem suporte a SATA, PCIe, Audio, IDE, USB, I/O APIC, HPERF timer, Ethernet onboard, entre outras coisas.

Aliás, se você acha que a interface ISA morreu com o 286 não poderia estar mais enganado… Esses chipsets fornecem uma ponte entre o barramento ISA e o PCIe, por exemplo… Tudo o que você fazia com ISA no final dos anos 80 e início dos 90, continua sendo válido hoje porque ISA ainda está lá, só que escondidinha…

Para saber mais sobre esses controladores, baixe as espcificações do PIIX 3 aqui e a do ICH9 aqui. Se quiser uma versão do PIIX mais recente (a versão 4), baixe aqui. Todos são chipsets da Intel e, portanto, espere por compatibilidade… Ainda, cito o ICH9 e não um de seus antecessores (ou decendentes) porque ele é o mais comum de se achar por ai, hoje em dia, nas placas-mãe… Em máquinas virtuais o padrão PIIX 3 é o mais comum. Outra coisa: O ICH9 também pode ser chamado de 9 series Platform Controller Hub (PCH).

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s