Stack segment

Zde je shrnutí, co vše stack segment obsahuje. Každé vlákno obsahuje call stack = kus virtuální paměti dedikovaný pro celé vlákno Call stack obsahuje stack frame = kus virtuální paměti dedikovaný pro konkrétní volání nějaké podrutiny Stack frame jsou naskládané ve struktuře LIFO podle toho, jak se řetězí volání jednotlivých podrutin. Pro každé volání podrutiny (podle volací konvence) vzniká nový stack frame. Jakmile je podrutina dokončena, stack frame zanikne. Stack segment struktura ⚠️ Důležité k zapamatování: Stack segmentu se běžně říká jen stack. ...

1 min · 83 slov · Miroslav Thompson

🐛 Stack overflow

Call stack je flexibilní struktura. Může obsahovat libovolné množství stack framů ale jen až do určitého limitu 1. Jakmile je tento limit překročen, dojde k chybě a OS proces ukončí. Ke stack overflow běžně dochází, když si autor nějakého programu nevšimne, že se jeho proces dostává do nekonečné smyčky při volání funkcí/podrutin. Aplikační kód zavolá funkci A = nový stack frame Funkce A zavolá funkci B = nový stack frame Funkce B zavolá funkci C = nový stack frame Funkce C zavolá funkci A = nový stack frame Funkce A zavolá funkci B = nový stack frame Funkce B zavolá funkci C = nový stack frame Funkce C zavolá funkci A = nový stack frame Funkce A zavolá funkci B = nový stack frame Funkce B zavolá funkci C = nový stack frame atd… Tento limit je určený kapacitou specializovaného “stack registru” přímo v procesorech. ↩︎ ...

1 min · 145 slov · Miroslav Thompson

Heap segment: získání paměti

Heap segment nebo jen heap je kus virtuální paměti, který se chová jako data segment s tím rozdílem, že proces si do heapu může za běhu libovolně přidávat a zase z něj odstraňovat cokoliv, co potřebuje. Získání paměti Funguje to následovně: proces si řekne OS o kus virtuální paměti s nějakým rozsahem, např. 4 bajty OS ve virtuální paměti vytvoří 4 bajty OS do aktuálního stack frame předá adresu virtuální paměti na tyto 4 bajty. Proces může nyní díky této adrese ze 4 bajtové paměti libovolně číst a libovolně do ní zapisovat Heap: vyžádání virtuální paměti ⚠️ Důležité k zapamatování: Proces může skrz tuto adresu může libovolně číst a měnit jakékoliv bity v tomto 4 bajtovém rozsahu a to ze všech svých vláken po celou dobu běhu procesu nebo dokud se nerozhodne paměť vrátit (viz. další kapitola). ...

1 min · 191 slov · Miroslav Thompson

Heap segment: vrácení paměti

Vrácení paměti je přímočaré. Proces sdělí OS API, že už danou položku heapu nepotřebuje a předá adresu, kterou původně od OS API dostal. OS API položku uvolní. Proces již nemůže adresu jakkoliv využít

1 min · 33 slov · Miroslav Thompson

🐛 Memory leak

Situaci, kdy proces nevrátí již nepoužívanou paměť, se říká memory leak a toto se považuje za chybné chování programu. Procesy by měly nepoužitou paměť vracet, jakmile ji nepotřebují. ⚠️ Důležité k zapamatování: Adresy na virtuální paměť, kterou proces získal od OS jsou jediný možný způsob jak se proces k přidělené paměti může dostat. Pokud špatně naprogramovaný proces adresu ztratí tak už se k získané paměti nedostane a tudíž ji nemůže ani vrátit tzn. došlo k memory leaku. ...

1 min · 77 slov · Miroslav Thompson

Paging / swapping

Stack a heap rostou “proti sobě”. Jakmile se potkají, procesu dojde volná paměť. Segmenty procesové paměti Co je přesně všechno se ale počítá jako volná virtuální paměť procesu je složitější problém: Ve Windows jsou limity na virtuální paměť závislé na instrukční sadě procesoru a na edici OS. U Linuxu jsou tyto Limity odlišné v každé distribuci. Limity jsou většinou vysoké, někdy i “nekonečné” tzn. OS využití virtuální paměti nijak dál nelimituje, než kapacitou dostupné RAM paměti + persistentních uložišť. ⚠️ Nezapomeňte, že virtuální pamět umí využívat i persistentní uložiště ale k tomu dochází až po té, co dojde fyzciká RAM paměť. ...

2 min · 279 slov · Miroslav Thompson

Nedefinovaný obsah paměti

OS procesům poskytuje libovolné množství paměti, stačí si o něj jenom říct - neboli alokovat. Jakmile proces paměť nepotřebuje, měl by tuto paměť “vrátit” - neboli dealokovat. ☝️ Otázka: Co obsahuje paměť, kterou proces čerstvě alokoval? Jsou to všechno nuly? Nebo jedničky? Nebo je to složitější? Odpověď: C. - je to složitější. Bity RAM paměti po zapnutí počítače Jakmile vypnete počítač tak se bitový obsah v RAM paměti nenávratně ztratí. ...

1 min · 197 slov · Miroslav Thompson

🩸 Use after free

⚠️⚠️⚠️ Extra důležité k zapamatování ⚠️⚠️⚠️ OS se stará pouze o přidělování a odebírání paměti, běžně se ale nikdy nestará o obsah. Jakmile v paměti nastavíte jakékoliv bity a pak tu paměť dealokujete tak OS na ty bity už znovu nesahá a nechává je, tak jak jsou. OS pak klidně může prostor obsahující tyto bity přidělit jinému procesu! Toto má velký vliv na bezpečnost. V paměti jsou často uložené citlivé údaje, jako například hesla. OS vám zaručuje, že žádný jiný proces nemůže přistoupit k paměti vašeho procesu ale už vám nezaručuje, co se s vaší pamětí stane, jakmile ji dealokujete. ...

1 min · 133 slov · Miroslav Thompson