tamaño de palabra predeterminado en UNIX/Linux

tamaño de palabra predeterminado en UNIX/Linux

Estaba inspeccionando la salida preprocesada de mi programa C y miré el archivo de encabezado.wordsize.h

Está localizado en /usr/include/i386-linux-gnu/bits/wordsize.h

el archivo contiene solo una macro

#define __WORDSIZE   32

Mi pregunta es, ¿el tamaño de las palabras lo decide el compilador que está instalado o tiene algo que ver con el sistema operativo que he instalado (32 bits o 64 bits) o tiene algo que ver con la configuración de hardware de mi máquina.

Soy nuevo en el desarrollo bajo Linux.

Respuesta1

En generalwordsizeSe decide sobre la arquitectura de destino al compilar. Su compilador normalmente compilará usando wordsizeel sistema actual.

Usando gcc(entre otros) también puedes ajustar esto usando varias banderas. Por ejemplo, en un host de 64 bits puede compilar para32 bitsmáquina, ofuerzaPalabras 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.

También debería mirar limits.hy inttypes.hver el uso de esta definición.


Para realizar una compilación cruzada, consultebiblioteca múltiple(Enlace de 32 bits en SO) y buscar en la web.

Compruebe con qué banderas se creó su GCC:

gcc -v

En cuanto a los tamaños, suelen estar estrechamente relacionados con la unidad central de procesamiento y relacionados, como el tamaño máximo de una dirección de memoria, el tamaño de los registros de la CPU, etc.

Para echar un vistazo rápido, no es necesario que comprenda mucho de esto, pero dependiendo deDónde estáspuede dar una idea:

Si usa gccy compila con la -Sbandera, también puede mirar elInstrucciones de montaje. Aquí, un poco confuso, por ejemplo, en una máquina de 32 bits, una palabra es de 16 bits y una longitud es de 32 bits. ( __WORDSIZE)

Entonces, por ejemplo, movl $123, %eaxsignifica movimiento largo (32 bits - __WORDSIZE)123 registrarseeax, y movwsignifica mover palabra (16 bits).


Se trata de convenciones de nomenclatura, y sólo decir eso WORDSIZEpuede significar más de una cosa. También puedes encontrar código donde, por ejemplo, definen algo como

#define WORD_SIZE 16

ya que todo depende del contexto. Si lee datos de un archivo o secuencia donde la fuente tiene un tamaño de palabra de 16 bits, esto sería natural. Sólo para señalar que no siempre asuma que el tamaño de la palabra significa __WORDSIZEcuando lo lea en código.


El ejemplo definido por el usuario WORD_SIZEno afectaría el conjunto de instrucciones en el código de máquina generado. Para GCC en general recomendaríaeste libro.(Desafortunadamente es un poco antiguo, pero todavía tengo que encontrar un libro similar, fácil de leer y más actualizado. (No es que haya buscado tanto). Es breve, conciso y sencillo. Y si solo tienes en cuenta que las cosas pueden haber cambiado, como funciones agregadas, etc., de todos modos ofrece una buena introducción).

Ofrece una introducción rápida y agradable de los distintos aspectos de la compilación. Mira aCapítulo 11para una buena explicación de la cadena de compilación.


No conozco ninguna opción en GCC para compilar 16 bits. Una forma de hacerlo sería escribir en ensamblador usando .code16para indicar que el código debe ser de 16 bits.

Ejemplo:

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

Esto es necesario, por ejemplo, para cargadores de arranque como GRUB y LILO para el código presente en MBRsu disco duro.

La razón de esto es que cuando su computadora arranca, la CPU está en un modo especial donde no tiene instrucciones de 32 bits, sino de 16 bits como máximo. Modo real.

En resumen, lo que sucede es que el BIOS realiza una prueba de hardware, luego carga los primeros 512 bytes de su disco de arranque en la memoria y deja el control a ese código comenzando en la dirección 0. Este código, a su vez, localiza dónde reside la siguiente etapa de archivos, los carga en la memoria y continúa ejecutando, finalmente ingresando Modo protegidodonde tienesnormalModo de 32 bits.

Respuesta2

Esto es lo que tiene el mío:

% 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

Entonces está determinado por wordsize.h, que viene con su compilador. Pero uno inteligente seleccionará un tamaño apropiado.

Respuesta3

Debería poder elegir el tamaño de palabra predeterminado en el momento de la compilación, generalmente usando una de las opciones -m32o -m64.

/usr/include/i386-linux-gnu/bits/wordsize.hestá diseñado para usarse al compilar aplicaciones de 32 bits.

Debería haber un archivo /usr/include/x86_64-linux-gnu/bits/wordsize.hque contenga una definición de 64 bits __WORDSIZE.

Este cambio se introdujo con Ubuntu 11.4:https://wiki.ubuntu.com/MultiarchSpec

Si -m64falla, es posible que tengas una distribución de 32 bits. uname -mTe contaré.

Aunque es posible realizar una compilación cruzada de binarios de 64 bits en un sistema de 32 bits, eso sería un inconveniente ya que no tendrá una forma sencilla de ejecutarlos allí.

Si su CPU es un modelo de 64 bits (consulte con lscpu), es posible que desee instalar una distribución de 64 bits para poder crear fácilmente paquetes multiarca.

información relacionada