Προς το περιεχόμενο

Συζήτηση στο Memory Alignment


gon1332

Προτεινόμενες αναρτήσεις

Στον x86 μπορείς να διαβάσεις και χωρις ευθυγράμμιση.Στον MIPS αν τα δεδομενα δεν ειναι ευθυγραμμισμενα,δεν τσουλάει ο κωδικας :P

Αν θέλεις να δοκιμάσεις πως θα συμπεριφερθεί ο κώδικάς σου σε άλλη αρχιτεκτονική (στο βαθμό που μπορείς φυσικά να το τεστάρεις) και σε 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 και ο πυρήνας εμφανίζει το παραπάνω μήνυμα.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...