¿que significa exactamente el alineamiento?

Iniciado por Usuario887, 14 Julio 2020, 18:44 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario887

Hola,

estoy inseguro de si entiendo el significado de "alineamiento" cuando se habla de programacion en ensamblador y otras categorias; segun lo que hasta ahora se, el alineamiento es el ambito de acceso. Sin embargo, ¿es eso exactamente?

Por ejemplo, existe un miembro de la estructura IMAGE_OPTIONAL_HEADER del formato PE llamado FileAlignment (cosa que no entiendo: ¿por que alinear un archivo en disco? ¿o se trata mas bien de informacion para la paginacion?). Ademas, MASM tiene ciertos atributos para la declaracion de segmentos que puede ser BYTE, WORD, PARA, etcetera, ¿se refiere esto solo al ambito del segmento que debe calcular el ensamblador? ¿o va mas alla de esto?.

Gracias de antemano.

Eternal Idol

Cita de: marax en 14 Julio 2020, 18:44 PM
estoy inseguro de si entiendo el significado de "alineamiento" cuando se habla de programacion en ensamblador y otras categorias; segun lo que hasta ahora se, el alineamiento es el ambito de acceso. Sin embargo, ¿es eso exactamente?

No ...

https://en.wikipedia.org/wiki/Data_structure_alignment
https://foro.elhacker.net/asm/declaracion_de_segmentos_en_tasm-t504472.0.html

Cita de: marax en 14 Julio 2020, 18:44 PMPor ejemplo, existe un miembro de la estructura IMAGE_OPTIONAL_HEADER del formato PE llamado FileAlignment (cosa que no entiendo: ¿por que alinear un archivo en disco? ¿o se trata mas bien de informacion para la paginacion?). Ademas, MASM tiene ciertos atributos para la declaracion de segmentos que puede ser BYTE, WORD, PARA, etcetera, ¿se refiere esto solo al ambito del segmento que debe calcular el ensamblador? ¿o va mas alla de esto?.

https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

#2
Segun el primer enlace:
CitarTo ensure natural alignment, it may be necessary to insert some padding between structure elements or after the last element of a structure.

Estudiando la estructura de los archivos PE, me encontre con algo asi entre la ultima estructura IMAGE_SECTION_HEADER y la sección de codigo (de un EXE, cuya sección de codigo es la primera):



Hasta ahora no le hallo un sentido. Supongamos que se trata de tal padding entre estructuras, ¿no seria mas eficiente especificar la forma de alineamiento en IMAGE_OPTIONAL_HEADER32 y aplicarlo en memoria, y no en el disco? Honestamente, no entiendo cual es el sentido de aplicarlo tambien al archivo en disco...

Ademas, estoy casi seguro de que esto se debe a una razon practica mas que fundamental... pero ¿por que es necesario? es decir ¿por que no acceder a la memoria en unidades de palabra simplemente (sea cual sea la palabra del computador, 16-bits, 32-bits, 64-bits...)?

Eternal Idol

FileAlignment
The alignment of the raw data of sections in the image file, in bytes. The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member is less than the system page size, this member must be the same as SectionAlignment.


Cita de: marax en 15 Julio 2020, 18:59 PM
Estudiando la estructura de los archivos PE, me encontre con algo asi entre la ultima estructura IMAGE_SECTION_HEADER y la sección de codigo (de un EXE, cuya sección de codigo es la primera):

Hasta ahora no le hallo un sentido. Supongamos que se trata de tal padding entre estructuras, ¿no seria mas eficiente especificar la forma de alineamiento en IMAGE_OPTIONAL_HEADER32 y aplicarlo en memoria, y no en el disco? Honestamente, no entiendo cual es el sentido de aplicarlo tambien al archivo en disco...

Simplemente responde al alineamiento, cada sección esta alineada a minimo 512 bytes (de acuerdo al campo FileAlignment de IMAGE_OPTIONAL_HEADER) y esa de la imagen que subiste debe arrancar en 1024.

Cita de: marax en 15 Julio 2020, 18:59 PMAdemas, estoy casi seguro de que esto se debe a una razon practica mas que fundamental... pero ¿por que es necesario? es decir ¿por que no acceder a la memoria en unidades de palabra simplemente (sea cual sea la palabra del computador, 16-bits, 32-bits, 64-bits...)?

Yo no diseñe el formato PE (y te estas desviando del alineamiento, buscando explicaciones mas alla de como funciona una tecnologia, a la larga te vas a topar con decisiones de diseño y si es tecnologia de hace decadas las razones no van a ser evidentes siempre) pero te puedo dar una razon: no se pueden leer de disco unidades de palabra, la unidad minima con la que se trabaja es el sector (tipicamente 512 bytes).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

#4
Cita de: Eternal Idol en 15 Julio 2020, 20:39 PM
FileAlignment
The alignment of the raw data of sections in the image file, in bytes. The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member is less than the system page size, this member must be the same as SectionAlignment.

Esta bien... ahora entiendo. Sin embargo ahora tengo una sutil duda: ¿cual es la diferencia entonces entre los miembros FileAlignment y SectionAlignment?

SectionAlignment
The alignment of sections loaded in memory, in bytes.

FileAlignment
The alignment of the raw data of sections in the image file, in bytes.


A menos que uno se refiera a todas las secciones conjuntamente y el otro a los datos de estas secciones, no lo intuyo.

y en el caso de que el primero se refiera a tal ¿con secciones conjuntamente nos referimos a los descriptores las secciones o a las secciones en si?



edito: acabo de notar que mientras uno dice in the image file, el otro loaded in memory. En ese caso tendria otras dudas (si no es molestia):

respecto a SectionAlignment:
¿por que esta informacion es relevante?
¿es relevante solo para el cargador de Windows?
¿tiene que ver con el mecanismo de paginacion?

Eternal Idol

https://en.wikipedia.org/wiki/Data_structure_alignment#Hardware_significance_of_alignment_requirements

- En teoria se usa al mappear un binario en memoria (podes depurar Windows y comprobarlo).
- En la practica al cargador (Ldr el Loader de NTDLL.dll) ya le llega hecho por el Kernel (las secciones alineadas digo) una vez que accede a esas paginas de memoria.
- Si, tiene que ver.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón