Open farukyld opened 3 weeks ago
normalde nasıl yapılıyor? bu arada bizde hizasız durumda exception veriyor ama bu işine yarar mı?
normalde nasıl yapılıyor?
normalde sbrk ile ilgili bir hizalama kısıtı yok. ama malloc 8 byte hizalı döndürüyor.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
void *p;
p = malloc(1);
printf("1 byte mallocd: %p\n",p);
p = malloc(1);
printf("1 more byte mallocd: %p\n",p);
int* q = (int*)(((char*)p)+1);
printf("p + 1 casted to int pointer: %p\n",q);
int a = 1;
*q=a;
p = sbrk(0);
printf("Initial brk: %p\n", p);
p = sbrk(1); // Increase the brk (returns OLD brk!)
p = sbrk(0); // Get the new brk
printf("New brk: %p\n", p);
return 0;
}
koduyla denedğimide çıktısı:
> gcc main.c ; ./a.out
1 byte mallocd: 0x556830a732a0
1 more byte mallocd: 0x556830a736d0
p + 1 casted to int pointer: 0x556830a736d1
Initial brk: 0x556830a94000
New brk: 0x556830a94001
Hizasız bir poniter'ı int poniter'ına cast edince hizalama yapıyor mu diye de baktım. yapmıyormuş.
14b7dc617b253fd7408cae3c32249f6c8c190d88'te sbrk 8 byte hizalı döndürecek diye değiştirmiştim. geçici bir çözüm sağlayacak, belki daha sonra hizalama görevini malloc'a alırım, standard kütüphane'de (malloc ve sbrk'in gerçeklendiği libc) olduğu gibi.
bu arada bizde hizasız durumda exception veriyor ama bu işine yarar mı?
bence evet. çünkü kodun temiz olduğundan emin olmamızı sağlar. hem spike'ta da yanlış hatırlamıyorsam hata veriyordu
iki mümkün çözüm var:
1 - hizasız olarak hesaplanan pointer'ı hizalayarak, her
sbrk
çağrısından < 8
byte alanı israf etmek. 2 - daha zorlama bir çözüm olmakla birlikte: hizasız döndürülen pointer'ı malloc ve free içinde göz önünde bulundurarak gösterdiği alana parçalı load/store yapmak.