- Messaggi: 119
- Ringraziamenti ricevuti 0
Linux Avanzato 2008-2009
- Stefano Annunziato
-
- Offline
- Premium Member
-
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
Grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alessandro Pellegrino
-
- Offline
- Junior Member
-
- Messaggi: 21
- Ringraziamenti ricevuti 0
qualcuno mi sa dire il motivo per il quale il programmino sul tempo di caricamento di una pagina (dopo una PAGE FAULT) non funzionava? Il prof a lezione non ha saputo spiegarlo e l'aveva chiesto all'aula; avete per caso svelato l'arcano?
Inoltre vi chiedo un parere, io ho una macchina a 32 bit e ho dovuto apportare sul file read_tsc.h alcune correzioni:
- prima di tutto ho dovuto sostituire unsigned int t1_high, t1_low, t2_high, t2_low; con long long t1_high, t1_low, t2_high, t2_low; in quanto tsc
è un contatore a 64 bit.
- inoltre ho dovuto modificare il codice assembly:
inline void rdtsc1(void)
{
asm("pushq %rax\n\t"
"pushq %rdx\n\t"
"rdtsc\n\t"
"movl %eax,t1_low\n\t"
"movl %edx,t1_high\n\t"
"popq %rdx\n\t"
"popq %rax");
return;
}
in
inline void rdtsc1(void)
{
asm("pushl %eax\n\t"
"pushl %edx\n\t"
"rdtsc\n\t"
"movl %eax,t1_low\n\t"
"movl %edx,t1_high\n\t"
"popl %edx\n\t"
"popl %eax");
return;
}
- infine ho dovuto commentare le voci #include <linux/compiler.h> in ogni programmino in quanto il mio compilatore non le vedeva.
Vi risulta anche a voi una cosa del genere?
Grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
l'anno scorso non c'erano impedimenti di sorta, anche quest'anno si potrà senza problemiSapete se si può sostenere lo scritto il 30 e la prova al calcolatore e/o l'orale a settembre?
anche se tsc è un contatore a 64 bit, esso viene frammentato in due registri a 32 bit, non a caso poi hai scrittoInoltre vi chiedo un parere, io ho una macchina a 32 bit e ho dovuto apportare sul file read_tsc.h alcune correzioni:
- prima di tutto ho dovuto sostituire unsigned int t1_high, t1_low, t2_high, t2_low; con long long t1_high, t1_low, t2_high, t2_low; in quanto tsc
è un contatore a 64 bit.
- inoltre ho dovuto modificare il codice assembly:
"movl %eax,t1_low\n\t"
"movl %edx,t1_high\n\t" quindi no, era giustissimo lasciare unsigned int
inoltre è tecnicamente non corretto usare long long, sarebbe stato comunque preferibile usare unsigned long long per identificare un variabile a 64 bit che andrà a contenere un valore senza segno
hai comunque fatto bene a fare la modifica sulle push e sulle pop perchè l'architettura a 32 bit non ha i registri a 64 bit (e anche l'insieme di istruzioni popq e pushq)
riguardo
non so che dirtiqualcuno mi sa dire il motivo per il quale il programmino sul tempo di caricamento di una pagina (dopo una PAGE FAULT) non funzionava? Il prof a lezione non ha saputo spiegarlo e l'aveva chiesto all'aula; avete per caso svelato l'arcano?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- COM_EASYSOCIAL_GUEST_NAME
-
- Visitatori
-
Thanks
l'anno scorso non c'erano impedimenti di sorta, anche quest'anno si potrà senza problemiSapete se si può sostenere lo scritto il 30 e la prova al calcolatore e/o l'orale a settembre?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alessandro Pellegrino
-
- Offline
- Junior Member
-
- Messaggi: 21
- Ringraziamenti ricevuti 0
anche se tsc è un contatore a 64 bit, esso viene frammentato in due registri a 32 bit, non a caso poi hai scritto
movl fa riferimento ad argomenti a 32 bit, come è il registro eax e come dovrebbe essere la variabile t1_low"movl %eax,t1_low\n\t" "movl %edx,t1_high\n\t"
quindi no, era giustissimo lasciare unsigned int
inoltre è tecnicamente non corretto usare long long, sarebbe stato comunque preferibile usare unsigned long long per identificare un variabile a 64 bit che andrà a contenere un valore senza segno
Inoltre vi chiedo un parere, io ho una macchina a 32 bit e ho dovuto apportare sul file read_tsc.h alcune correzioni:
- prima di tutto ho dovuto sostituire unsigned int t1_high, t1_low, t2_high, t2_low; con long long t1_high, t1_low, t2_high, t2_low; in quanto tsc
è un contatore a 64 bit.
Ok allora ti faccio un altra domanda; lui subito dopo nella funzione timediff fa questa cosa:
/* move 32 least significant bits in 32 most significant ones */
t2_high = t2_high << 31;
t1_high = t1_high << 31;
tick_diff = (t2_high + t2_low) - (t1_high + t1_low);
Ovvero sposta i 32 bit meno significativi di t2_high e t1_high nei 32 bit più significativi, per poi eseguire la somma con la seconda parte di TSC, (aggiunge t2_low e t1_low). Se tutto questo venisse fatto su una variabile a 32 bit avremmo dei valori sballati, no? Non è quindi giusto dichiararle long long per avere una dimensione di 8 byte?
Oi grazie per l'interessamento
Si prega Accedi o Crea un account a partecipare alla conversazione.