Voici ce qui se passe lorsque j'exécute mon programme print-size-of-pointer sur ma Sun Fire sous Solaris:
(Il y a deux versions: compilé en 32-bit et compilé en 64-bit):
Résultat sur fire (Sun Fire 64-bit):
Version du kernel:
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>uname -a
SunOS fire 5.10 Generic_118833-33 sun4u sparc SUNW,UltraAX-i2
Sommes-nous en 64-bit ?
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>isainfo -b
64
Oui, nous sommes en 64-bit
Voyons les fichiers
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>ls -l
total 142
-rwxr-xr-x 1 pbn users 6587 Jun 1 20:00 print-sizeof-pointer-linux-32bit.bin
-rwxr-xr-x 1 pbn users 9415 Jun 1 20:00 print-sizeof-pointer-linux-64bit.bin
-rwxr-xr-x 1 pbn users 53640 Jun 1 20:00 print-sizeof-pointer-macosx.bin
-rw-r--r-- 1 pbn users 561 Jun 1 20:00 print-sizeof-pointer.c
Je compile mon programme en 32-bit
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>gcc -o print-sizeof-pointer-solaris-32bit.bin -m32 print-sizeof-pointer.c
Je compile mon programme en 64-bit
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>gcc -o print-sizeof-pointer-solaris-64bit.bin -m64 print-sizeof-pointer.c
Voyons de quel type d'exécutable il s'agit:
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>file *solaris*
print-sizeof-pointer-solaris-32bit.bin: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped, no debugging information available
print-sizeof-pointer-solaris-64bit.bin: ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available
J'exécute la version 32-bit de mon programme:
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>./print-sizeof-pointer-solaris-32bit.bin
print-sizeof-pointer.c
If the result is 8, this machine is a 64-bit system.
If the result is 4, this machine is a 32-bit system.
Result: 4
J'exécute la version 64-bit de mon programme:
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>./print-sizeof-pointer-solaris-64bit.bin
print-sizeof-pointer.c
If the result is 8, this machine is a 64-bit system.
If the result is 4, this machine is a 32-bit system.
Result: 8
[pbn@fire] /export/home/pbn/Documents/print-sizeof-pointer>
En bref sous Solaris sur une machine 64-bit avec un OS 64-bit, je peux à la fois exécuter les exécutables 32-bit et 64-bit. Et en fait, les exécutables 32-bit ont leurs adresses en 32-bit, les exécutables 64-bit ont leurs adresses en 64-bit.
Affichage des articles dont le libellé est Solaris. Afficher tous les articles
Affichage des articles dont le libellé est Solaris. Afficher tous les articles
dimanche 21 juin 2009
vendredi 12 juin 2009
64 bits ou 32 bits: mon petit programme print-sizeof-pointer.c
Comme je viens de m'offrir un PC de bureau 64-bit, je m'intéresse aux différences entre 64-bit et 32-bit.
J'ai donc écrit un tout petit programme en C qui permet de connaître la taille des pointeurs:
/*
print-sizeof-pointer.c
This little program prints the size of pointers.
On a 64-bit system, pointers are 64-bit (8 bytes),
so this program prints "8".
On a 32-bit system, pointers are 32-bit (4 bytes),
so this program prints "4".
Pierre Bauduin
le 12 juin 2009 */
#include <stdio.h>
int main()
{
printf ("print-sizeof-pointer.c\n");
printf (" If the result is 8, this machine is a 64-bit system.\n");
printf (" If the result is 4, this machine is a 32-bit system.\n");
printf (" Result: %d\n", sizeof(void *));
}
Ce programme permet donc de savoir si l'adressage est 64-bit ou 32-bit.
Si la taille des pointeurs est 8 octets, cela veut dire que l'adressage est 64-bit.
Si la taille des pointeurs est 4 octets, cela veut dire que l'adressage est 32-bit.
Attention, évitons les confusions:
Comment compiler une version 64-bit et/ou 32-bit ?
Si vous avez un système 64-bit, il est possible de dire au compilateur de générer un exécutable 32-bit ou 64-bit.
Cas de Linux, FreeBSD et Solaris:
Pour compiler en 64-bit:
gcc -o print-sizeof-pointer-solaris-64bit.bin -m64 print-sizeof-pointer.c
Pour compiler en 32-bit:
gcc -o print-sizeof-pointer-solaris-32bit.bin -m32 print-sizeof-pointer.c
Cas de Mac OS X: Comme expliqué dans un post précédent, MacOSX permet de générer des "universal binaries" qui contiennent dans le même fichier les exécutables pour une, deux, trois ou même quatre architectures:
gcc -arch i386 -arch ppc -arch ppc64 -arch x86_64 -o print-sizeof-pointer.bin print-sizeof-pointer.c
J'ai donc écrit un tout petit programme en C qui permet de connaître la taille des pointeurs:
/*
print-sizeof-pointer.c
This little program prints the size of pointers.
On a 64-bit system, pointers are 64-bit (8 bytes),
so this program prints "8".
On a 32-bit system, pointers are 32-bit (4 bytes),
so this program prints "4".
Pierre Bauduin
le 12 juin 2009 */
#include <stdio.h>
int main()
{
printf ("print-sizeof-pointer.c\n");
printf (" If the result is 8, this machine is a 64-bit system.\n");
printf (" If the result is 4, this machine is a 32-bit system.\n");
printf (" Result: %d\n", sizeof(void *));
}
Ce programme permet donc de savoir si l'adressage est 64-bit ou 32-bit.
Si la taille des pointeurs est 8 octets, cela veut dire que l'adressage est 64-bit.
Si la taille des pointeurs est 4 octets, cela veut dire que l'adressage est 32-bit.
Attention, évitons les confusions:
- Sur une machine 64-bit on peut faire tourner un OS 64-bit ou un OS 32-bit. Si l'OS est 32-bit, l'adressage est 32-bit.
- Même si la machine et l'OS sont tous les deux 64-bit, cela ne veut pas dire que tous les exécutables doivent être 32-bit ou 64-bit. Par exemple avec Mac OS X 10.5 "Léopard", une grande majorité des exécutables est encore 32-bit.
- Et donc, sur une machine 64-bit avec un OS 64-bit, il est généralement possible de faire tourner à la fois des exécutables 64-bit et des exécutables 32-bit.
- C'est en fait c'est à la compilation (voir ci-dessous comment) qu'il est possible de choisir de générer un exécutable 32-bit ou 64-bit.
Comment compiler une version 64-bit et/ou 32-bit ?
Si vous avez un système 64-bit, il est possible de dire au compilateur de générer un exécutable 32-bit ou 64-bit.
Cas de Linux, FreeBSD et Solaris:
Pour compiler en 64-bit:
gcc -o print-sizeof-pointer-solaris-64bit.bin -m64 print-sizeof-pointer.c
Pour compiler en 32-bit:
gcc -o print-sizeof-pointer-solaris-32bit.bin -m32 print-sizeof-pointer.c
Cas de Mac OS X: Comme expliqué dans un post précédent, MacOSX permet de générer des "universal binaries" qui contiennent dans le même fichier les exécutables pour une, deux, trois ou même quatre architectures:
gcc -arch i386 -arch ppc -arch ppc64 -arch x86_64 -o print-sizeof-pointer.bin print-sizeof-pointer.c
Libellés :
64-bit,
Debian GNU/Linux,
development,
FreeBSD,
Linux,
Mac OS X,
print-sizeof-pointer,
Solaris
lundi 21 janvier 2008
Une commande Unix/Linux peu connue: who -b
Comme vous le savez probablement, la célèbre commande uptime vous permet de savoir depuis combien de temps une machine Unix/Linux est "up" c'est à dire "en service".
L'uptime d'une machine est généralement un bon indicateur de la stabilité de son système d'exploitation.
Cependant, il est peut être encore plus utile de savoir quand une machine a redémarré pour la dernière fois (date et heure précise). Ceci est particulièrement utile sur des serveurs au bureau. Connaître la date et heure exacte du dernier redémarrage est un bon indice pour déterminer la cause d'un redémarrage inopiné. Par exemple, qui était "de service" ce jour là à cette heure là ? Est-ce la nettoyeuse qui a débranché le serveur pour brancher son aspirateur ? Il suffit de taper:
who -b
Exemple sous Debian GNU/Linux:
L'uptime d'une machine est généralement un bon indicateur de la stabilité de son système d'exploitation.
Cependant, il est peut être encore plus utile de savoir quand une machine a redémarré pour la dernière fois (date et heure précise). Ceci est particulièrement utile sur des serveurs au bureau. Connaître la date et heure exacte du dernier redémarrage est un bon indice pour déterminer la cause d'un redémarrage inopiné. Par exemple, qui était "de service" ce jour là à cette heure là ? Est-ce la nettoyeuse qui a débranché le serveur pour brancher son aspirateur ? Il suffit de taper:
who -b
Exemple sous Debian GNU/Linux:
[pbn@cobra] /home/pbn>who -bExemple sous Solaris:
system boot 2007-12-04 08:42
[pbn@fire] /export/home/pbn>who -bCeci fonctionne sur Red Hat Enterprise Linux, Debian GNU/Linux, Mac OS X, et Solaris, mais pas sous FreeBSD ni PC-BSD...
. system boot Nov 8 10:55
Libellés :
Debian GNU/Linux,
Linux,
Mac OS X,
Open Source,
RHEL,
Solaris,
Unix
Inscription à :
Articles (Atom)