K8 : Systèmes d'Exploitations
Comme on peut s'en douter, il n'est pas, à l'heure actuelle, évident
de tester une plate-forme comme le K8 d'AMD. Si le fonctionnement en 32
bits ne pose généralement, pas de problème grâce
a la compatibilité parfaite du processeur avec les systèmes
d'exploitation 32 bits, ce n'est pas le cas du mode 64 bits. A l'heure
actuelle, à part une rarissime version alpha de Windows .NET x86-64,
il n'existe que linux dont le kernel supporte le jeu d'instructions 64
bits d'AMD. D'autre part, après le système d'exploitation,
il faut aussi que les applications soient portées puis compilées
correctement pour tirer parti du x86-64.
Comme à l'heure actuelle, aucune application n'est portée
pour les extensions 64 bits d'AMD, nous avons dû nous rabattre sur
des tests 32 bits. Les tests 64 bits arriveront dans la deuxième
partie de notre saga K8, quand les applications dédiées
seront prêtes. Cependant, il fallait pouvoir tester sous Windows.
Pour cela, nous avons utilisé les OS suivants : Windows .NET Server
RC2, Windows "Longhorn" basé sur XP (Build 3617) et pour
finir, une RedHat 7.3 avec les extensions x86-64.
I) Windows .NET 2003 RC2 :
Windows .NET est en fait le remplaçant de la famille Server de
Windows 2000. Si tout va bien, Windows .NET devrait être disponible
d'ici quelques mois. Cependant, il y a peu de chance qu'une version x86-64
sorte directement lors de l'annonce de ce nouveau système d'exploitation.
Disponible actuellement en Beta RC2 (très proche de la version
finale), nous avons installé le K8 d'AMD sur ce système.
Contrairement à Windows 2000 et Windows XP, Windows .NET a reconnu
immédiatement tous les composants de la carte mère, en particulier
l'AMD 8151 et l'AMD 8111. Voyons ça :
Comme on le voit, la chaîne (erronée) "AMD Opteron(tm)
Processor", inscrite par le BIOS dans le PSN du processeur au boot,
revient bien dans le menu système. La fréquence est correctement
détectée. Quant aux périphériques, tout est
parfaitement identifié pour ce qui est du chipset AMD. Pour le
VIA K8T400, l'installation des drivers Hyperion 4.45v suffit à
faire reconnaître le chipset.
II) Windows Longhorn XP Alpha :
Une version Alpha de Windows Longhorn a filtré, il y a quelques
semaines, des laboratoires de Microsoft. Ce nouveau système d'exploitation,
qui devrait sortir en 2004, sera le successeur de Windows XP. Bien que
le système soit extrêmement alpha, certaines rumeurs parlaient
d'un possible support du jeu d'instructions x86-64 dans cette pré-version.
Nous avons donc tenté l'expérience :
Malheureusement, si le système a reconnu tous les éléments
de la carte mère sans trop de problèmes, on ne voit nulle
part la présence du support 64 bits. A terme, Windows Longhorn
ne pourra se permettre de ne pas supporter le processeur d'AMD, mais à
l'heure actuelle, l'X86-64 ne semble pas géré. De même,
vue la grande instabilité de cette version, nous avons choisi d'utiliser
exclusivement Windows .NET RC2 pour les tests et autres benchmarks. A
titre d'informations, on ne constate aucun écart de performances
entre Windows .NET et Windows XP. Les résultats peuvent donc être
considérés comme stables.
Petite annexe, certains se demanderont sûrement comment est détecté
le nouveau processeur d'AMD actuellement par les différents logiciels
de reconnaissance. Voyons pour commencer CPU-Z (modifié pour l'occasion)
et wcpuid :
On le voit, aucun des deux logiciels ne parvient à détecter
le coefficient ni la fréquence de base utilisée (7 x 200
dans notre cas). Selon Franck, ce n'est qu'une affaire de temps avant
que CPUZ ne parviennent à identifier correctement les spécifications
du nouveau processeur. Après ces deux logiciels, pourquoi pas un
petit Sandra ? Bien que la version AA64 de Sandra ne soit pas encore disponible,
la version actuelle nous donne quelques informations (mais guère
plus que CPUZ) :
Il faudra probablement attendre quelques mois avant que tous ces logiciels
de détection ne soient disponibles pour l'architecture K8 d'AMD
et tous les contrôleurs qui gravitent autour.
III) Linux - RedHat 7.3 - x86-64
Seul système vraiment à même de supporter le jeu
d'instructions 64 bits d'AMD à l'heure actuelle, Linux dispose
d'un kernel adapté à l'Athlon 64 et à l'Opteron.
Cependant, comme nous allons le voir, l'installation d'un tel noyau n'est
pas une partie de plaisir. Pour notre test, nous nous sommes basés
sur une Redhat 7.3. La majorité des informations et des téléchargements
sur l'architecture x86-64 sous linux sont disponibles ici.
Pour installer un système capable de compiler et d'exécuter
du code x86-64, il faut construire la toolchain. C'est a dire un ensemble
de programmes permettant de compiler un kernel x86-64 et donc de faire
fonctionner correctement l'OS. Après avoir consulté plusieurs
pages de documentations parsemées ici et la, nous avons tenté
l'expérience. Voici donc un mini-HOWTO de l'installation x86-64
sous linux à partir d'une RedHat 7.3 :
- Installation des BinUtils
Avant toute chose, il faut installer les BinUtils. Car avant de compiler
des programmes évolués en C ou C++, il faut déjà
pouvoir générer du code assembleur. Les binutils sont donc
un package comprenant principalement l'assembleur GNU (x86-64 dans notre
cas), le linker ASM ainsi que les utilitaires nécessaires à
la compilation du code assembleur. On trouve la dernière version
des binutils sur ftp://ftp.x86-64.org/pub/stable-tools/current/. Procédure
d'installation :
$ cd /usr/src
$ wget ftp://ftp.x86-64.org/pub/stable-tools/current/binutils.tar.bz2
$ bunzip2 binutils.tar.bz2
$ tar xfv binutils.tar
$ cd binutils
$ ./configure --target=x86_64-unknown-linux --prefix=/opt/x86-64
$ make
$ make install
Normalement, tout devrait se passer sans problème. On passe donc
à l'étape suivante : GCC.
- Installation de GCC x86-64
(1)
GCC est le compilateur C et C++ de Linux, c'est lui qui permet de compiler
les programmes, en x86-64 dans notre cas. La réinstallation de
GCC est une étape trés délicate. Voila comment procéder
:
$ cd /usr/src
$ wget ftp://ftp.x86-64.org/pub/stable-tools/current/gcc.tar.bz2
$ bunzip2 gcc.tar.bz2
$ tar xfv gcc.tar
$ cd gcc
$ PATH=$PATH:/opt/x86-64/bin/
$ CFLAGS="-O2 -Dinhibit_libc" ../gcc/configure --target=x86_64-unknown-linux
/
--prefix=/opt/x86-64 --enable-languages=c --disable-shared --disable-multilib
/
--enable-threads=single
$ make
$ make install
Comme on le voit, on ne compile GCC que pour le support du C et pas du
C++. En effet, il faut la GlibC appropriée pour pouvoir compiler
le C++. Cependant, l'installation de la gcc nééessite les
sources du Kernel de linux. Installons donc ces sources :
- Installation des sources de
linux + dépendances
Avant toute chose, il faut préciser que les sources officielles
de linux, disponibles sur kernel.org, doivent souvent être patchées
avec un patch adapté qu'on trouve sur x86-64.org. Dans notre exemple,
tout a fonctionné sans problème et sans patch. De même,
après le kernel stable (2.4.20 au moment des tests), vous pourrez
tenter l'installation d'un kernel Beta comme le 2.5.59 (toujours au moment
des tests) qui supporte mieux les composants des cartes mères K8.
$ cd /usr/src
$ wget ftp://ftp.x86-64.org/pub/linux-x86_64/v2.4/linux-x86_64-24.20-1.tar.gz
$ bunzip2 linux-x86_64-2.4.20-1.tar.bz2
$ tar xfv linux-x86_64-2.4.20-1.tar
$ cd /usr/src/linux
$ make include/linux/version.h
$ cd /opt/x86-64/x86_64-unknown-linux
$ mkdir include
$ ln -s include sys-include
$ cd include
$ ln -s /usr/src/linux/include/linux linux
$ ln -s /usr/src/linux/include/asm-x86_64 asm
$ cd /opt/x86-64/bin
$ ln -s x86_64-unknown-linux-addr2line x86_64-linux-addr2line
$ ln -s x86_64-unknown-linux-ar x86_64-linux-ar
$ ln -s x86_64-unknown-linux-as x86_64-linux-as
$ ln -s x86_64-unknown-linux-c++ x86_64-linux-c++
$ ln -s x86_64-unknown-linux-c++filt x86_64-linux-c++filt
$ ln -s x86_64-unknown-linux-cpp x86_64-linux-cpp
$ ln -s x86_64-unknown-linux-g++ x86_64-linux-g++
$ ln -s x86_64-unknown-linux-gcc x86_64-linux-gcc
$ ln -s x86_64-unknown-linux-gccbug x86_64-linux-gccbug
$ ln -s x86_64-unknown-linux-gcov x86_64-linux-gcov
$ ln -s x86_64-unknown-linux-ld x86_64-linux-ld
$ ln -s x86_64-unknown-linux-nm x86_64-linux-nm
$ ln -s x86_64-unknown-linux-objcopy x86_64-linux-objcopy
$ ln -s x86_64-unknown-linux-objdump x86_64-linux-objdump
$ ln -s x86_64-unknown-linux-ranlib x86_64-linux-ranlib
$ ln -s x86_64-unknown-linux-readelf x86_64-linux-readelf
$ ln -s x86_64-unknown-linux-size x86_64-linux-size
$ ln -s x86_64-unknown-linux-strings x86_64-linux-strings
$ ln -s x86_64-unknown-linux-strip x86_64-linux-strip
On peut ensuite passer à l'installation de la Glibc :
La GlibC est un ensemble de librairies indispensable pour compiler du
C++. Son installation est elle aussi très délicate au vu
des nombreux liens symboliques indispensables. Procédons :
$ cd /usr/src
$ wget ftp://ftp.x86-64.org/pub/stable-tools/current/glibc.tar.bz2
$ bunzip2 glibc.tar.bz2
$ tar xfv glibc.tar
$ cd glibc
$ CC=/opt/x86-64/bin/x86_64-unknown-linux-gcc ../glibc/configure /
--disable-profile --prefix=/opt/x86-64/x86_64-unknown-linux -without-cvs
/
--enable-add-ons x86_64-unknown-linux
$ make
$ make install
De même, tout devrait se passer sans problème. Une fois
la GlibC installée, on peut compiler de nouveau GCC avec, cette
fois, le support C++ :
- Installation de GCC x86-64
(2)
Procédons à la deuxième installation (finale) de
GCC avec le support C++. Il n'est pas conseillé ici d'ajouter le
support pour d'autres languages comme Fortran ou Java :
$ cd /usr/src/gcc
$ ./configure --target=x86_64-unknown-linux --prefix=/opt/x86-64 /
--enable-languages=c,c++ --enable-threads=posix --disable-multilib
$ ln -s /usr/src/gcc/include /usr/src/gcc/x86_64-unknown-linux/include
$ make
$ make install
C'est fini !
Il reste ensuite à compiler le kernel en spécifiant bien
une architecture de type "Athlon64/Opteron/K8/Hammer". On peut
ensuite tenter de booter sur le nouveau noyau. Dans notre cas, le 2.4.20
plantait sur la détection de l'APIC, mais le 2.5.59 n'a pas eu
ce problème et tout a directement fonctionné du premier
coup :
old
bootloader convention, maybe loadlin?
Bootdata ok (command line is auto BOOT_IMAGE=linuxtest ro root=305
BOOT_FILE=/boot/vmlinuz-2.5.59)
Linux version 2.5.59 (root@x86tst.org) (version gcc 3.2) #5 SMP Sun
Jan 12 17:59:40 CET 2003
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000000ff40000 (usable)
BIOS-e820: 000000000ff40000 - 000000000ff50000 (ACPI data)
BIOS-e820: 000000000ff50000 - 0000000010000000 (ACPI NVS)
BIOS-e820: 00000000ffbc0000 - 0000000100000000 (reserved)
Scan SMP from 0000010000000000 for 1024 bytes.
Scan SMP from 000001000009fc00 for 1024 bytes.
Scan SMP from 00000100000f0000 for 65536 bytes.
Scan SMP from 000001000009fc00 for 4096 bytes.
On node 0 totalpages: 65344
DMA zone: 4096 pages, LIFO batch:1
Normal zone: 61248 pages, LIFO batch:14
HighMem zone: 0 pages, LIFO batch:1
Found and enabled local APIC!
mapped APIC to ffffffffff5ff000 ( fee00000)
Checking aperture...
CPU 0: aperture @ 4000000 size 32768 KB
Aperture pointing to e820 RAM. Ignoring.
Mapping aperture over 65536 KB of RAM @ 4000000
Building zonelist for node : 0
Kernel command line: auto BOOT_IMAGE=linuxtest ro root=305 BOOT_FILE=/boot/vmlinuz-2.5.59
Initializing CPU#0
PID hash table entries: 16 (order 4: 256 bytes)
time.c: Using 1.1931816 MHz PIT timer.
time.c: Detected 1413.931 MHz processor.
Console: colour VGA+ 80x25
Calibrating delay loop... 2801.66 BogoMIPS
Memory: 186288k/261376k available (2081k kernel code, 74376k reserved,
537k data, 356k init)
Dentry cache hash table entries: 32768 (order: 7, 524288 bytes)
Inode-cache hash table entries: 16384 (order: 6, 262144 bytes)
Mount-cache hash table entries: 256 (order: 0, 4096 bytes)
CPU: L1 I Cache: 64K (64 bytes/line), D cache
64K (64 bytes/line)
CPU: L2 Cache: 256K (64 bytes/line)
CPU: After vendor init, caps: 078bfbff e1d3fbff 00000000 00000000
CPU: After generic, caps: 078bfbff e1d3fbff 00000000 00000000
POSIX conformance testing by UNIFIX
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
CPU: L2 Cache: 256K (64 bytes/line)
CPU: After vendor init, caps: 078bfbff e1d3fbff 00000000 00000000
CPU: After generic, caps: 078bfbff e1d3fbff 00000000 00000000
CPU0: AMD AMD Opteron(tm) Processor stepping 01
per-CPU timeslice cutoff: 256.02 usecs.
task migration cache decay timeout: 1 msecs.
weird, boot CPU (#0) not listed by the BIOS.
SMP motherboard not detected.
enabled ExtINT on CPU#0
ESR value before enabling vector: 00000000
ESR value after enabling vector: 00000000
watchdog: setting K7_PERFCTR0 to ffea7078
testing NMI watchdog ... OK.
Using local APIC timer interrupts.
Detected 12.624 MHz APIC timer.
Starting migration thread for cpu 0
CPUS done 8
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
PCI: Probing PCI hardware
PCI: Probing PCI hardware (bus 00)
PCI: Using IRQ router default [1022/746b] at 00:07.3
PCI: Failed to allocate resource 0(fffffe8000000000-fc9fffff) for
01:01.0
Linux agpgart interface v0.100 (c) Dave Jones
agpgart: Maximum main memory to use for agp memory: 203M
agpgart: AGP aperture is 64M @ 0x4000000
PCI-DMA: Warning: Small IOMMU 32MB. Consider increasing the AGP aperture
in BIOS
PCI-DMA: Reserving 32MB of IOMMU area in the AGP aperture
Total HugeTLB memory allocated, 0
IA32 emulation $Id: sys_ia32.c,v 1.32 2002/03/24
13:02:28 ak Exp $
aio_setup: sizeof(struct page) = 80
VFS: Disk quotas dquot_6.5.1
Journalled Block Device driver loaded
Coda Kernel/Venus communications, v5.3.15, coda@cs.cmu.edu
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
udf: registering filesystem
Serial: 8250/16550 driver $Revision: 1.90 $ IRQ sharing disabled
ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
pty: 2048 Unix98 ptys configured
Real Time Clock Driver v1.11
Non-volatile memory driver v1.2
FDC 0 is a post-1991 82077
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
loop: loaded (max 8 devices)
3c59x: Donald Becker and others. www.scyld.com/network/vortex.html
01:06.0: 3Com PCI 3c905C Tornado at 0xd000. Vers LK1.1.19
PCI: Enabling device 01:01.0 (0000 -> 0002)
PCI: No IRQ known for interrupt pin A of device 01:01.0.
PCI: Unable to reserve mem region #1:180fca00000@fffffe8000000000
for device 01:01.0
PCI: Unable to reserve mem region #1:180fca00000@fffffe8000000000
for device 01:01.0
amd8111e: Cannot obtain PCI resources, exiting.
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 33MHz system bus speed for PIO modes; override with
idebus=xx
AMD8111: IDE controller at PCI slot 00:07.1
AMD8111: chipset revision 3
AMD8111: not 100% native mode: will probe irqs later
AMD_IDE: Bios didn't set cable bits corectly. Enabling workaround.
ide: Assuming 33MHz system bus speed for PIO modes; override with
idebus=xx
AMD_IDE: Advanced Micro Devic AMD-8111 IDE (rev 03) UDMA100 controller
on pci00:07.1
|
Suite ( K8 : Architecture
matérielle )
|