June 20, 2009 at 23:50 · Filed under Arquitectura de Computadores, Cultura
“The terms big-endian and little-endian derive from Jonathan Swift‘s 1726 satirical novel, Gulliver’s Travels. In the novel, the fictional Lilliputians‘ major political issue is whether eggs should be cracked open on the big end or the little end. Those who favor the big end are big-endians, whereas those who favor the small are little-endians.
The similarity between the Lilliputians and our big-endian versus little-endian debate is that the argument is rooted deeper in politics than technical merits.”
Procede del libro Linux Kernel Development, de Robert Love.
Capítulo 19: Portabilidad (2ª edición)
Update: Por cierto, se me olvidó poner esto de la misma fuente, está muy elegante (sirve para saber el endianness de la máquina donde se ejecuta):
int x
=1;
if(1==*(char*)&x) {
/* little endian */
}else{
/* big endian */
}
March 4, 2009 at 21:56 · Filed under C, Sistemas operativos
Una entrada breve, pero que creo que puede ser útil, ya que hasta hace unos años estuve mucho tiempo sin saber cómo hacer esto.
A veces, en ciertas aplicaciones, es útil e incluso necesario saber el tamaño de página que usa la arquitectura sobre la que estamos trabajando. Funciones como mmap y mlock en ocasiones requieren conocer este valor.
Para ello existe la llamada al sistema sysconf (definida en unistd.h). Esta llamada recibe un argumento que indica qué se quiere saber acerca del sistema, por ejemplo, sysconf(_SC_PAGE_SIZE) nos devuelve el tamaño de página. Puede fallar con ciertos argumentos, en cuyo caso devolverá -1 y fijará errno a EINVAL.
La lista de atributos del sistema que se pueden conocer está resumida en la correspondiente página del manual para esta llamada al sistema, desglosada por los estándares a los que pertenecen. Por ejemplo, nos indica que _SC_PAGE_SIZE está soportada por la versión 2 de la Single Unix Specification, así que es posible que en sistemas que no sigan SUSv2 este atributo tenga otro nombre, o haya que leerlo de otra manera.
Como ejemplo plasmo aquí un cacho de código que obtiene este valor, y su ejecución en dos arquitecturas diferentes:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
/*Definido en SUSv2*/
printf("sysconf(_SC_PAGE_SIZE)=%ld\n",
sysconf(_SC_PAGE_SIZE));
exit(EXIT_SUCCESS);
}
Compilando y ejecutándolo en una UltraSPARC-250:
-bash-3.00$ ./sysconf-pagesize
sysconf(_SC_PAGE_SIZE)=8192
-bash-3.00$ uname -a
SunOS <xxx> 5.10 Generic_120011-12 sun4u sparc SUNW,Ultra-250
vemos que las páginas son de 8K.
En cambio, en un i686 (realmente un i686 virtualizado sobre vmware, pero eso da igual porque la arquitectura por supuesto no cambia):
-bash-3.00$ ./sysconf-pagesize
sysconf(_SC_PAGE_SIZE)=4096
-bash-3.00$ uname -a
Linux <xxx> 2.6.26-1-686 #1 SMP Sat Jan 10 18:29:31 UTC 2009 i686 GNU/Linux
tenemos páginas de 4K (lo esperable, ¿no?).