imitheos Δημοσ. 5 Ιανουαρίου 2014 Δημοσ. 5 Ιανουαρίου 2014 Στον x86 μπορείς να διαβάσεις και χωρις ευθυγράμμιση.Στον MIPS αν τα δεδομενα δεν ειναι ευθυγραμμισμενα,δεν τσουλάει ο κωδικας Αν θέλεις να δοκιμάσεις πως θα συμπεριφερθεί ο κώδικάς σου σε άλλη αρχιτεκτονική (στο βαθμό που μπορείς φυσικά να το τεστάρεις) και σε x86 μπορείς να το ενεργοποιήσεις αυτό. Εδώ είναι η περιγραφή του καταχωρητή σημαιών. Ανάβοντας το κατάλληλο bit, δεν θα επιτρέπεται η μη-ευθυγραμμισμένη προσπέλαση. Ένα παράδειγμα που είχα δώσει και άλλη φορά είναι το παρακάτω. #include <stdio.h> struct foo { char a; int i; short e; }; int main(void) { struct foo foo; #ifdef SPARCSIM __asm__( "pushf\n" "orl $(1<<18), (%esp)\n" "popf\n" ); #endif printf("struct size %zu\n", sizeof(foo)); foo.i = 5; printf("i = %d\n", foo.i); return 0; } Η pushf πετάει στην στοίβα τα περιεχόμενα των σημαιών, με την or ανάβουμε το bit που θέλουμε και μετά με την popf ξαναβάζουμε πίσω την νέα τιμή. Το αποτέλεσμα είναι: % cc -Wall -m32 zz.c && ./a.out struct size 12 i = 5 % cc -Wall -m32 -DSPARCSIM zz.c && ./a.out struct size 12 i = 5 % cc -Wall -m32 -fpack-struct zz.c && ./a.out struct size 7 i = 5 % cc -Wall -m32 -fpack-struct -DSPARCSIM zz.c && ./a.out struct size 7 zsh: bus error ./a.out % dmesg|tail -1 traps: a.out[14261] trap alignment check ip:8048532 sp:ffec9900 error:0 in a.out[8048000+1000] Χωρίς packing όλα παίζουν τζάμι. Αν ενεργοποιήσουμε το packing, τότε με την μανίσια συμπεριφορά πάλι παίζουν όλα (αλλά λίγο πιο αργά). Ανάβοντας το συγκεκριμένο bit, το πρόγραμμα κρασάρει με μήνυμα λάθους bus error και ο πυρήνας εμφανίζει το παραπάνω μήνυμα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα