Newsgroup: it.comp.os.linux.development
Titolo: Grandi allocazioni in C

Stavo scrivendo un programmino che processa file audio, ma quando ho
tentato di fare una allocazione di qualche mega linux mi ha risposto
picche. Ho gia' visto che se richiedo la stessa memoria in n malloc
successive di dimensioni piu' piccole va tutto bene.
Quale e' la via piu' "pulita" per avere un array di char di 10 Mega ?
(mi semplificherebbe maledettamente tutta la faccenda:-)
Grazie, Matteo.

Recentemente, 
nasta_...@freemail.it
 (Matteo Nastasi) 
affido' alla Rete queste parole:

(0)pern:~/tmp% cat prova.c
#include <stdio.h>
#include <stdlib.h>
#define MEGA (1024*1024)
int main() {
 
        char * pippo = malloc(10*MEGA);
        char * pluto = malloc(100*MEGA);
        printf("Allocated  10 mega at %p\n",pippo);
        printf("Allocated 100 mega at %p\n",pluto);
        return 0;
}
(0)pern:~/tmp% gcc -Wall prova.c
(0)pern:~/tmp% ./a.out
Allocated  10 mega at 0x40107008
Allocated 100 mega at 0x40b08008
Sei sicuro di non passare l'argomento come uno short o qualcosa del
genere, o di non includere l'header per avere la conversione a size_t? 
                       Romano 
-- 
Romano Giannetti --- Linux dai tempi di 0.99pl8 --- e ora...
Linux 
pern.dea.icai.upco.es
 2.2.13
Change - with . and delete .no.spam from my email address!

 Grazie, Matteo.
Credo che la via corretta sia ricompilare il kernel con l'opzione
'bigphysicalarea' abilitata, aggiungere in lilo.conf la riga (credo)
'bigphysicalarea=XXX" e eseguire lilo.
XXX sono le pagine di memoria (1 pagina = 4Kb) da allocare.
Non mi ricordo di preciso il nome del paramentro da inserire in
lilo.conf, ma il procedimento funge (almeno x l'acquisizione video).
Al

 Quale e' la via piu' "pulita" per avere un array di char di 10 Mega ?
Più o meno qualcosa del genere:
[root@fokhouse /tmp]# cat diecimega.c
#include <stdio.h>
#include <stdlib.h>
#define DIECI_MEGA (1024 * 1024 * 10)
int main(void)
{
        char *c = malloc(DIECI_MEGA);
        if (c)
                printf("Allocati %d byte.\n", DIECI_MEGA);
        else {
                perror("malloc"); exit(1);
        }
        free(c);
        return 0;
}
[root@fokhouse /tmp]# gcc diecimega.c -Wall -ansi -pedantic
[root@fokhouse /tmp]# ./a.out
Allocati 10485760 byte.
[root@fokhouse /tmp]#
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

'bigphysicalarea' abilitata, aggiungere in lilo.conf la riga (credo)
Non c'entra assolutamente niente.
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

Quale e' la via piu' "pulita" per avere un array di char di 10 Mega ?
Una unica malloc.


> .....
Probabilmente il giorno che ho fatto i test dovevo avere qualche problema
sulla macchina. Ho ricompilato il sorgente di test che avevo utilizzato
all'epoca e non ho avuto piu' alcun problema.
Grazie a tutti, Matteo.

 Non c'entra assolutamente niente.
Ok, sorry... ma allora xchè per fare acquisizione video devo per
forza abilitarla? E' una prerogativa dei frame grabber, o cosa?
Tnx,
    Al

forza abilitarla? E' una prerogativa dei frame grabber, o cosa?
Perche` il frame grabber ha bisogno di memoria fisicamente contigua.


 Perche` il frame grabber ha bisogno di memoria fisicamente contigua.
Grazie.