defaultizeize no UNIX / Linux

4

Eu estava inspecionando a saída pré-processada do meu programa C e lembrei-me do arquivo de cabeçalho wordsize.h

Ele está localizado em /usr/include/i386-linux-gnu/bits/wordsize.h

o arquivo contém apenas uma macro

#define __WORDSIZE   32

A minha pergunta é, o wordsize então está sendo decidido pelo compilador que está instalado ou tem algo a ver com o sistema operacional que eu instalei (32 ou 64 bits) ou tem algo a ver com o hardware? configuração da minha máquina.

Eu sou novo no desenvolvimento no Linux.

    
por ArunMKumar 04.05.2013 / 07:57

3 respostas

6

Em geral, wordsize é decidido na arquitetura de destino durante a compilação. Seu compilador normalmente compilará usando wordsize para o sistema atual.

Usando gcc (entre outros), você também pode ajustar isso usando vários sinalizadores. Por exemplo. em um host de 64 bits, você pode compilar para 32 bits máquina, ou força palavras de 32 bits.

-m32  # int, long and pointer to 32 bits, generates code for i386.
-m64  # int, long and pointer to 64 bits, generates code for x86-64.
-mx32 # int, long and pointer to 32 bits, generates code for x86-64.

Você também deve olhar para limits.h e inttypes.h para ver o uso desse definição.

Para a compilação cruzada, consulte multilib ( link de 32 bits no SO ) e pesquisa na Web.

Verifique com que flags seu GCC foi criado:

gcc -v

Quanto aos tamanhos, eles geralmente estão intimamente relacionados à unidade central de processamento e relacionado - como tamanho máximo de um endereço de memória, tamanho dos registradores da CPU etc.

Para um rápido vislumbre, você não precisa entender muito disso, mas dependendo em onde você está , pode dar uma ideia:

Se você usar gcc e compilar com o -S flag, também poderá ver as instruções de montagem . Aqui, um pouco confuso, por ex. Máquina de 32 bits palavra é de 16 bits e longa é de 32 bits. ( __WORDSIZE )

Então, por exemplo movl $123, %eax significa mover muito tempo (32 bits - __WORDSIZE ) 123 para eax register e movw significa mover palavra (16 bits).

Isto é convenções de nomenclatura - e apenas para dizer que WORDSIZE pode significar mais então uma coisa. Você também pode encontrar o código em que, por exemplo, definir algo como

#define WORD_SIZE 16

como tudo depende do contexto. Se você ler dados de um arquivo ou fluxo onde fonte tem tamanho de palavra de 16 bits, isso seria natural. Apenas para salientar que nem sempre assume que tamanho de palavra significa __WORDSIZE quando lido em código.

Exemplo com WORD_SIZE definido pelo usuário não afetaria o conjunto de instruções no código de máquina gerado. Para o GCC, em geral, recomendo este livro . (Infelizmente é um pouco antigo - mas ainda não encontrou um livro semelhante e fácil de ler mais. (Não que eu tenha parecido tão difícil.) É curto, conciso e doce. em Lembre-se de que as coisas podem ter mudado, tais como características adicionais, etc., mas não é uma boa introdução.

Ele fornece uma introdução rápida e agradável dos vários aspectos ao compilar. Veja o capítulo 11 para uma boa explicação sobre a cadeia de compilação.

Eu não sei de nenhuma opção no GCC para compilar 16 bits. Uma maneira de fazer isso ser para escrever em assembly usando .code16 para instruir o código deve ser de 16 bits.

Exemplo:

    .file "hello.s"
    .text
    .code16            /* Tel GAS to use 16-bit instructions. */
.globl start, _start
start:
_start:
    movb $0x48, %al
        ...

Isso é necessário, por exemplo, carregadores de inicialização, como GRUB e LILO, para o código presente em MBR no seu disco rígido.

A razão para isto é que quando o seu computador inicializa a CPU está em um especial modo onde não tem instruções de 32 bits, mas máximo de 16 bits AKA Modo Real .

Em suma, o que acontece é que o BIOS faz um teste de hardware, então carrega os primeiros 512 bytes do seu disco de inicialização na memória e deixa o controle para esse código começa no endereço 0 . Este código, por sua vez, localiza onde próxima etapa de arquivos residem, carregue-os na memória e continue executando finalmente entrando Modo Protegido onde você tem o modo normal de 32 bits.

    
por 04.05.2013 / 09:45
3

Veja o que a minha tem:

% cat /usr/include/bits/wordsize.h 
/* Determine the wordsize from the preprocessor defines.  */

#if defined __x86_64__
# define __WORDSIZE 64
# define __WORDSIZE_COMPAT32    1
#else
# define __WORDSIZE 32
#endif

Portanto, ele é determinado por wordsize.h , que vem com seu compilador. Mas um inteligente selecionará um tamanho apropriado.

    
por 04.05.2013 / 08:41
2

Você deve poder escolher o wordsize padrão no tempo de compilação, geralmente usando uma das opções -m32 ou -m64 .

/usr/include/i386-linux-gnu/bits/wordsize.h foi projetado para ser usado ao compilar aplicativos de 32 bits.

Deve haver um /usr/include/x86_64-linux-gnu/bits/wordsize.h contendo uma definição de__WORDSIZE de 64 bits%.

Esta alteração foi introduzida no Ubuntu 11.4: link

Se -m64 falhar, você poderá ter uma distribuição de 32 bits. uname -m dirá a você.

Embora seja possível cruzar a compilação de binários de 64 bits em um sistema de 32 bits, isso seria inconveniente, já que você não terá nenhuma maneira simples de executá-los lá.

Se a sua CPU for um modelo de 64 bits (verifique com lscpu ), talvez você queira instalar uma distribuição de 64 bits para poder compilar facilmente pacotes multiarch.

    
por 04.05.2013 / 08:49