Arquitetura de computadores - Endianness
Há diversos sistemas computacionais existentes no mercado. É de extrema importância
destacar um ponto de diferenciação entre eles, que são as plataformas e arquiteturas.
Plataforma: É um conjunto de elementos físicos e lógicos que constroem um sistema
computacional, esses elementos são hardware, sistema operacional e biblioteca de tempo de
execução (aplicação).
Exemplo: Plataforma RISC IBM PPC (IBM PowerPC), Plataforma Intel Itanium, Plataforma CISC
Intel X86, etc.
Arquitetura: É uma característica de uma determinada plataforma que descreve a arquitetura
de uma CPU e ULA baseadas em registradores e barramentos de dados, ou seja, isso refere-se
no poder de endereçamento entre processador x memória principal.
Exemplo: 32 Bits e 64 Bits
Plataforma x Arquitetura: É a característica do sistema computacional como um todo, esse
casamento ditará o funcionamento do computador em relação a software e hardware.
Exemplo: IBM PPC PowerPC 64 bits, Intel X86 32 bits, Oracle SPARC M-Series 64 bits, etc.
O que é Endianness?
É uma convenção usada por uma plataforma computacional, cujo objetivo é interpretar
um conjunto de bytes que formam um "data word", que por sua vez é armazenado de forma
temporária na memória principal e de forma permanente em disco.
Os dados são temporariamente armazenados em memória principal em forma de dados
binários organizado em unidades de 8 bits, chamado de bytes. Ao ler ou escrever um "data
word", a ordem dos bytes armazenados em memoria principal determina a interpretação de um
"data word", ou seja, é neste cenário que nos deparamos com incompatibilidade entre
plataformas. Por exemplo, um banco de dados que está instalado em Linux com Intel 64 bits e
deve migrar para um AIX PowerPC 64 bits.
A ideia de um sistema computacional é semelhante a uma função matemática,
implicando várias situações de entrada e saída de resultados, para atingir um determinado
objetivo, dois tipos de entrada e saída são primordiais quando falamos de “Endianness” são eles:

Entrada e Saída de dados entre Registradores de CPU e Memoria principal
Denomina-se Load/Store:
 O registrador é destino no Load e a memória principal é origem.
 O registrador é origem no Store e a memória principal é destino.

Entrada e Saída entre memoria principal e disco
Denomina-se Disk Read/Write (I/O):
 A memória principal é destino no Read (input) e o disco é origem.
 A memória principal é origem no Write (output) e o disco é destino.
Neste cenário, a forma de ordenar e organizar os dados é crucial para o processamento de
entrada e saída. Podemos presumir então, que uma conversão de plataforma implica em uma
nova forma de ordenação e organização dos bytes. Assim conversões de plataformas sem o
devido tratamento implica inevitavelmente na corrupção dos dados ou na ininteligência na
interpretação dos “data word” a serem processados.
Como funciona a ordenação e organização dos bytes nos “data word”?
Cada local de armazenamento na memória está associado com um índice, chamado seu
endereço, que indica a sua posição. Uma “data word” hexadecimal "A1B2" são armazenados em
endereços de memória consecutivos da seguinte forma "0A 01 0B 02", esse "data word" forma
um conjunto de 4 bytes, que resulta em 32 bits. O posicionamento do "data word" em memória
principal determina-se a ordenação e organização dos bytes, ha 2 possível convenções de
organização, são elas:
Big-endian:
Armazena o byte mais significativo de um "data word" no endereço menor.
0A010B02 = 0A010B02
Os bytes são guardados por ordem decrescente do seu "peso numérico" em endereços
sucessivos da memória.
Significa que o byte de ordem mais elevada do número está armazenado no endereço de
memória mais baixo e de ordem mais baixa, no endereço mais elevado.
Little-endian:
Armazena o byte menos significativo de um "data word" no endereço menor.
0A010B02 = 020B010A
Os bytes são guardados por ordem crescente do seu "peso numérico" em endereços sucessivos
da memória.
Significa que o byte de ordem mais baixa do número está armazenado no endereço de memória
mais baixo e de ordem mais elevada, no endereço mais elevado.
Faremos uma analogia com números decimais:
 “A B C” em Big-endian significa “C B A” em Little-endian.
 “1 2 3” em Little-endian significa “3 2 1” em Big-endian.
Isso mostra que é necessário um tratamento de conversão se quisermos fazer migrações
entre plataformas.
Quando o Endianness interfere em migração entre plataformas?
Com base nos conteúdos anteriores, chegamos à conclusão que a forma de ordenação dos
“data word” é a causa de incompatibilidade de programas (software) entre plataformas
computacionais, ou seja, o tratamento de baixo nível do sistema computacional provoca essa
situação, uma vez que as plataformas tratam a entrada e saída dos dados de forma não similares.
A solução para esse problema muitas vezes é a re-compilação do programa computacional,
ou seja, a reinstalação do software, assim o código escrito em uma determinada linguagem de
programação em alto nível é compilado respeitando a sintaxe do compilador e é gerado o
executável em linguagem de máquina para a plataforma. Assim um código em linguagem de alto
nível pode ser compilado para qualquer plataforma, desde que o compilador suporte à geração
do executável para esta determinada plataforma.
Se o mesmo código em linguagem C (código escrito em uma arquivo TXT) for compilado
respeitando a sintaxe de cada compilador em suas plataformas o resultado do programa será o
mesmo, pois programas iguais geram resultados iguais.
Neste caso o Endiannes não interfere, uma vez que programas iguais (código) geram
resultados iguais (programa em execução).
Em caso de não existência do passo 1, ou seja, a compilação em alto nível, o Endianess é
extremamente relevante, pois como dito anteriormente, essa convenção orquestra o
tratamento de baixo nível do sistema computacional, o que pode tornar a execução do
programa ininteligível para o sistema computacional.
Download

do artigo em PDF