Sto scrivendo un kernel e ho bisogno (e voglio) di mettere più stack e heap nella memoria virtuale, ma non riesco a capire come metterli in modo efficiente. Come fanno i programmi normali?Dove sono collocati più stack e heap nella memoria virtuale?
In che modo (o dove) sono posizionati stack e heap nella memoria virtuale limitata fornita da un sistema a 32 bit, in modo tale che abbiano lo stesso spazio di crescita il più possibile?
Ad esempio, quando un programma banale è caricato in memoria, il layout del suo spazio di indirizzi potrebbe essere simile:
[ Code Data BSS Heap-> ... <-Stack ]
In questo caso il cumulo può crescere grande come memoria virtuale consente (ad esempio, fino allo stack), e credo che questo sia il modo in cui l'heap funziona per la maggior parte dei programmi. Non esiste un limite superiore predefinito.
Molti programmi hanno librerie condivise che si trovano da qualche parte nello spazio degli indirizzi virtuali. Quindi ci sono programmi multi-thread che hanno stack multipli, uno per ogni thread. E i programmi .NET hanno multiple heaps, ognuno dei quali deve essere in grado di crescere in un modo o nell'altro.
Semplicemente non vedo come ciò sia fatto ragionevolmente efficiente senza mettere un limite predefinito alle dimensioni di tutti gli heap e gli stack.
Tuttavia, il passaggio da un thread all'altro non deve modificare l'intero spazio indirizzo (e causare il flush del TLB), quindi per ogni thread utilizzato da un processo, lo stack _must_ deve essere presente nello spazio di indirizzamento del processo. E il link nel mio post mostra un'immagine di come un processo CLR ha molti heap. Quindi c'è bisogno di più di uno stack e heap in uno spazio di indirizzi. – Virtlink
Lo spazio degli indirizzi è un livello molto diverso di astrazione. In realtà, in questo caso hai gli stack multipli e gli heap nello stesso spazio degli indirizzi. Lo stesso spazio degli indirizzi è gestito dal sistema operativo mentre l'heap non lo è; è gestito dal codice della libreria a livello utente. – Powerslave