[EDIT: scusate se torno un attimo all'argomento originale]
Sarebbe veramente ora che si passasse a i686. Anche perchè la Slack è più ottimizzata per il 686 di quanto si creda (a causa di un -mtune=i686 nelle librerie), ma meno di quanto dovrebbe

Mi spiego meglio: recentemente mi sono documentato un po' sulle modalità di accesso al kernel. Arch linux usa le istruzioni SYSENTER/SYSEXIT per l'accesso al kernel, mentre la Slackware usa INT 80h. Su sistemi come il P3, P4 e superiori, la INT 80h è molto più lenta su PC performanti! Inoltre la SYSENTER è supportata dal kernel 2.5.53 se non sbaglio peroprio per sopperire a questi problemi prestaizionali.
Tutto questo però non è legato all'intero sistema, ma solo alle glibc. Ci sono programmi che compilati per i486 o per i7 non subiscono il ben che minimo guadagno.
La ricompilazione delle glibc invece mi ha permesso di
triplicare la velocità delle chiamate di sistema. Se volete provare, uno dei benchmark che avevo fatto è questo:
Codice: Seleziona tutto
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#define K 1000000
#define TIMEVARPTR (&t)
#ifdef STATIC_VDSO
# define SYSTEMCALL "call 0xffffe414;"
#else
# define SYSTEMCALL "call *%gs:0x10;"
#endif
#define sys_time() __asm__( \
"leal t, %ebx;" \
"mov $0xD, %eax;" \
SYSTEMCALL \
"mov %eax,t;" \
);
time_t t=0;
unsigned long i;
int main(int c, char **v)
{
if(c>1)
{
puts("Time()");
while(i++ < K) {
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
t = time(TIMEVARPTR);
}
} else
{
puts("__asm__ ");
while(i++ < K)
{
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
sys_time();
}
}
// printf("Time is %d\n", t);
return 0;
}
Questo programma effettua 20 milioni di chiamate
time(). Le uniche note rilevanti sulla compilazione riguardano il VDSO. Controllate il valore di
/proc/sys/vm/vdso_enabled:
- > Se ò 0 o 1, il VDSO è disabilitato e NON compilate con -DSTATIC_VDSO
> Se è 2, allora si può compilare con -DSTATIC_VDSO
> Se è 0 o 1 e compilate con -DSTATIC_VDSO il codice __asm__ dara un SEGFAULT
> "%gs:0x10" e "0xffffe414" possono variare con il kernel o la distro. Su slack 10.2 per eempio l'indirizzo statico è 0xffffe400. Per capirlo bisogna disassemblare il dso del processo o lggere /proc/<pid>/map per capire quali sono gli indirizzi della libreria virtuale linux-gate.so
Il test è stato fatto su un P4 2.4GHz e su un Celeron 2.8GHz entrambi con Slackware 13, kernel 2.6.32.2 ottimizzato, glibc 2.9 di default (ossia che implementano l'INT 80h per saltare nel kernel).
Il test è stato fatto in init 3 da utente senza X caricato, lanciando:
lanciato con un qualsiasi parametro utilizzerà le librerie glibc, altrimenti userà le istruzioni SYSENTER/SYSEXIT.
conraid ha scritto:Fine di Slackware come sistema per vecchi PC (distribuzioni storiche come redhat e debian se non sbaglio hanno ancora la compilazione i386 per esempio), tutto li.
Su questo non ne sarei molto convinto. Inoltre la Slack non è più da qualche versione per i386, ma credo che non dia problemi a molti che magari la installano.
Tornando sull'istruzione SYSENTER che
non è supportata nei Pentium2, si può disabilitare semplicemente caricando il kernel con il parametro
nosep. Così facendo l'indirizzo virtuale
__kernel_vsyscall (che viene deciso dal kenrnel in fase di caricamento del processo) puterà appunto appunto ad un'area in cui verrà effettuato l'INT80h.
In altre parole
call %gs:0x10 chiamerà poi l'
INT 80h (e successivamente ci sarà un ret) il che implica una leggera perita prestazionale nei sistemi che avranno le librerie i686, ma di fatto non supportano queste operazioni.
Io slackbuild modificato per avere le glibc con
queste features l'ho postato qui ...così faccio anche un po' di spam
bye