2010-11-13 19 views

Répondre

2

Je ne sais pas ce que malloc doit faire avec, cependant:

#include <unistd.h> 

(size_t) sysconf(_SC_PAGESIZE); 
3

Je suppose que si vous allouez assez un grand tampon, il faudra obtenir encore quelques pages, puis il va Mettez le tampon au début de la première page. Vous pouvez donc allouer deux tampons très volumineux, supprimer le décalage de l'en-tête de la mémoire tampon, puis GCD les deux tampons. Travaillé assez bien sur mon système.

#include <stdlib.h> 
#include <stdio.h> 

unsigned gcd(unsigned a, unsigned b) 
{ 
     if (b == 0) 
       return a; 
     else 
       return gcd(b, a % b); 
} 

void main() { 
    void *p1 = malloc(1000000); 
    void *p2 = malloc(1000000); 
    unsigned p1r = (unsigned) p1 & 0xfffffff0; 
    unsigned p2r = (unsigned) p2 & 0xfffffff0; 
    printf("page size = %u\n", getpagesize()); 
    printf("p1 = %p, p2 = %p\n", p1, p2); 
    printf("p1r = %p, p2r = %p\n", p1r, p2r); 
    printf("gcd = %u\n", gcd(p1r, p2r)); 
} 
+0

Ugly, mais il a la nature de hacker. – dmckee

+0

Quelle est la signification de p1 & 0xfffffff0, pourquoi masquons-nous les 4 derniers bits? – Anonymous

+0

Parce que chaque tampon alloué a un en-tête qui lui est associé. La structure dépend de l'implémentation du tas, mais il y a généralement quelque chose là-bas. La valeur de retour est la mémoire allouée plus un décalage pour masquer cette structure. Donc, pour obtenir le début de la page, nous devons ignorer ce décalage. – kichik