feat: add interactive FC01 heap4 card

This commit is contained in:
user
2026-07-20 12:04:14 +02:00
parent bd34c7ec1e
commit 48eccb5e24
39 changed files with 7744 additions and 210 deletions
+9
View File
@@ -7,3 +7,12 @@ build/*/prog.map
build/*/*.o
cmake-build-*/
compile_commands.json
doc/generated/*.aux
doc/generated/*.fdb_latexmk
doc/generated/*.fls
doc/generated/*.log
doc/generated/*.out
doc/generated/*.pdf
doc/generated/*.upa
doc/generated/*.upb
doc/generated/build-meta.tex
+39 -2
View File
@@ -1,11 +1,14 @@
# Karta pracy: FreeRTOS `heap_4`
Trzy krótkie zadania po kartach `pointers` i `structures`:
Trzy programy wspierające kartę po K&R 5.4 oraz `structures`:
1. first-fit + split na arenie 256 B;
1. nagłówek, wyrównanie i geometria splitu na arenie 256 B;
2. lista adresowa + scalanie `A | B | C`;
3. niezmodyfikowany FreeRTOS-Kernel V11.3.0 `heap_4.c`.
W lekcji 30-minutowej programy 12 są demonstracjami z predykcją. Uczeń
debugguje wyłącznie program 3.
Task 3 linkuje upstream `portable/MemMang/heap_4.c` z commita
`9b777ae5c5b8e9e456065a00294d1e5f5f9facf5`.
@@ -14,8 +17,42 @@ Task 3 linkuje upstream `portable/MemMang/heap_4.c` z commita
- RP2350: zgodny core+port z forka Raspberry Pi (`4f7299d6ea74`) oraz
podstawiony stabilny allocator V11.3.0.
## Bezpośrednia kontynuacja K&R 5.4
Lekcja zaczyna się od gotowego projektu z poprzedniej karty:
`allocbuf[64]`, `allocp`, `alloc(5)`, `alloc(7)` oraz offsety
`0 -> 5 -> 12`. Ten alokator:
- nie potrafi zwolnić pierwszego bloku i zachować drugiego;
- nie przechowuje rozmiaru ani stanu zwróconego obszaru;
- nie zapamiętuje i nie wykorzystuje dziur;
- odzyskuje pamięć wyłącznie przez reset całej areny.
FC01 odpowiada na jedno pytanie projektowe: **co trzeba dodać, aby zwalniać
dowolny blok i ponownie wykorzystywać powstałe miejsce?** Odpowiedzią jest
mechanika `heap_4`: nagłówek bloku, lista wolnych bloków uporządkowana po
adresie, first-fit, split oraz scalanie fizycznych sąsiadów.
FreeRTOS udostępnia kilka wymiennych implementacji tego samego API i projekt
linkuje dokładnie jedną. `heap_1`, `heap_2`, `heap_3` i `heap_5` są w tej
karcie tylko jednominutową mapą kontekstu. Cała obserwowana implementacja to
niezmodyfikowany [`heap_4.c` z FreeRTOS-Kernel V11.3.0](https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/V11.3.0/portable/MemMang/heap_4.c).
Lekcja trwa 30 minut. Task 1 i Task 2 są krótkimi demonstracjami z predykcją;
Task 3 jest jedynym centralnym przebiegiem ucznia w debuggerze. Obraz dla
Pico 2 W musi być zbudowany i wgrany przed zajęciami. `heap_4` jest wyborem
linkera projektu, nie sprzętowym mechanizmem RP2350.
## Jedno wejście: `stemctl`
Centralny przebieg lekcji, przygotowany przed wejściem uczniów:
```bash
stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD
```
Pełna weryfikacja repozytorium wykonywana poza 30-minutową lekcją:
```bash
stemctl series cards fetch freertos heap4
stemctl test native-amd64 freertos heap4 1
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+31
View File
@@ -0,0 +1,31 @@
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A1 CONTEXT — from linear cursor to reusable heap
rectangle "<<application>>\n01 A / B / C experiment\nrequests payload bytes" as APP
rectangle "<<public API>>\n02 pvPortMalloc / vPortFree\nheap statistics" as API
rectangle "<<allocator>>\n03 heap_4\nfirst-fit · split · coalesce" as H4
rectangle "<<arena>>\n04 ucHeap[4096]\nheaders + payload" as ARENA
rectangle "<<target>>\n05 Hazard3 / RV32I\nGDB · registers · memory" as TARGET
APP -down-> API : request / release
API -down-> H4 : direct C call
H4 -down-> ARENA : manages
ARENA -down-> TARGET : stored in RAM
note right of H4
heap_1: allocate only
heap_2: free, no coalesce
heap_3: libc wrapper
heap_4: free + coalesce
heap_5: multiple regions
end note
@enduml
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.3488px" preserveAspectRatio="none" style="width:311px;height:600px;" version="1.1" viewBox="0 0 311 600" width="311.19px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="227.6552" x="44.9803" y="9.813">A1 CONTEXT — from linear cursor to reusable heap</text><!--MD5=[cd187d11655e4367e900de538d2f1d0c]
entity APP--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="121.1713" x="15.6054" y="20.2686"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="58.7497" x="24.785" y="39.2613">«application»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="102.812" x="24.785" y="51.764">01 A / B / C experiment</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="102.812" x="24.785" y="64.2667">requests payload bytes</text><!--MD5=[645d8587175d8f7ad110cd370775931d]
entity API--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="141.3665" x="5.5078" y="144.9833"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="52.324" x="14.6874" y="163.976">«public API»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="123.0073" x="14.6874" y="176.4787">02 pvPortMalloc / vPortFree</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="65.1755" x="14.6874" y="188.9813">heap statistics</text><!--MD5=[46e692d45a0b60d87b097c4043ce42a2]
entity H4--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="122.0893" x="15.1464" y="277.6108"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="48.6521" x="24.3261" y="296.6035">«allocator»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="44.9803" x="24.3261" y="309.1062">03 heap_4</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="103.73" x="24.3261" y="321.6088">first-fit · split · coalesce</text><!--MD5=[a55d5013c595d66e4d3c908e0eed28a7]
entity ARENA--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="100.0581" x="26.162" y="410.2384"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="34.8827" x="35.3416" y="429.231">«arena»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="74.3551" x="35.3416" y="441.7337">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="81.6988" x="35.3416" y="454.2364">headers + payload</text><!--MD5=[aba7613092619c8a5fef3de1c87efe89]
entity TARGET--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="129.433" x="11.4746" y="534.953"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="36.7186" x="20.6542" y="553.9457">«target»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="84.4527" x="20.6542" y="566.4484">05 Hazard3 / RV32I</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="111.0737" x="20.6542" y="578.951">GDB · registers · memory</text><path d="M169.3645,269.698 L169.3645,301.8726 L137.6029,305.5445 L169.3645,309.2164 L169.3645,341.391 A0,0 0 0 0 169.3645,341.391 L300.6334,341.391 A0,0 0 0 0 300.6334,341.391 L300.6334,278.8776 L291.4538,269.698 L169.3645,269.698 A0,0 0 0 0 169.3645,269.698 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.9179645841402695;"/><path d="M291.4538,269.698 L291.4538,278.8776 L300.6334,278.8776 L291.4538,269.698 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="93.6324" x="174.8723" y="284.1008">heap_1: allocate only</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="111.9917" x="174.8723" y="296.6035">heap_2: free, no coalesce</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="91.7965" x="174.8723" y="309.1062">heap_3: libc wrapper</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="103.73" x="174.8723" y="321.6088">heap_4: free + coalesce</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="109.2378" x="174.8723" y="334.1115">heap_5: multiple regions</text><!--MD5=[ec942d3abfeef98a0155e2f031d4c131]
link APP to API--><path d="M76.1911,76.393 C76.1911,94.8441 76.1911,119.3262 76.1911,138.8972 " fill="none" id="APP-&gt;API" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,143.4136,79.8629,135.1519,76.1911,138.8238,72.5192,135.1519,76.1911,143.4136" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="76.1911" x="77.109" y="114.4059">request / release</text><!--MD5=[798ded9ffd9ac635cdedeacba358c97c]
link API to H4--><path d="M76.1911,201.2545 C76.1911,221.6609 76.1911,249.6129 76.1911,271.3044 " fill="none" id="API-&gt;H4" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,275.8575,79.8629,267.5958,76.1911,271.2677,72.5192,267.5958,76.1911,275.8575" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="52.324" x="77.109" y="239.1206">direct C call</text><!--MD5=[26d2234bc3ca60bb174d49bba6317b2c]
link H4 to ARENA--><path d="M76.1911,333.8821 C76.1911,354.2884 76.1911,382.2404 76.1911,403.9319 " fill="none" id="H4-&gt;ARENA" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,408.485,79.8629,400.2234,76.1911,403.8952,72.5192,400.2234,76.1911,408.485" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="40.3904" x="77.109" y="379.661">manages</text><!--MD5=[057090cc36f41caea0c560281f72f0d5]
link ARENA to TARGET--><path d="M76.1911,466.3627 C76.1911,484.8138 76.1911,509.2959 76.1911,528.8669 " fill="none" id="ARENA-&gt;TARGET" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,533.3833,79.8629,525.1216,76.1911,528.7935,72.5192,525.1216,76.1911,533.3833" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="61.5036" x="77.109" y="504.3756">stored in RAM</text><!--MD5=[5f927a6771e8d55dac04e3c75dd184e1]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A1 CONTEXT — from linear cursor to reusable heap
rectangle "<<application>>\n01 A / B / C experiment\nrequests payload bytes" as APP
rectangle "<<public API>>\n02 pvPortMalloc / vPortFree\nheap statistics" as API
rectangle "<<allocator>>\n03 heap_4\nfirst-fit · split · coalesce" as H4
rectangle "<<arena>>\n04 ucHeap[4096]\nheaders + payload" as ARENA
rectangle "<<target>>\n05 Hazard3 / RV32I\nGDB · registers · memory" as TARGET
APP -down-> API : request / release
API -down-> H4 : direct C call
H4 -down-> ARENA : manages
ARENA -down-> TARGET : stored in RAM
note right of H4
heap_1: allocate only
heap_2: free, no coalesce
heap_3: libc wrapper
heap_4: free + coalesce
heap_5: multiple regions
end note
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+48
View File
@@ -0,0 +1,48 @@
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
}
HEADER *-- ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
class "04 Address-ordered free list" as LIST {
previous < inserted < current
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
note right of LIST
Ordering makes both physical
neighbours locally visible.
end note
@enduml
+71
View File
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="620.2921px" preserveAspectRatio="none" style="width:295px;height:620px;" version="1.1" viewBox="0 0 295 620" width="295.9262px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="202.1522" x="49.1929" y="8.2167">A2 STRUCTURE — in-band metadata and address order</text><!--MD5=[9827fb78ff6e3f59cfadf959dc26af7c]
class HEADER--><rect fill="#EDF6FA" height="54.7579" id="HEADER" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="81.4758" x="29.5926" y="16.4642"/><ellipse cx="39.5849" cy="27.2252" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.5698,29.7593 Q40.3055,29.8914 40.0173,29.9515 Q39.7291,30.0235 39.4048,30.0235 Q38.2758,30.0235 37.6753,29.2789 Q37.0869,28.5343 37.0869,27.1171 Q37.0869,25.6999 37.6753,24.9553 Q38.2758,24.2107 39.4048,24.2107 Q39.7291,24.2107 40.0173,24.2828 Q40.3175,24.3428 40.5698,24.4749 L40.5698,25.7119 Q40.2815,25.4477 40.0053,25.3276 Q39.7411,25.2075 39.4648,25.2075 Q38.8523,25.2075 38.5401,25.6879 Q38.2278,26.1683 38.2278,27.1171 Q38.2278,28.0659 38.5401,28.5463 Q38.8523,29.0267 39.4648,29.0267 Q39.7411,29.0267 40.0053,28.9066 Q40.2815,28.7865 40.5698,28.5223 L40.5698,29.7593 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="48.8086" y="30.2075">01 Block header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="37.9862" y2="37.9862"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="34.2045" y="49.2775">next : BlockLink_t*</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="42.2752" x="34.2045" y="59.7463">size : size_t</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="65.073" y2="65.073"/><!--MD5=[40d637119be40bcfdc4ce848efbdda9e]
class ALLOC--><rect fill="#EDF6FA" height="65.2267" id="ALLOC" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="128.8701"/><ellipse cx="39.6618" cy="139.631" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.6466,142.1652 Q40.3824,142.2973 40.0942,142.3573 Q39.8059,142.4294 39.4816,142.4294 Q38.3527,142.4294 37.7522,141.6848 Q37.1637,140.9401 37.1637,139.523 Q37.1637,138.1058 37.7522,137.3612 Q38.3527,136.6165 39.4816,136.6165 Q39.8059,136.6165 40.0942,136.6886 Q40.3944,136.7486 40.6466,136.8808 L40.6466,138.1178 Q40.3584,137.8536 40.0821,137.7335 Q39.8179,137.6134 39.5417,137.6134 Q38.9292,137.6134 38.6169,138.0938 Q38.3047,138.5742 38.3047,139.523 Q38.3047,140.4717 38.6169,140.9521 Q38.9292,141.4325 39.5417,141.4325 Q39.8179,141.4325 40.0821,141.3124 Q40.3584,141.1923 40.6466,140.9281 L40.6466,142.1652 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="56.1107" x="52.5749" y="142.6134">Allocated block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="150.392" y2="150.392"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="161.6833">02 header + 13 byte request</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="88.3935" x="17.6787" y="172.1522">aligned total = 32 bytes</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="104.535" x="17.6787" y="182.621">payload begins after header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="187.9477" y2="187.9477"/><!--MD5=[71c2adef9be32489055f250a531e7c6f]
class REM--><rect fill="#EDF6FA" height="54.7579" id="REM" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="89.9308" x="25.3651" y="251.7448"/><ellipse cx="35.3574" cy="262.5058" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M36.3422,265.0399 Q36.078,265.172 35.7898,265.232 Q35.5015,265.3041 35.1773,265.3041 Q34.0483,265.3041 33.4478,264.5595 Q32.8593,263.8148 32.8593,262.3977 Q32.8593,260.9805 33.4478,260.2359 Q34.0483,259.4913 35.1773,259.4913 Q35.5015,259.4913 35.7898,259.5633 Q36.09,259.6234 36.3422,259.7555 L36.3422,260.9925 Q36.054,260.7283 35.7778,260.6082 Q35.5135,260.4881 35.2373,260.4881 Q34.6248,260.4881 34.3125,260.9685 Q34.0003,261.4489 34.0003,262.3977 Q34.0003,263.3465 34.3125,263.8269 Q34.6248,264.3073 35.2373,264.3073 Q35.5135,264.3073 35.7778,264.1872 Q36.054,264.0671 36.3422,263.8028 L36.3422,265.0399 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="44.5811" y="265.4881">03 Free remainder</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="273.2667" y2="273.2667"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="43.8125" x="29.9769" y="284.558">own header</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="29.9769" y="295.0269">size = 224 bytes</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="300.3535" y2="300.3535"/><!--MD5=[b0a0edd67d9eafaaa5639bbe6382adce]
class LIST--><rect fill="#EDF6FA" height="44.289" id="LIST" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="124.5196" x="8.0707" y="364.1506"/><ellipse cx="18.063" cy="374.9116" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M19.0478,377.4457 Q18.7836,377.5778 18.4954,377.6379 Q18.2071,377.7099 17.8829,377.7099 Q16.7539,377.7099 16.1534,376.9653 Q15.565,376.2207 15.565,374.8035 Q15.565,373.3863 16.1534,372.6417 Q16.7539,371.8971 17.8829,371.8971 Q18.2071,371.8971 18.4954,371.9692 Q18.7956,372.0292 19.0478,372.1613 L19.0478,373.3983 Q18.7596,373.1341 18.4834,373.014 Q18.2192,372.8939 17.9429,372.8939 Q17.3304,372.8939 17.0182,373.3743 Q16.7059,373.8547 16.7059,374.8035 Q16.7059,375.7523 17.0182,376.2327 Q17.3304,376.7131 17.9429,376.7131 Q18.2192,376.7131 18.4834,376.593 Q18.7596,376.4729 19.0478,376.2087 L19.0478,377.4457 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="102.9977" x="27.2867" y="377.8939">04 Address-ordered free list</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="385.6726" y2="385.6726"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="107.6095" x="12.6826" y="396.9639">previous &lt; inserted &lt; current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="402.2905" y2="402.2905"/><!--MD5=[490fcd32b6546c9bc615869efabd094a]
class RIGHT--><rect fill="#EDF6FA" height="44.289" id="RIGHT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="466.0876"/><ellipse cx="33.0899" cy="476.8486" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M34.0748,479.3827 Q33.8105,479.5148 33.5223,479.5748 Q33.2341,479.6469 32.9098,479.6469 Q31.7808,479.6469 31.1803,478.9023 Q30.5919,478.1577 30.5919,476.7405 Q30.5919,475.3233 31.1803,474.5787 Q31.7808,473.8341 32.9098,473.8341 Q33.2341,473.8341 33.5223,473.9061 Q33.8225,473.9662 34.0748,474.0983 L34.0748,475.3353 Q33.7865,475.0711 33.5103,474.951 Q33.2461,474.8309 32.9698,474.8309 Q32.3573,474.8309 32.0451,475.3113 Q31.7328,475.7917 31.7328,476.7405 Q31.7328,477.6893 32.0451,478.1697 Q32.3573,478.6501 32.9698,478.6501 Q33.2461,478.6501 33.5103,478.53 Q33.7865,478.4099 34.0748,478.1457 L34.0748,479.3827 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="44.5427" y="479.8309">05 Right neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="487.6095" y2="487.6095"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="498.9008">block + block.size == current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="504.2275" y2="504.2275"/><!--MD5=[007d3a1820cefd008c8dbdad7e6fdec6]
class LEFT--><rect fill="#EDF6FA" height="44.289" id="LEFT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="131.4374" x="4.6118" y="568.0246"/><ellipse cx="34.7809" cy="578.7855" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M35.7658,581.3197 Q35.5015,581.4518 35.2133,581.5118 Q34.9251,581.5839 34.6008,581.5839 Q33.4718,581.5839 32.8713,580.8393 Q32.2829,580.0946 32.2829,578.6775 Q32.2829,577.2603 32.8713,576.5157 Q33.4718,575.771 34.6008,575.771 Q34.9251,575.771 35.2133,575.8431 Q35.5135,575.9032 35.7658,576.0353 L35.7658,577.2723 Q35.4775,577.0081 35.2013,576.888 Q34.9371,576.7679 34.6608,576.7679 Q34.0483,576.7679 33.7361,577.2483 Q33.4238,577.7287 33.4238,578.6775 Q33.4238,579.6262 33.7361,580.1066 Q34.0483,580.587 34.6608,580.587 Q34.9371,580.587 35.2013,580.4669 Q35.4775,580.3468 35.7658,580.0826 L35.7658,581.3197 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="48.2321" y="581.7679">06 Left neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="589.5465" y2="589.5465"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="122.2137" x="9.2237" y="600.8378">previous + previous.size == block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="606.1645" y2="606.1645"/><path d="M159.877,371.9831 L159.877,383.2206 L132.7671,386.2952 L159.877,389.3697 L159.877,400.6072 A0,0 0 0 0 159.877,400.6072 L286.7025,400.6072 A0,0 0 0 0 286.7025,400.6072 L286.7025,379.6695 L279.0161,371.9831 L159.877,371.9831 A0,0 0 0 0 159.877,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><path d="M279.0161,371.9831 L279.0161,379.6695 L286.7025,379.6695 L279.0161,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="110.6841" x="164.4889" y="384.043">Ordering makes both physical</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="96.0799" x="164.4889" y="394.5119">neighbours locally visible.</text><!--MD5=[fc2657b7de304bb41a5d36ac60748945]
reverse link HEADER to ALLOC--><path d="M70.3305,82.6749 C70.3305,97.5173 70.3305,114.3505 70.3305,128.5626 " fill="none" id="HEADER&lt;-ALLOC" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,72.7056,67.256,77.3174,70.3305,81.9293,73.4051,77.3174,70.3305,72.7056" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="71.0992" y="103.2667">precedes payload</text><!--MD5=[bb73b5a7e21afff1a1d0c43dcbd5d11a]
link ALLOC to REM--><path d="M70.3305,194.2813 C70.3305,210.5842 70.3305,230.3382 70.3305,246.6026 " fill="none" id="ALLOC-&gt;REM" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,250.3689,73.4051,243.4512,70.3305,246.5257,67.256,243.4512,70.3305,250.3689" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="71.0992" y="226.1414">split preserves 256</text><!--MD5=[32aec76f28e14f88b0d74d9f592c80fb]
link REM to LIST--><path d="M70.3305,306.8178 C70.3305,322.8901 70.3305,343.1975 70.3305,359.1622 " fill="none" id="REM-&gt;LIST" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,362.8055,73.4051,355.8878,70.3305,358.9623,67.256,355.8878,70.3305,362.8055" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="63.7971" x="71.0992" y="338.5473">insert by address</text><!--MD5=[6bd3103bbaa36e7d502940b82c286473]
link LIST to RIGHT--><path d="M70.3305,408.6011 C70.3305,423.9508 70.3305,444.681 70.3305,461.0377 " fill="none" id="LIST-&gt;RIGHT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,464.7963,73.4051,457.8786,70.3305,460.9531,67.256,457.8786,70.3305,464.7963" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="30.7456" x="71.0992" y="440.4842">join first</text><!--MD5=[f41c07ebada6943a8deaf240fd528885]
link RIGHT to LEFT--><path d="M70.3305,510.538 C70.3305,525.8878 70.3305,546.618 70.3305,562.9746 " fill="none" id="RIGHT-&gt;LEFT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,566.7333,73.4051,559.8155,70.3305,562.8901,67.256,559.8155,70.3305,566.7333" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="47.6557" x="71.0992" y="542.4212">then join left</text><!--MD5=[83344144544ae5f259c61315a4ceaf0d]
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
}
HEADER *- - ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
class "04 Address-ordered free list" as LIST {
previous < inserted < current
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
note right of LIST
Ordering makes both physical
neighbours locally visible.
end note
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+29
View File
@@ -0,0 +1,29 @@
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S7 -left-> S8 : oversized request
@enduml
+56
View File
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="263.7004px" preserveAspectRatio="none" style="width:811px;height:263px;" version="1.1" viewBox="0 0 811 263" width="811.5712px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="231.1894" x="294.4053" y="11.5848">A5 FLOW — allocate, fragment, coalesce, verify</text><!--MD5=[d0cae5ff9305becd6f502d4fe4f41481]
entity S1--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="108.37" x="7.2247" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="45.7562" x="19.2658" y="55.942">01 RESET</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="19.2658" y="70.7021">initial free = 4080</text><!--MD5=[d3395af3100fe8cebf35265100c4415f]
entity S2--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="104.7577" x="224.5668" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="236.6079" y="48.5608">02 ALLOC A</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="80.6755" x="236.6079" y="63.3209">24 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="63.8179" x="236.6079" y="78.081">first-fit + split</text><!--MD5=[6c7192638421eaf134d201765ac5db29]
entity S3--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="127.6358" x="450.3377" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="74.6549" x="462.3789" y="48.5608">03 ALLOC B / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="103.5536" x="462.3789" y="63.3209">40 + 16 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="462.3789" y="78.081">after = 3952</text><!--MD5=[01b905ebe31ca24275b86a9951c478d0]
entity S4--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="671.2922" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="683.3333" y="55.942">04 FREE A / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="683.3333" y="70.7021">B remains allocated</text><!--MD5=[099bd2cf1f4f3a6dbf2f1fde6174f38e]
entity S5--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="132.4523" x="665.8737" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="108.37" x="677.9148" y="206.0345">05 E01 FRAGMENTED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="62.6138" x="677.9148" y="220.7946">2 free blocks</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="677.9148" y="235.5547">current &gt; largest</text><!--MD5=[0656c7721b015b9ca8cf2e2c2e8f5aee]
entity S6--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="111.9824" x="465.3891" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="477.4302" y="206.0345">06 FREE B</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="87.9001" x="477.4302" y="220.7946">insert by address</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="72.2467" x="477.4302" y="235.5547">join right + left</text><!--MD5=[6ba532df225878998c5769132c3837e2]
entity S7--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="258.2819" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="270.3231" y="206.0345">07 E02 COALESCED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="57.7974" x="270.3231" y="220.7946">1 free block</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="270.3231" y="235.5547">final = initial</text><!--MD5=[ce611cd767df6ac8a45071985dabb378]
entity S8--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="115.5947" x="8.4288" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="79.4714" x="20.4699" y="206.0345">08 OOM CHECK</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="73.4508" x="20.4699" y="220.7946">NULL · hook=1</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="91.5125" x="20.4699" y="235.5547">asserts=0 · PASS=1</text><!--MD5=[15cb110786dd224ca6a510a3d2a24e20]
link S1 to S2--><path d="M115.7994,59.1196 C146.5043,59.1196 184.9515,59.1196 216.5956,59.1196 " fill="none" id="S1-&gt;S2" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="222.2429,59.1196,211.4059,54.3031,216.2223,59.1196,211.4059,63.936,222.2429,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="137.5698" y="51.4386">pvPortMalloc</text><!--MD5=[8eac89d31ced3c9003fbd6a8a005c745]
link S2 to S3--><path d="M329.5894,59.1196 C362.7266,59.1196 405.9181,59.1196 442.1979,59.1196 " fill="none" id="S2-&gt;S3" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="448.0018,59.1196,437.1648,54.3031,441.9812,59.1196,437.1648,63.936,448.0018,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="77.0631" x="351.2996" y="51.4386">split remainder</text><!--MD5=[82e284a09e4ebade00512bdc77bff32c]
link S3 to S4--><path d="M578.3709,59.1196 C605.1142,59.1196 636.2044,59.1196 663.4053,59.1196 " fill="none" id="S3-&gt;S4" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="669.1369,59.1196,658.2999,54.3031,663.1163,59.1196,658.2999,63.936,669.1369,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="599.9486" y="51.4386">vPortFree</text><!--MD5=[0e6b031b378ab8978eaa734a548bdfb6]
link S4 to S5--><path d="M732.0999,86.2723 C732.0999,110.3906 732.0999,146.6826 732.0999,174.6541 " fill="none" id="S4-&gt;S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="732.0999,180.494,736.9163,169.657,732.0999,174.4735,727.2834,169.657,732.0999,180.494" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="51.7768" x="733.304" y="142.2166">heap stats</text><!--MD5=[3c9aaad44b43c509ca535c241fdd0151]
reverse link S6 to S5--><path d="M585.5595,216.5812 C610.8338,216.5812 639.8529,216.5812 665.368,216.5812 " fill="none" id="S6&lt;-S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="579.6714,216.5812,590.5084,221.3977,585.6919,216.5812,590.5084,211.7648,579.6714,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="44.5521" x="599.3465" y="208.9003">continue</text><!--MD5=[5f6ea4567bb0950bff1d27387d49b4c2]
reverse link S7 to S6--><path d="M388.0009,216.5812 C413.0223,216.5812 440.9938,216.5812 464.8352,216.5812 " fill="none" id="S7&lt;-S6" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="382.1489,216.5812,392.9996,221.3667,388.1694,216.564,392.9721,211.7339,382.1489,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="40.9398" x="402.1733" y="208.9003">coalesce</text><!--MD5=[630b9631f886cf9c8b0d992525b86cf3]
reverse link S8 to S7--><path d="M132.1994,216.5812 C171.0802,216.5812 219.9551,216.5812 257.9689,216.5812 " fill="none" id="S8&lt;-S7" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="126.3836,216.5812,137.2206,221.3977,132.4041,216.5812,137.2206,211.7648,126.3836,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="90.3084" x="145.9985" y="208.9003">oversized request</text><!--MD5=[2e2dc33d46c2ffc454d35cea5ea70934]
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S7 -left-> S8 : oversized request
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

+29
View File
@@ -0,0 +1,29 @@
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
[*] --> Free : 01 one list node
Free --> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated --> Fragmented : free A and C
Fragmented : 03 two free blocks
Fragmented : sum free > largest block
Fragmented --> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced --> OOMChecked : request > arena
OOMChecked : NULL + hook once
OOMChecked --> [*]
state "05 minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.2823px" preserveAspectRatio="none" style="width:346px;height:600px;" version="1.1" viewBox="0 0 346 600" width="346.9454px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="154.5281" x="99.1803" y="7.9418">A6 STATE — block state and heap statistics</text><ellipse cx="212.8476" cy="23.6993" fill="#000000" rx="7.4292" ry="7.4292" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="37.1462" x="194.2745" y="86.8478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="194.2745" x2="231.4207" y1="104.3956" y2="104.3956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="15.6014" x="205.0469" y="98.5042">Free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="48.29" x="188.7026" y="190.1142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="188.7026" x2="236.9926" y1="207.662" y2="207.662"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="33.4316" x="196.1318" y="201.7706">Allocated</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="101.0376" x="111.0671" y="282.9796"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="111.0671" x2="212.1047" y1="300.5275" y2="300.5275"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="140.0411" y="294.6361">Fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="65.3773" x="114.7817" y="312.1839">03 two free blocks</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="86.1791" x="114.7817" y="322.3025">sum free &gt; largest block</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="103.2664" x="4.4575" y="394.3142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="4.4575" x2="107.7239" y1="411.862" y2="411.862"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="36.4033" x="37.8891" y="405.9706">Coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="61.6627" x="8.1722" y="423.5185">04 one free block</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="88.4079" x="8.1722" y="433.6371">current free = initial free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="78.7499" x="16.7158" y="495.2478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="16.7158" x2="95.4657" y1="512.7956" y2="512.7956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="48.29" x="31.9457" y="506.9042">OOMChecked</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="63.8914" x="20.4304" y="524.4521">NULL + hook once</text><ellipse cx="56.0907" cy="585.1415" fill="none" rx="7.4292" ry="7.4292" style="stroke: #000000; stroke-width: 0.742923663722561;"/><ellipse cx="56.4622" cy="585.513" fill="#000000" rx="4.4575" ry="4.4575" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="77.2641" x="190.5599" y="398.3482"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="190.5599" x2="267.824" y1="415.8961" y2="415.8961"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="62.4056" x="197.9892" y="410.0047">05 minimum-ever</text><!--MD5=[f16808fa220dde377303612249059854]
link *start to Free--><path d="M212.8476,31.2845 C212.8476,42.3689 212.8476,64.7384 212.8476,81.885 " fill="none" id="*start-&gt;Free" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,85.4436,215.8193,78.7573,212.8476,81.729,209.8759,78.7573,212.8476,85.4436" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.948" x="213.5906" y="62.101">01 one list node</text><!--MD5=[19abaf48dc778410378e95e0d1bca006]
link Free to Allocated--><path d="M212.8476,124.358 C212.8476,141.3635 212.8476,166.8235 212.8476,185.1663 " fill="none" id="Free-&gt;Allocated" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,188.7843,215.8193,182.098,212.8476,185.0697,209.8759,182.098,212.8476,188.7843" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="59.4339" x="224.3629" y="154.9664">02 first-fit + split</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="80.9787" x="213.5906" y="165.085">current free decreases</text><!--MD5=[f6fa3e1917b73de38ea03346a6903b17]
link Allocated to Fragmented--><path d="M203.0856,227.6021 C195.3518,241.9925 184.4382,262.304 175.746,278.4849 " fill="none" id="Allocated-&gt;Fragmented" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="174.0076,281.7241,179.7784,277.2257,175.7573,278.4473,174.5357,274.4262,174.0076,281.7241" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="191.028" y="258.2328">free A and C</text><!--MD5=[c73bca393b062d6a86dff80fa900c78c]
link Fragmented to Coalesced--><path d="M110.7031,318.744 C93.6455,325.4006 76.1571,335.4523 65.0058,350.4817 C56.8188,361.5141 54.33,376.536 54.0031,389.4331 " fill="none" id="Fragmented-&gt;Coalesced" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="53.9808,392.9546,56.9907,386.2854,54.0021,389.24,51.0474,386.2514,53.9808,392.9546" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="21.5448" x="110.6956" y="359.1664">free B</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="111.4385" x="65.7487" y="369.285">address-order joins neighbours</text><!--MD5=[2b306524d92469efb3bb270d490680cf]
link Coalesced to OOMChecked--><path d="M56.0907,439.7959 C56.0907,454.8922 56.0907,474.8471 56.0907,490.1216 " fill="none" id="Coalesced-&gt;OOMChecked" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,493.7842,59.0624,487.0979,56.0907,490.0696,53.119,487.0979,56.0907,493.7842" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.2051" x="56.8337" y="470.501">request &gt; arena</text><!--MD5=[6b8be85e17f6174335a5329fe1414850]
link OOMChecked to *end--><path d="M56.0907,532.55 C56.0907,545.306 56.0907,562.0366 56.0907,573.0022 " fill="none" id="OOMChecked-&gt;*end" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,576.4716,59.0624,569.7853,56.0907,572.757,53.119,569.7853,56.0907,576.4716" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><!--MD5=[b09143a670c8c67aa163b99fca5c6b6b]
link Allocated to MIN--><path d="M228.8056,227.6169 C233.6049,234.1101 238.3299,241.7622 241.0787,249.548 C259.2432,300.9509 258.5449,318.5879 247.765,372.0264 C246.2941,379.3145 243.5824,386.8998 240.685,393.6827 " fill="none" id="Allocated-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="239.214,396.9813,244.6551,392.0892,240.7295,393.5899,239.2288,389.6643,239.214,396.9813" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="82.4645" x="256.1378" y="308.6996">records low watermark</text><!--MD5=[1fa23b8554d20d5dd3f2f8930c0e2df3]
link Fragmented to MIN--><path d="M172.2766,328.3871 C178.8143,341.366 187.6105,357.9332 196.5033,372.0264 C201.2283,379.5151 206.8225,387.3752 212.0378,394.3513 " fill="none" id="Fragmented-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="214.2072,397.2338,212.5727,390.1018,211.9784,394.2621,207.818,393.6678,214.2072,397.2338" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="46.8042" x="197.2462" y="364.3669">does not rise</text><!--MD5=[87522a40b34d64237ec6603d41372cd8]
link Coalesced to MIN--><path d="M108.0285,416.9213 C132.7679,416.9213 162.0242,416.9213 185.5972,416.9213 " fill="none" id="Coalesced-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="189.1038,416.9213,182.4175,413.9496,185.3892,416.9213,182.4175,419.893,189.1038,416.9213" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="55.7193" x="121.2823" y="412.2335">history remains</text><!--MD5=[994b73c618d067de5faae1a7c19b4f86]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
[*] - -> Free : 01 one list node
Free - -> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated - -> Fragmented : free A and C
Fragmented : 03 two free blocks
Fragmented : sum free > largest block
Fragmented - -> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced - -> OOMChecked : request > arena
OOMChecked : NULL + hook once
OOMChecked - -> [*]
state "05 minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+23
View File
@@ -0,0 +1,23 @@
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC --> ELF : compile + link
ELF --> E1 : reset / load / replay
E1 --> MEM : inspect bytes
MEM --> E2 : continue
@enduml
+44
View File
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="82.7447px" preserveAspectRatio="none" style="width:814px;height:82px;" version="1.1" viewBox="0 0 814 82" width="814.2079px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="190.3128" x="314.8436" y="7.9609">A7 RUNTIME — one artifact, two checkpoints, one proof</text><!--MD5=[183d75e42a7a852d02a7f9ce2cc3343f]
entity SRC--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="78.6075" x="4.9647" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="31.443" x="13.2392" y="38.0453">«source»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="38.89" x="13.2392" y="48.1882">01 task03 C</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="62.0585" x="13.2392" y="58.3311">A/B/C experiment</text><!--MD5=[4a7b087cd571ae358eb895b9dc7ce0ed]
entity ELF--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="71.9879" x="181.2109" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="32.2704" x="189.4854" y="38.0453">«artifact»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="51.3017" x="189.4854" y="48.1882">02 ELF + image</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="55.439" x="189.4854" y="58.3311">heap_4 symbols</text><!--MD5=[45565a74ca8123df0b8413ce5340d40a]
entity E1--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="86.0545" x="370.6963" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="378.9707" y="38.0453">«checkpoint E01»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="52.1292" x="378.9707" y="48.1882">03 fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="69.5055" x="378.9707" y="58.3311">blocks=2 · aligned=1</text><!--MD5=[5ceda9279414f57783e95166b8d927b7]
entity MEM--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="81.0898" x="553.5621" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="37.2351" x="561.8365" y="38.0453">«memory»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="58.7487" x="561.8365" y="48.1882">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="64.5409" x="561.8365" y="58.3311">headers + payload</text><!--MD5=[a3c437a7ee715155cf6a0fec80d7cbaf]
entity E2--><rect fill="#EDF6FA" height="57.1206" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="88.5368" x="716.5691" y="16.7377"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="724.8436" y="32.9731">«checkpoint E02»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="43.0272" x="724.8436" y="43.116">05 coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="71.9879" x="724.8436" y="53.2589">final=initial · blocks=1</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="57.0938" x="724.8436" y="63.4018">OOM=1 · PASS=1</text><!--MD5=[2e73c4d4efa4a7715d66b06010e70f85]
link SRC to ELF--><path d="M83.961,45.2929 C111.3744,45.2929 148.0054,45.2929 175.7911,45.2929 " fill="none" id="SRC-&gt;ELF" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="179.6222,45.2929,172.1752,41.9831,175.485,45.2929,172.1752,48.6027,179.6222,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="46.337" x="109.223" y="42.497">compile + link</text><!--MD5=[98439561a91d683361f6e8599ebb304f]
link ELF to E1--><path d="M253.5463,45.2929 C284.8735,45.2929 330.7719,45.2929 365.2765,45.2929 " fill="none" id="ELF-&gt;E1" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="369.2482,45.2929,361.8012,41.9831,365.111,45.2929,361.8012,48.6027,369.2482,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="66.1958" x="278.8496" y="42.497">reset / load / replay</text><!--MD5=[14b84038a04448f34eb55bd119f2d935]
link E1 to MEM--><path d="M457.1314,45.2929 C484.5447,45.2929 520.1332,45.2929 548.0513,45.2929 " fill="none" id="E1-&gt;MEM" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="551.9154,45.2929,544.4684,41.9831,547.7782,45.2929,544.4684,48.6027,551.9154,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="45.5096" x="482.4016" y="42.497">inspect bytes</text><!--MD5=[28f0a5a321106494a7afb95cbc1e35b0]
link MEM to E2--><path d="M634.8918,45.2929 C657.8783,45.2929 686.93,45.2929 711.2486,45.2929 " fill="none" id="MEM-&gt;E2" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="715.1128,45.2929,707.6658,41.9831,710.9756,45.2929,707.6658,48.6027,715.1128,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="30.6155" x="660.3027" y="42.497">continue</text><!--MD5=[bc1681809f0cb7bb82cdf81f0385b8f2]
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC - -> ELF : compile + link
ELF - -> E1 : reset / load / replay
E1 - -> MEM : inspect bytes
MEM - -> E2 : continue
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

+178
View File
@@ -0,0 +1,178 @@
# FC01 — FreeRTOS `heap_4`: od kursora do wolnych bloków
## Decyzja dydaktyczna
To jest jedna 30-minutowa lekcja i bezpośrednia kontynuacja projektu
K&R 5.4 z karty C07. Karta nie uczy pięciu implementacji heap jako pięciu
równorzędnych tematów. `heap_1`, `heap_2`, `heap_3` i `heap_5` zajmują łącznie
maksymalnie minutę kontekstu. Cała właściwa praca dotyczy `heap_4`.
Task 1 i Task 2 są krótkimi modelami prowadzonymi przez nauczyciela. Uczeń
najpierw zapisuje predykcję, ale nie buduje i nie debugguje tych programów
osobno podczas lekcji. Task 3, linkujący upstream `heap_4.c`, jest jedynym
centralnym przebiegiem ucznia.
## Stan wejściowy z K&R 5.4
Uczeń przychodzi z działającym kodem:
```text
allocbuf[64]
allocp
allocator_reset()
alloc_local(5) -> offset 0
alloc_local(7) -> offset 5
allocp -> offset 12
alloc_local(0) oraz OOM -> NULL bez przesunięcia kursora
```
Nie powtarzamy sposobu działania tego kodu. Zaczynamy od jego granicy:
> Jak zwolnić obszar 5 B spod offsetu 0, zachować późniejszy obszar 7 B spod
> offsetu 5 i ponownie wykorzystać powstałą dziurę?
W projekcie nie istnieje operacja zwolnienia pojedynczego obszaru. Nawet proste
cofnięcie kursora unieważniłoby wszystkie późniejsze przydziały. Brakuje
tożsamości bloku, jego rozmiaru, zbioru dziur i mechanizmu ich łączenia.
## Cel w jednym zdaniu
Po 30 minutach uczeń potrafi wyjaśnić i pokazać w debuggerze, jak `heap_4`
dodaje do liniowej areny nagłówki, wybór first-fit, podział bloku, listę wolnych
bloków oraz scalanie sąsiadów, a następnie odróżnić bieżącą ilość wolnej
pamięci, największy wolny blok i minimum-ever.
## Most K&R 5.4 -> `heap_4`
| K&R 5.4 — stan projektu | Ograniczenie | `heap_4` — nowy mechanizm |
| --- | --- | --- |
| `allocbuf[64]` i jeden `allocp` | istnieje tylko wolny ogon areny | `ucHeap[]` i bloki opisane nagłówkami |
| wynik to surowy adres | allocator nie zna później rozmiaru obszaru | `BlockLink_t` przed payloadem przechowuje rozmiar |
| kolejne przydziały tylko przesuwają kursor | nie można użyć dziury | lista wolnych bloków i wybór first-fit |
| brak zwalniania pojedynczego obszaru | reset odzyskuje wszystko naraz | `vPortFree()` odzyskuje wskazany blok |
| brak relacji między dziurami | sąsiednie dziury pozostają rozdzielone | porządek adresowy i coalescing w obie strony |
| tylko sukces albo `NULL` | brak informacji o fragmentacji | free, largest, liczba bloków i minimum-ever |
W realnym `heap_4.c` najwyższy bit `xBlockSize` oznacza blok przydzielony.
Uproszczone modele Task 12 pokazują geometrię i listę, ale nie odtwarzają tego
bitu. To jawna granica modelu.
## Przygotowanie przed lekcją
Budowanie, flashowanie i wykrywanie debug probe nie wchodzą do budżetu 30 minut.
Przed wejściem uczniów:
1. zbuduj Task 3 dla `pico2_w` / RP2350 RISC-V;
2. wgraj zweryfikowany obraz i otwórz sesję na tym samym ELF;
3. ustaw pierwszy breakpoint na `heap4_fragmented_checkpoint`;
4. przygotuj widok `ucHeap`, `g_fragmented_stats`, `g_final_stats`,
`xFreeBytesRemaining` i `xMinimumEverFreeBytesRemaining`;
5. przygotuj Hazard3 jako awaryjny zamiennik — podczas lekcji użyj jednej
platformy, nigdy obu.
`heap_4` jest implementacją wybraną i linkowaną przez projekt. Nie jest
sprzętowym heapem ani peryferium RP2350.
## Przebieg 30 minut
| Czas | Tryb | Działanie i dowód |
| --- | --- | --- |
| 03 min | problem | Przypomnij wyłącznie offsety `0 -> 5 -> 12`. Uczeń próbuje zwolnić pierwszy obszar bez utraty drugiego i nazywa brakującą operację. |
| 34 min | kontekst | Jedno zdanie: FreeRTOS dostarcza wymienne implementacje tego samego API; ta karta i oficjalne przykłady Pico 2 W linkują `heap_4`. |
| 49 min | Task 1 — demo | Do żądania dodaj nagłówek, wyrównaj rozmiar, wybierz pierwszy pasujący blok i podziel go. Uczeń zapisuje `wanted` i `remainder` przed odsłonięciem wyniku. |
| 916 min | Task 2 — demo | Dla `A:48 | B:48 | C:48` pokaż listę `A -> C`, wstaw `B` po adresie i sprawdź scalenie w prawo oraz w lewo: `2 bloki / 96 B / largest 48 B -> 1 blok / 144 B / largest 144 B`. |
| 1627 min | Task 3 — RUN | Na przygotowanym Pico 2 W przejdź przez prawdziwy `heap_4.c`: trzy alokacje, free A i C, checkpoint z dwoma blokami, free B, checkpoint z jednym blokiem, OOM=`NULL` i jeden malloc-failed hook. Uczeń wypełnia tabelę relacji. |
| 2730 min | wyjście | Uczeń wymienia trzy dodatki ponad K&R (`header`, `free list`, `coalescing`) i wyjaśnia: suma wolnych bajtów może być większa od największego bloku, a minimum-ever nie rośnie po `free`. |
## Task 1 — model nagłówka i splitu
Task 1 nie jest osobnym laboratorium. Na RV32 nagłówek modelu ma 8 B, więc
żądanie 13 B daje `wanted=24 B` i `remainder=232 B` z areny 256 B. Na AMD64
odpowiednie wartości to 16 B, 32 B i 224 B. Różnica ABI jest tylko pomocą w
zrozumieniu `sizeof` i wyrównania; podczas głównego przebiegu obowiązuje RP2350.
Predykcja ucznia:
```text
free list: [16 B] -> [80 B] -> [160 B]
request + header po wyrównaniu: 24 B
first-fit wybiera: __________
po split: allocated ______ B, remainder ______ B
```
Wykonywalny Task 1 dowodzi obecnie geometrii splitu jednego bloku. Samo
przeszukanie dwóch kandydatów jest elementem demonstracji i realnego
`pvPortMalloc()`, dlatego nie opisujemy Task 1 jako pełnego testu first-fit.
## Task 2 — model listy adresowej i coalescingu
```text
pamięć: [ A:48 FREE ][ B:48 USED ][ C:48 FREE ]
free list: A --------------------------------> C
vPortFree(B)
1. wstaw B pomiędzy A i C według adresu;
2. jeśli end(B) == addr(C), połącz B+C;
3. jeśli end(A) == addr(BC), połącz A+BC;
wynik: [ ABC:144 FREE ]
free list: A -> END
```
Uczeń przed odsłonięciem rysuje listę i wpisuje `2 -> 1`, `96 -> 144` oraz
`48 -> 144` odpowiednio dla liczby bloków, sumy i largest.
## Task 3 — centralny przebieg upstream `heap_4.c`
```text
RESET/INIT
-> ALLOC A(24)
-> ALLOC B(40)
-> ALLOC C(16)
-> FREE A
-> FREE C
-> heap4_fragmented_checkpoint # 2 free blocks
-> FREE B
-> OOM request
-> task03_debug_checkpoint # 1 free block, pass=1
```
Uczeń zapisuje tylko relacje, ponieważ dokładne bajty zależą od ABI i
konfiguracji:
| Obserwacja | Oczekiwany związek |
| --- | --- |
| po trzech alokacjach | `after_allocations < initial_free` |
| stan pofragmentowany | `free_blocks == 2`, `largest < total_free` |
| po `free(B)` | `final_free == initial_free`, `free_blocks == 1` |
| low-water mark | `minimum_ever <= after_allocations` i nie rośnie po free |
| OOM | wynik `NULL`, hook `1`, brak uszkodzenia listy |
Minimalny dowód w GDB:
```gdb
p g_fragmented_stats
p g_final_stats
p xFreeBytesRemaining
p xMinimumEverFreeBytesRemaining
p xStart
p pxEnd
x/96bx ucHeap
```
## Kryterium zaliczenia
Uczeń zalicza lekcję, jeżeli:
- wskaże, dlaczego jeden kursor nie wystarcza do zwolnienia obszaru ze środka;
- rozróżni nagłówek allocatora od payloadu i stosu `sp`;
- przewidzi przejście wolnej listy `2 -> 1` po zwolnieniu B;
- wyjaśni różnicę `total free` kontra `largest free block`;
- wyjaśni, dlaczego minimum-ever nie wraca po `free`;
- pokaże `aligned=1 oom=1 hooks=1 asserts=0 pass=1` w Task 3.
## Poza lekcją
Jako rozszerzenie lub pracę własną pozostają: pełne czytanie `heap_4.c`,
uruchomienie Task 12 na AMD64 i Hazard3, samodzielny deploy RP2350 oraz
porównanie z `heap_1`, `heap_2`, `heap_3` i `heap_5`.
+312
View File
@@ -0,0 +1,312 @@
% Generated from json/card_source.json by tools/render_card.py.
% Do not edit manually; update the JSON and regenerate.
\documentclass[12pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage{csquotes}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry}
\usepackage{eso-pic}
\usepackage{marginnote}
\usepackage{array}
\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{pdflscape}
\usepackage{float}
\usepackage{silence}
\WarningFilter{soulutf8}{This package is obsolete}
\usepackage{pdfcomment}
\usepackage{enumitem}
\usepackage{needspace}
\usepackage{fancyhdr}
\usepackage{lastpage}
\usepackage{microtype}
\usepackage[most]{tcolorbox}
\usepackage{qrcode}
\IfFileExists{references.bib}{%
\usepackage[backend=biber,style=numeric,sorting=none]{biblatex}%
\addbibresource{references.bib}%
}{}
\hypersetup{hidelinks}
\IfFileExists{build-meta.tex}{%
\input{build-meta.tex}%
}{%
\newcommand{\BuildCommit}{lokalna}%
}
\newcommand{\DocumentAuthor}{M. Pabiszczak}
\newcommand{\DocumentYear}{2026}
\newcommand{\CardSeries}{freertos-c}
\newcommand{\CardNumber}{01}
\newcommand{\CardCount}{15}
\newcommand{\CardSlug}{heap4-mechanics}
\newcommand{\CardVersion}{v00.01}
\newcommand{\DocumentUUID}{87e48095-7793-54e3-9230-4e61d31bd459}
\newcommand{\EmptyCheck}{\(\square\)}
\newcommand{\EscAnswerLines}[1][3]{\par\noindent\dotfill\par\noindent\dotfill\par\noindent\dotfill}
\newcommand{\EscWriteRow}[1][2.8em]{\rule{0pt}{#1}}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0.45em}
\setlength{\headheight}{24mm}
\setlength{\headsep}{3mm}
\setlength{\footskip}{8mm}
\setlength{\marginparwidth}{1.5cm}
\setlength{\marginparsep}{0.25cm}
\renewcommand{\arraystretch}{1.22}
% Margin separator lines disabled for layout trial.
\newcommand{\ESCPageResourceHeader}{%
\begingroup%
\setlength{\parskip}{0pt}%
\setlength{\fboxsep}{0pt}%
\setlength{\fboxrule}{0.35pt}%
\setlength{\arrayrulewidth}{0.35pt}%
\noindent\fbox{%
\begin{minipage}[c][23.5mm][c]{\dimexpr\textwidth-2\fboxrule\relax}%
\begin{minipage}[c][23mm][c]{24mm}\centering%
\href{https://zsl-gitea.mpabi.pl/edu-freertos-c/lab-rv32i-freertos-heap4}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-freertos-c/lab-rv32i-freertos-heap4}}%
\end{minipage}%
\vrule width0.35pt%
\begin{minipage}[c][23mm][c]{\dimexpr\linewidth-48mm-0.7pt\relax}%
\setlength{\tabcolsep}{0pt}%
\renewcommand{\arraystretch}{0}%
\begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.15126050\linewidth-\arrayrulewidth\relax}|X@{}}%
\parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries TITLE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries heap\_4: From Linear Cursor to Reusable Blocks}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries VER.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.6}{6.8}\selectfont\ttfamily\bfseries v00.01}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries DATETIME}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 2026-07-20T00:00:00+02:00}\hspace{0.45mm}}\par} \\%
\end{tabularx}%
\par\nointerlineskip%
\hrule height0.35pt%
\nointerlineskip%
\begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.25210084\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14285714\linewidth-\arrayrulewidth\relax}|X@{}}%
\parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries PROJECT}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Freestanding C nad FreeRTOS}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SERIES}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries FreeRTOS C}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries CARD}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 01/15}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SHEET}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries \thepage/\pageref{LastPage}}\hspace{0.45mm}}\par} \\%
\end{tabularx}%
\par\nointerlineskip%
\hrule height0.35pt%
\nointerlineskip%
\begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}%
\parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 87e48095-7793-54e3-9230-4e61d31bd459}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\%
\end{tabularx}%
\par\nointerlineskip%
\hrule height0.35pt%
\nointerlineskip%
\begin{tabularx}{\linewidth}{@{}X@{}}%
\parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries GITEA} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://zsl-gitea.mpabi.pl/edu-freertos-c/lab-rv32i-freertos-heap4}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-freertos-c/lab-rv32i-freertos-heap4}}}} \\%
\end{tabularx}%
\par\nointerlineskip%
\hrule height0.35pt%
\nointerlineskip%
\begin{tabularx}{\linewidth}{@{}X@{}}%
\parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries HTML} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7}}}} \\%
\end{tabularx}%
\end{minipage}%
\vrule width0.35pt%
\begin{minipage}[c][23mm][c]{24mm}\centering%
\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7}}%
\end{minipage}%
\end{minipage}%
}%
\endgroup%
}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[C]{\ESCPageResourceHeader}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\newcommand{\ESCMarginTag}[4]{%
\hspace*{#1}\textcolor{#2}{#3~#4}%
}
\newcommand{\ESCSectionBlockStart}{%
\Needspace{8\baselineskip}%
\par\vspace{0.35em}%
\noindent\textcolor{black!28}{\rule{\textwidth}{0.35pt}}%
\par\vspace{0.15em}%
}
\newcommand{\ESCSectionBlockEnd}{%
\par\vspace{0.45em}%
}
\newcommand{\ESCTinyStepSeparator}{%
\par\vspace{0.10em}%
\noindent{\color{black!18}\leaders\hbox{\rule{0.60em}{0.22pt}\hspace{0.38em}}\hfill\kern0pt}%
\par\vspace{0.10em}%
}
\newtcolorbox{ESCTaskFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black,boxsep=0pt,left=1.4mm,right=1.4mm,top=0.8mm,bottom=0.8mm,colbacktitle=black!7,coltitle=black,title={\ttfamily\bfseries TASK\quad #1}}
\newtcolorbox{ESCBlockFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!55,boxsep=0pt,left=1.0mm,right=1.0mm,top=0.6mm,bottom=0.6mm,colbacktitle=black!4,coltitle=black,title={\ttfamily\bfseries BLOCK\quad #1}}
\newtcolorbox{ESCStepFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!28,boxsep=0pt,left=0.8mm,right=0.8mm,top=0.45mm,bottom=0.45mm,colbacktitle=black!2,coltitle=black,title={\ttfamily STEP\quad #1}}
\newtcolorbox{ESCConclusionFrame}{enhanced,breakable,arc=0pt,boxrule=0.45pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries WNIOSEK}}
\newcommand{\ESCLearningTreeWidget}{%
\reversemarginpar
\marginnote[%
\begin{minipage}{\marginparwidth}%
\raggedright
{\fontsize{3.55}{3.95}\selectfont\ttfamily
\begin{minipage}[t]{\marginparwidth}%
\raggedright
{\bfseries\textcolor{black!65}{TECH}\par}%
\vspace{0.08em}%
\hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par%
\hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz\textCR minimum-ever.}}\par%
\hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Łączy kod, diagram i zweryfikowany dowód.}}\par%
\end{minipage}%
}%
\end{minipage}%
]{}
\normalmarginpar
\marginnote{%
\begin{minipage}{\marginparwidth}%
\raggedright
{\fontsize{3.55}{3.95}\selectfont\ttfamily
\hspace*{0.06cm}%
\begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}%
\raggedright
{\bfseries\textcolor{black!65}{OG}\par}%
\vspace{0.08em}%
\hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par%
\hspace*{0.28em}\textcolor{green!50!black}{EN~LOCAL~EN~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń wyjaśnia nagłówek, wyrównanie, first-fit, split, adresową listę wolnych bloków i\textCR dwustronne coalescing.}}\par%
\hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~KW~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Łączy kod, diagram i zweryfikowany dowód.}}\par%
\end{minipage}%
}%
\end{minipage}%
}
}
\begin{document}
\sloppy
\vspace{1.0em}
\noindent{\Large\bfseries Cel karty}\par
\vspace{0.35em}
Uczeń przechodzi od liniowego kursora z K\&R 5.4 do wielokrotnego użycia tej samej areny: rozpoznaje nagłówek bloku, first-fit, split oraz dwustronne scalanie wolnych bloków w heap\_4.
\vspace{0.8em}
\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}}
\vspace{0.7em}
\noindent{\Large\bfseries Zakres karty}\par
\vspace{0.35em}
Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdziwe FreeRTOS-Kernel V11.3.0 heap\_4 na RV32I/Hazard3 i dowodzi fragmentacji, pełnego scalenia, minimum-ever oraz kontrolowanego OOM.
\vspace{0.55em}
\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{0.85cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.45cm}>{\raggedright\arraybackslash}p{1.75cm}>{\ttfamily\raggedright\arraybackslash}p{1.50cm}@{}}
\textbf{Lekcja} & \textbf{Task} & \textbf{Najważniejsza idea} & \textbf{Priorytet} & \textbf{Status} & \textbf{Version} \\ \hline
\hline
\multicolumn{1}{|l|}{\textbf{\texttt{FC01}}} & \multicolumn{1}{l|}{\textbf{\texttt{Task01}}} & \multicolumn{1}{l|}{\textbf{headers, address-ordered free list, first-fit, split, coalescing and heap statistics}} & \multicolumn{1}{l|}{\textbf{główny}} & \multicolumn{1}{l|}{\textbf{opracowane}} & \multicolumn{1}{l|}{\textbf{\texttt{v00.01}}} \\ \hline
\end{tabularx}
\normalsize
\vspace{0.8em}
\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}}
\clearpage
\ESCSectionBlockStart
\noindent{\small\bfseries A1 — Od liniowego kursora do odzyskiwalnej areny \hfill część 1/1 \textperiodcentered\ r1 c1}\par
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.47121\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a1-context.png}}
\caption{A1 CONTEXT — od żądania aplikacji do rzeczywistych bajtów ucHeap. — część 1/1 (r1 c1).}
\label{fig:a1-context}
\end{figure}
\ESCSectionBlockEnd
\clearpage
\ESCSectionBlockStart
\noindent{\small\bfseries A2 — Nagłówek, payload i lista wolnych bloków \hfill część 1/1 \textperiodcentered\ r1 c1}\par
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.44697\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a2-structure.png}}
\caption{A2 STRUCTURE — metadane wewnątrz areny i adresowo uporządkowana lista. — część 1/1 (r1 c1).}
\label{fig:a2-structure}
\end{figure}
\ESCSectionBlockEnd
\clearpage
\begin{landscape}
\ESCSectionBlockStart
\noindent{\small\bfseries A5 — First-fit, fragmentacja i pełne scalenie \hfill część 1/1 \textperiodcentered\ r1 c1}\par
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.86277\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a5-flow.png}}
\caption{A5 FLOW — inicjalizacja, A/B/C, fragmentacja, dwustronne scalenie i OOM. — część 1/1 (r1 c1).}
\label{fig:a5-flow}
\end{figure}
\ESCSectionBlockEnd
\end{landscape}
\clearpage
\ESCSectionBlockStart
\noindent{\small\bfseries A6 — Stan bloku a stan statystyk \hfill część 1/1 \textperiodcentered\ r1 c1}\par
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.52424\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a6-state.png}}
\caption{A6 STATE — wolny, przydzielony, rozdzielony, scalony oraz minimum-ever. — część 1/1 (r1 c1).}
\label{fig:a6-state}
\end{figure}
\ESCSectionBlockEnd
\clearpage
\begin{landscape}
\ESCSectionBlockStart
\noindent{\small\bfseries A7 — Dowód w Hazard3 i ELF \hfill część 1/1 \textperiodcentered\ r1 c1}\par
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.86596\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a7-runtime.png}}
\caption{A7 RUNTIME — kod, ELF, checkpoint, pamięć i statystyki jednego przebiegu. — część 1/1 (r1 c1).}
\label{fig:a7-runtime}
\end{figure}
\ESCSectionBlockEnd
\end{landscape}
\clearpage
\ESCSectionBlockStart
\section{Task01 — mechanika heap\_4}
\begin{ESCTaskFrame}{TASK01 · Predict and prove reusable heap\_4 blocks}
{\scriptsize\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\par
\begin{ESCBlockFrame}{A — przewidywanie}
Przejdź przez model nagłówka, split i porządek adresowy przed uruchomieniem prawdziwego heap\_4.
\begin{ESCStepFrame}{size · Policz rozmiar bloku.}
Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu.
\end{ESCStepFrame}
\begin{ESCStepFrame}{list · Narysuj listę po free(A,C).}
Zaznacz, dlaczego przydzielony B rozdziela dwa wolne obszary.
\end{ESCStepFrame}
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{B — replay Hazard3}
Powiąż diagram z dwoma deterministycznymi checkpointami.
\begin{ESCStepFrame}{fragmented · Sprawdź E01.}
Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty.
\end{ESCStepFrame}
\begin{ESCStepFrame}{coalesced · Sprawdź E02.}
Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM.
\end{ESCStepFrame}
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Ćwiczenie — ta sama suma, inna użyteczność}
Zaproponuj dwa układy wolnych bloków o tej samej sumie bajtów, ale tylko jeden zdolny obsłużyć wskazane duże żądanie. Uzasadnij odpowiedź przez largest-free-block.
\par\textbf{Evidence:} Dwa diagramy listy, suma wolnych bajtów, rozmiar największego bloku i wynik pvPortMalloc.
\par\textbf{Acceptance:} Uczeń nie utożsamia sumy wolnej pamięci z możliwością pojedynczego dużego przydziału.
\end{ESCBlockFrame}
\tcblower\textbf{Task acceptance:} Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.
\end{ESCTaskFrame}
\begin{ESCConclusionFrame}
heap\_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem.
\end{ESCConclusionFrame}
\ESCSectionBlockEnd
\end{document}
+203 -208
View File
@@ -1,8 +1,8 @@
\documentclass[11pt]{article}
\documentclass[10pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage[a4paper,margin=1.75cm]{geometry}
\usepackage[a4paper,margin=1.55cm]{geometry}
\usepackage{array,tabularx,booktabs}
\usepackage{amsmath,amssymb}
\usepackage{xcolor,listings}
@@ -12,6 +12,7 @@
\definecolor{accent}{HTML}{16324A}
\definecolor{accentlight}{HTML}{EEF3F7}
\definecolor{rulegray}{HTML}{D7DEE5}
\definecolor{success}{HTML}{236B45}
\hypersetup{colorlinks=true,linkcolor=accent,urlcolor=blue}
\IfFileExists{build-meta.tex}{\input{build-meta.tex}}{\newcommand{\BuildCommit}{local}}
\newcommand{\PublisherDomain}{mpabi}
@@ -20,292 +21,286 @@
\newcommand{\CardArea}{inf}
\newcommand{\CardSeries}{rv32i-freertos}
\newcommand{\CardNumber}{01}
\newcommand{\CardCount}{14}
\newcommand{\CardCount}{15}
\newcommand{\CardSlug}{heap4}
\newcommand{\CardVersion}{v0.2}
\newcommand{\CardVersion}{v0.3}
\newcommand{\DocumentKey}{\PublisherDomain/\CardArea/\CardSeries/\CardNumber/\CardSlug/\CardVersion}
\newcommand{\DocumentUUID}{4654524c-73f2-46df-83a3-d448ba6d6c5a}
\lstset{
language=C,basicstyle=\ttfamily\scriptsize,columns=fullflexible,
keepspaces=true,frame=single,breaklines=true,showstringspaces=false,
numbers=left,numberstyle=\tiny\color{accent},numbersep=6pt,
backgroundcolor=\color{accentlight},rulecolor=\color{rulegray}
numbers=none,backgroundcolor=\color{accentlight},rulecolor=\color{rulegray}
}
\pagestyle{fancy}
\fancyhf{}
\lhead{\textbf{FreeRTOS: heap\_4}}
\rhead{\small karta 01/14}
\lhead{\textbf{FC01 · FreeRTOS \texttt{heap\_4}}}
\rhead{\small 30 minut · Pico 2 W / RP2350}
\lfoot{\scriptsize commit \BuildCommit}
\cfoot{\scriptsize \thepage/\pageref{LastPage}}
\rfoot{\scriptsize V11.3.0 / \CardVersion}
\setlength{\headheight}{15pt}
\setlength{\footskip}{22pt}
\setlist[itemize]{nosep,leftmargin=1.5em}
\setlist[enumerate]{itemsep=.25em,leftmargin=1.7em}
\setlength{\headheight}{14pt}
\setlength{\footskip}{19pt}
\setlist[itemize]{nosep,leftmargin=1.45em}
\setlist[enumerate]{nosep,leftmargin=1.65em}
\newcommand{\checkline}{\(\square\)\;}
\newcommand{\blank}[1]{\rule{#1}{.2pt}}
\begin{document}
\sloppy
\begin{center}
{\LARGE\bfseries Karta pracy: FreeRTOS \texttt{heap\_4}}\par
\vspace{.4em}
{\large model $\rightarrow$ prawdziwy upstream $\rightarrow$ RP2350}\par
{\LARGE\bfseries FreeRTOS \texttt{heap\_4}: od kursora do wolnych bloków}\par
\vspace{.25em}
{\large bezpośrednia kontynuacja projektu K\&R 5.4}\par
\end{center}
\begin{tabularx}{\textwidth}{@{}lX@{}}
\noindent\begin{tabularx}{\textwidth}{@{}p{1.45cm}Xp{1.4cm}X@{}}
\toprule
Klucz & \texttt{\DocumentKey} \\
Wersja / commit & \texttt{\CardVersion} / \texttt{\BuildCommit} \\
Data & 14.07.2026 \\
Allocator & FreeRTOS-Kernel V11.3.0, \texttt{9b777ae5c5b8} \\
Port RP2350 & fork Raspberry Pi, \texttt{4f7299d6ea74} \\
Źródło & \texttt{portable/MemMang/heap\_4.c} — bez modyfikacji \\
Punkt wejścia & \texttt{stemctl} \\
Karta & FC01 / \CardCount & Czas & 30 minut \\
Płytka & Raspberry Pi Pico 2 W & Układ & RP2350, rdzeń RISC-V \\
Allocator & FreeRTOS-Kernel V11.3.0 & Źródło & upstream \texttt{heap\_4.c} \\
Wersja & \CardVersion & Data & 19.07.2026 \\
\bottomrule
\end{tabularx}
\section*{Tylko trzy kroki}
\begin{enumerate}
\item First-fit + split: skąd bierze się drugi nagłówek.
\item Free-list + coalescing: dlaczego lista jest uporządkowana po adresie.
\item API FreeRTOS: \texttt{pvPortMalloc}, \texttt{vPortFree}, stats, OOM.
\end{enumerate}
\section*{Punkt startowy — tego już nie powtarzamy}
\section*{Warunek zaliczenia}
\begin{itemize}
\item \checkline przewiduję rozmiary nagłówków i bloków na AMD64/RV32;
\item \checkline rozpoznaję fragmentację: suma wolnych bajtów $\neq$ największy blok;
\item \checkline pokazuję split i dwa kierunki scalania w Memory;
\item \checkline odczytuję \texttt{xStart}, \texttt{pxEnd}, minimum-ever i stack frame;
\item \checkline Task 3 daje \texttt{pass=1} na host, Hazard3 i RP2350.
\end{itemize}
Z poprzedniej karty działa projekt:
\newpage
\section{Start — polecenia i platformy}
\begin{lstlisting}[language=bash,numbers=none]
stemctl test native-amd64 freertos heap4 1
stemctl test hazard3-sim freertos heap4 2
stemctl debug hazard3-sim freertos heap4 3
stemctl test rp2350 freertos heap4 3
stemctl deploy rp2350 freertos heap4 3 \
--device /dev/bus/usb/BBB/DDD
\begin{lstlisting}
allocbuf[64]; allocp = allocbuf;
alloc_local(5) -> offset 0
alloc_local(7) -> offset 5
allocp -> offset 12
alloc_local(0) i OOM -> NULL; kursor pozostaje na 12
\end{lstlisting}
\begin{tabularx}{\textwidth}{@{}p{3.1cm}XXX@{}}
\noindent\fcolorbox{accent}{accentlight}{%
\begin{minipage}{.94\textwidth}
\textbf{Pytanie projektowe.} Jak zwolnić obszar 5 B spod offsetu 0, zachować
późniejszy obszar 7 B spod offsetu 5 i ponownie wykorzystać powstałą dziurę?
W naszym projekcie nie istnieje \texttt{free}; reset odzyskuje całą arenę.
Samo cofnięcie kursora zniszczyłoby również późniejsze przydziały.
\end{minipage}}
\section*{Cel lekcji}
Potrafię wskazać trzy elementy dodane przez \texttt{heap\_4} do alokatora
liniowego --- \textbf{nagłówek bloku, listę wolnych bloków i scalanie} --- oraz
potwierdzić ich działanie na prawdziwym \texttt{heap\_4.c}.
\section*{Plan 30 minut}
\begin{tabularx}{\textwidth}{@{}p{1.55cm}p{3.0cm}X@{}}
\toprule
& AMD64 & Hazard3 & RP2350 \\
Czas & Tryb & Wynik \\
\midrule
Task 1--2 & model + sanitizery & model na RTL & build \\
Task 3 & V11.3 + adapter 1-thread & pełny V11.3 + port RISC-V & zgodny core+port RP; allocator V11.3 \\
Debug & GDB & GDB stub RTL & OpenOCD; SRAM \\
Deploy & --- & --- & SPI flash + verify \\
0--3 & problem K\&R & nazwać, dlaczego jeden kursor nie zwolni obszaru ze środka \\
3--4 & kontekst & FreeRTOS linkuje jedną implementację; tutaj pracujemy tylko z \texttt{heap\_4} \\
4--9 & Demo 1 & przewidzieć nagłówek, first-fit i split \\
9--16 & Demo 2 & przewidzieć listę adresową i scalenie \texttt{2 -> 1} \\
16--27 & Task 3 RUN & dwa checkpointy prawdziwego \texttt{heap\_4.c} na Pico 2 W \\
27--30 & wyjście & odróżnić total free, largest free i minimum-ever \\
\bottomrule
\end{tabularx}
\subsection*{Termdebug}
\begin{tabularx}{\textwidth}{@{}lXlX@{}}
\toprule
\texttt{F5} & continue & \texttt{F9} & breakpoint \\
\texttt{F10} & next & \texttt{F11} & step \\
\texttt{Shift-F11} & finish & \texttt{F8} & stepi \\
\texttt{:StudentStack} & frame + stos & \texttt{:StudentLst} & listing ELF-a \\
\bottomrule
\end{tabularx}
\textbf{Strategia obserwacji}: breakpoint przed zmianą $\rightarrow$ Memory
$\rightarrow$ continue/finish $\rightarrow$ Memory. Nie opieramy karty na data
watchpointach.
\vfill
\noindent\textbf{Jedna minuta kontekstu:} \texttt{heap\_1} przypomina rosnący
kursor bez \texttt{free}; \texttt{heap\_2} nie scala; \texttt{heap\_3} używa
alokatora biblioteki C; \texttt{heap\_5} rozszerza mechanikę \texttt{heap\_4}
na wiele regionów. Nie są to tematy tej lekcji.
\newpage
\section{Task 1 — first-fit i split}
\section{Most: od K\&R 5.4 do \texttt{heap\_4}}
\subsection*{Policz przed uruchomieniem}
\begin{tabular}{@{}lcc@{}}
\begin{tabularx}{\textwidth}{@{}p{3.5cm}p{4.8cm}X@{}}
\toprule
& AMD64 & RV32 \\
K\&R 5.4 — co mamy & Ograniczenie & Co dodaje \texttt{heap\_4} \\
\midrule
\texttt{sizeof(ModelBlock)} & \rule{1.6cm}{.2pt} & \rule{1.6cm}{.2pt} \\
request & 13 B & 13 B \\
\texttt{align8(header + request)} & \rule{1.6cm}{.2pt} & \rule{1.6cm}{.2pt} \\
remainder z 256 B & \rule{1.6cm}{.2pt} & \rule{1.6cm}{.2pt} \\
offset payloadu & \rule{1.6cm}{.2pt} & \rule{1.6cm}{.2pt} \\
\texttt{allocbuf[64]}, \texttt{allocp} & istnieje tylko wolny ogon areny & arena podzielona na opisane bloki \\
wynik to surowy adres & później nie znamy rozmiaru obszaru & nagłówek \texttt{BlockLink\_t} przed payloadem \\
przydział przesuwa kursor & nie wykorzystamy dziury & lista wolnych bloków i first-fit \\
reset całej areny & brak zwolnienia jednego obszaru & \texttt{vPortFree()} wskazanego bloku \\
brak relacji między dziurami & sąsiednie dziury są rozdzielone & porządek adresowy i coalescing \\
sukces albo \texttt{NULL} & brak miary fragmentacji & free, largest, block count, minimum-ever \\
\bottomrule
\end{tabular}
\end{tabularx}
\subsection*{Nagłówek realnego bloku}
\begin{lstlisting}
typedef struct A_BLOCK_LINK {
struct A_BLOCK_LINK *pxNextFreeBlock;
size_t xBlockSize; /* MSB oznacza blok przydzielony */
} BlockLink_t;
[ BlockLink_t | payload zwracany przez pvPortMalloc() ]
^ metadata ^ adres widziany przez aplikacje
\end{lstlisting}
\textbf{Granica modelu:} Task 1--2 używają uproszczonego nagłówka
\texttt{\{next,size\}}. Bit allocated i pełne zabezpieczenia oglądamy dopiero
w upstream \texttt{heap\_4.c}.
\section{Demo 1 — pierwszy pasujący blok i split (5 minut)}
Na RP2350/RV32 nagłówek modelu ma 8 B. Dla żądania 13 B:
\[
\texttt{wanted}=\operatorname{align8}(8+13)=24\ \mathrm{B}
\]
\begin{lstlisting}
free list przed: [ block 16 B ] -> [ block 256 B ] -> END
request po naglowku i align8: 24 B
\end{lstlisting}
\textbf{Predykcja — wpisz przed odsłonięciem:}
\subsection*{Do wykonania}
\begin{enumerate}
\item Wskaż nagłówek bloku przydzielonego i nagłówek remainder.
\item Sprawdź: \texttt{wanted + remainder == 256}.
\item Zmień request 13 na 17; przewidź wynik bez uruchamiania.
\item W listingu znajdź dodawanie bajtowego offsetu do adresu areny.
\item Pierwszy pasujący blok ma \blank{1.5cm} B.
\item Blok przydzielony ma \blank{1.5cm} B, a remainder \blank{1.5cm} B.
\item Równość zachowania areny: \blank{2cm} + \blank{2cm} = 256 B.
\end{enumerate}
\lstinputlisting{../src/tasks/task01_first_fit_split.c}
\noindent\textbf{Sprawdzenie po predykcji:}
\texttt{16 B} nie mieści żądania, więc first-fit wybiera \texttt{256 B}; split
daje \texttt{24 B + 232 B}. Realny \texttt{heap\_4} dzieli blok tylko wtedy,
gdy reszta jest większa od minimalnego rozmiaru bloku.
\noindent\textbf{Nie uruchamiamy osobnego debugowania Task 1.} Model służy do
policzenia geometrii; centralny RUN jest w Task 3.
\newpage
\section{Task 2 — lista adresowa i coalescing}
\section{Demo 2 — lista adresowa i coalescing (7 minut)}
\subsection*{Eksperyment}
\begin{center}
\texttt{A:48 | B:48 | C:48}\quad
$\xrightarrow{\text{free A, free C}}$\quad
\texttt{A:48 -> C:48}\quad
$\xrightarrow{\text{free B}}$\quad
\texttt{A:144}
\texttt{[ A:48 FREE ][ B:48 USED ][ C:48 FREE ]}
\end{center}
\subsection*{Do wykonania}
\begin{enumerate}
\item Zatrzymaj program w \texttt{task02\_fragmented\_checkpoint}.
\item Zapisz adresy i rozmiary dwóch elementów free-list.
\item Wykonaj \texttt{F5}; zatrzymaj w \texttt{task02\_debug\_checkpoint}.
\item Wskaż pierwszy warunek scalania: z blokiem po prawej.
\item Wskaż drugi warunek scalania: z blokiem po lewej.
\item Wyjaśnij, czemu kolejność po adresie redukuje koszt szukania sąsiadów.
\end{enumerate}
\begin{lstlisting}
pamiec: A -------- B -------- C
free list: A ------------------> C -> END
\end{lstlisting}
\textbf{Predykcja:} po \texttt{vPortFree(B)} narysuj listę i uzupełnij:
\subsection*{Tabela obserwacji}
\begin{tabular}{@{}lccc@{}}
\toprule
Stan & liczba bloków & suma & największy \\
Stan & liczba wolnych bloków & suma wolna & największy blok \\
\midrule
przed B & \rule{1.4cm}{.2pt} & \rule{1.4cm}{.2pt} & \rule{1.4cm}{.2pt} \\
po B & \rule{1.4cm}{.2pt} & \rule{1.4cm}{.2pt} & \rule{1.4cm}{.2pt} \\
przed zwolnieniem B & \blank{1.2cm} & \blank{1.2cm} & \blank{1.2cm} \\
po zwolnieniu B & \blank{1.2cm} & \blank{1.2cm} & \blank{1.2cm} \\
\bottomrule
\end{tabular}
\lstinputlisting{../src/tasks/task02_address_order_coalesce.c}
\subsection*{Odsłoń po zapisaniu predykcji}
\newpage
\section{Task 3 — prawdziwy FreeRTOS \texttt{heap\_4.c}}
\subsection*{Sekwencja testowa}
\begin{enumerate}
\item init przez pierwsze \texttt{pvPortMalloc(1)} i \texttt{vPortFree}; zapisz $F_0$;
\item malloc: 24 B, 40 B, 16 B; zapisz $F_1$;
\item free pierwszego i trzeciego; oczekuj 2 wolnych bloków;
\item free środkowego; oczekuj jednego bloku i $F_{final}=F_0$;
\item malloc większy niż heap; oczekuj \texttt{NULL} i jednego hooka.
\item Wstaw B między A i C według adresu.
\item \texttt{end(B) == address(C)}: połącz B z C.
\item \texttt{end(A) == address(BC)}: połącz A z BC.
\end{enumerate}
\subsection*{Inwarianty — zaznacz po teście}
\begin{itemize}
\item \checkline $F_0 > F_1$;
\item \checkline $F_{final}=F_0$;
\item \checkline minimum-ever $\leq F_1$ i nie rośnie po free;
\item \checkline każdy payload ma adres podzielny przez 8;
\item \checkline OOM zwraca \texttt{NULL};
\item \checkline końcowa free-list ma dokładnie jeden blok.
\end{itemize}
\lstinputlisting{../src/tasks/task03_freertos_heap4.c}
\newpage
\section{Czytanie upstream \texttt{heap\_4.c}}
\subsection*{Znajdź w pliku — nie czytaj całego od góry}
\begin{lstlisting}[language=bash,numbers=none]
K=/opt/FreeRTOS-Kernel/portable/MemMang/heap_4.c
rg -n 'xHeapStructSize|pvPortMalloc|prvHeapInit' "$K"
rg -n 'prvInsertBlockIntoFreeList|vPortFree' "$K"
rg -n 'xFreeBytesRemaining|xMinimumEver' "$K"
rg -n 'heapADD_WILL_OVERFLOW|heapBLOCK_ALLOCATED' "$K"
\begin{lstlisting}
przed: A:48 -> C:48 -> END blocks=2 total=96 largest=48
po: A:144 -> END blocks=1 total=144 largest=144
\end{lstlisting}
\begin{itemize}[leftmargin=*,itemsep=2pt]
\item \texttt{xHeapStructSize}: dlaczego jest wyrównany oddzielnie od
\texttt{sizeof}?
\item \texttt{heapBLOCK\_ALLOCATED\_BITMASK}: który bit rozmiaru oznacza
właściciela?
\item \texttt{pvPortMalloc}: gdzie są overflow, alignment, first-fit i split?
\item \texttt{vPortFree}: jak odzyskuje nagłówek z payloadu?
\item \texttt{prvInsertBlockIntoFreeList}: gdzie są dwa kierunki scalania?
\item \texttt{xMinimumEverFreeBytesRemaining}: dlaczego free go nie zwiększa?
\end{itemize}
Porządek po adresie sprawia, że fizycznych sąsiadów można sprawdzić podczas
jednego wstawienia. To jest mechanizm funkcji
\texttt{prvInsertBlockIntoFreeList()} z \texttt{heap\_4.c}.
\subsection*{Breakpointy}
\begin{lstlisting}[numbers=none]
b pvPortMalloc
b vPortFree
b prvInsertBlockIntoFreeList
p xStart
p pxEnd
\section{Task 3 — jedyny centralny RUN (11 minut)}
Obraz i sesja muszą być przygotowane przed lekcją. Nie kompilujemy ani nie
flashujemy w czasie tych 30 minut.
\begin{lstlisting}[language=bash]
# wykonane przed lekcja:
stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD
\end{lstlisting}
\begin{lstlisting}
RESET/INIT
-> ALLOC A(24) -> ALLOC B(40) -> ALLOC C(16)
-> FREE A -> FREE C
-> heap4_fragmented_checkpoint # STOP 1
-> FREE B -> OOM request
-> task03_debug_checkpoint # STOP 2
\end{lstlisting}
\textbf{STOP 1:} zapisz liczbę bloków, sumę i largest. Przed \texttt{F5}
przewidź, co zmieni \texttt{FREE B}.
\textbf{STOP 2:} sprawdź odzyskanie areny, minimum-ever, OOM i hook.
\newpage
\section{Dowód na Pico 2 W / RP2350}
\textbf{Ważne:} \texttt{heap\_4} jest plikiem wybranym i linkowanym przez
projekt. Nie jest sprzętowym heapem ani peryferium RP2350. Pico 2 W dostarcza
realną pamięć SRAM, w której obserwujemy ten sam algorytm.
\subsection*{Minimalny widok GDB}
\begin{lstlisting}
p g_fragmented_stats
p g_final_stats
p xFreeBytesRemaining
p xMinimumEverFreeBytesRemaining
x/160bx ucHeap
p xStart
p pxEnd
x/96bx ucHeap
\end{lstlisting}
\newpage
\section{RP2350 — deploy i dowód sprzętowy}
\subsection*{Tabela obserwacji}
\subsection*{Polecenie}
\begin{lstlisting}[language=bash,numbers=none]
stemctl probe list
stemctl deploy rp2350 freertos heap4 3 \
--device /dev/bus/usb/BBB/DDD
\end{lstlisting}
\subsection*{Automatyczny test zatrzymuje się dwa razy}
\begin{enumerate}
\item \texttt{heap4\_fragmented\_checkpoint}: 2 wolne bloki;
\item \texttt{task03\_debug\_checkpoint}: heap odtworzony, OOM obsłużony.
\end{enumerate}
\subsection*{Zapis ucznia}
\begin{tabular}{@{}ll@{}}
\begin{tabularx}{\textwidth}{@{}p{4.2cm}p{3.0cm}X@{}}
\toprule
Wielkość & Wartość \\
Wielkość & Odczyt & Warunek \\
\midrule
\texttt{initial free} & \rule{4cm}{.2pt} \\
\texttt{after allocations} & \rule{4cm}{.2pt} \\
\texttt{minimum ever} & \rule{4cm}{.2pt} \\
\texttt{final free} & \rule{4cm}{.2pt} \\
\texttt{sp / fp / pc} & \rule{7cm}{.2pt} \\
\texttt{initial\_free} & \blank{2.3cm} & punkt odniesienia \\
\texttt{after\_allocations} & \blank{2.3cm} & mniejsze niż initial \\
STOP 1: free blocks & \blank{2.3cm} & równe 2 \\
STOP 1: total / largest & \blank{2.3cm} & largest mniejsze niż total \\
STOP 2: final free & \blank{2.3cm} & równe initial \\
STOP 2: free blocks & \blank{2.3cm} & równe 1 \\
minimum-ever & \blank{2.3cm} & nie rośnie po free \\
OOM / hook / asserts / pass & \blank{2.3cm} & \texttt{1 / 1 / 0 / 1} \\
\bottomrule
\end{tabular}
\end{tabularx}
\subsection*{Kontrakt}
\begin{itemize}
\item flash: write + verify; ELF: RISC-V;
\item breakpointy sprzętowe, nie data watchpoint;
\item \texttt{aligned=1 oom=1 hooks=1 asserts=0 pass=1};
\item \texttt{sp \& 15 == 0};
\item \texttt{rp2350-hardware-ok task=task03 heap\_4=upstream}.
\end{itemize}
\section*{Wyjście — trzy minuty}
\textbf{Operacje są rozdzielone}: \texttt{debug} ładuje do SRAM;
\texttt{deploy} zapisuje trwały obraz do SPI flash.
\newpage
\section{Podsumowanie i oddanie}
\subsection*{Odpowiedz jednym zdaniem}
\begin{enumerate}
\item Dlaczego \texttt{heap\_4} scala, a nie tylko odkłada blok na listę?\\[.6em]
\rule{\textwidth}{.2pt}
\item Dlaczego „wolne razem” nie oznacza „można przydzielić jeden duży blok”?\\[.6em]
\rule{\textwidth}{.2pt}
\item Gdzie leży metadata bloku przydzielonego aplikacji?\\[.6em]
\rule{\textwidth}{.2pt}
\item Co mierzy minimum-ever-free, a czego nie mierzy?\\[.6em]
\rule{\textwidth}{.2pt}
\item Dlaczego jeden \texttt{allocp} nie wystarcza do zwolnienia obszaru
spod offsetu 0 przy zachowaniu obszaru spod offsetu 5?\\[.35em]
\blank{.96\linewidth}
\item Jak \texttt{vPortFree()} znajduje rozmiar payloadu, skoro dostaje tylko
jego adres?\\[.35em]
\blank{.96\linewidth}
\item Dlaczego 96 wolnych bajtów w dwóch blokach nie pozwala przydzielić
jednego bloku 80 B?\\[.35em]
\blank{.96\linewidth}
\end{enumerate}
\subsection*{Oddaj}
\subsection*{Zaliczenie}
\begin{itemize}
\item \checkline wyniki 3 tasków na AMD64;
\item \checkline Hazard3: trzy kody wyjścia 0;
\item \checkline zrzut Task 2: przed i po scaleniu;
\item \checkline zrzut Task 3: source + listing + Memory + Stack;
\item \checkline wynik RP2350 \texttt{rp2350-hardware-ok};
\item \checkline wypełnione inwarianty i cztery odpowiedzi.
\item \checkline wymieniam: header, free list, coalescing;
\item \checkline przewiduję \texttt{2 bloki -> 1 blok};
\item \checkline odróżniam payload, metadata allocatora i stos \texttt{sp};
\item \checkline odróżniam current free, largest free i minimum-ever;
\item \checkline Task 3 kończy się
\texttt{aligned=1 oom=1 hooks=1 asserts=0 pass=1}.
\end{itemize}
\vfill
\noindent\textbf{Dalej}: taski FreeRTOS, scheduler, osobne stosy, 1 kHz tick;
następnie cienki C++ header wrapper i użycie w projekcie hoveboard.
\noindent\textbf{Poza lekcją:} pełne czytanie upstream \texttt{heap\_4.c},
osobne uruchomienie Task 1--2 na AMD64/Hazard3, samodzielny deploy RP2350 oraz
porównanie z \texttt{heap\_1}, \texttt{heap\_2}, \texttt{heap\_3} i
\texttt{heap\_5}.
\end{document}
File diff suppressed because it is too large Load Diff
+811
View File
@@ -0,0 +1,811 @@
{
"card": {
"number": "01",
"slug": "heap4-mechanics",
"title": "heap_4: From Linear Cursor to Reusable Blocks",
"topic": "headers, address-ordered free list, first-fit, split, coalescing and heap statistics",
"status": "Gotowa",
"version": "v00.01",
"revision_date": "2026-07-20T00:00:00+02:00"
},
"front": {
"goal": "Uczeń przechodzi od liniowego kursora z K\\&R 5.4 do wielokrotnego użycia tej samej areny: rozpoznaje nagłówek bloku, first-fit, split oraz dwustronne scalanie wolnych bloków w heap\\_4.",
"scope": "Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdziwe FreeRTOS-Kernel V11.3.0 heap\\_4 na RV32I/Hazard3 i dowodzi fragmentacji, pełnego scalenia, minimum-ever oraz kontrolowanego OOM."
},
"viewpoints": [
{
"id": "A1",
"label": "CONTEXT",
"subtitle": "from cursor to reusable heap",
"status": "enabled"
},
{
"id": "A2",
"label": "STRUCTURE",
"subtitle": "headers and address order",
"status": "enabled"
},
{
"id": "A3",
"label": "DISPATCH",
"subtitle": "not used by the allocator",
"status": "unavailable",
"reason": "heap_4 is called directly through pvPortMalloc and vPortFree; there is no callback or dispatch mechanism to explain."
},
{
"id": "A4",
"label": "APPLICATION",
"subtitle": "experiment is already explicit",
"status": "unavailable",
"reason": "The concrete A/B/C allocation experiment is completely represented by A5 and its two runtime checkpoints."
},
{
"id": "A5",
"label": "FLOW",
"subtitle": "allocate, fragment, coalesce",
"status": "enabled"
},
{
"id": "A6",
"label": "STATE",
"subtitle": "block list and statistics",
"status": "enabled"
},
{
"id": "A7",
"label": "RUNTIME",
"subtitle": "Hazard3 evidence",
"status": "enabled"
},
{
"id": "A8",
"label": "PATTERNS",
"subtitle": "mechanism, not a separate page",
"status": "unavailable",
"reason": "First-fit and the intrusive address-ordered free list are already proved in A2 and A5; a separate pattern page would duplicate them."
}
],
"artifact": {
"source": "src/tasks/task03_freertos_heap4.c",
"elf": "build/task03_freertos_heap4/prog.elf",
"image": "build/task03_freertos_heap4/prog.bin"
},
"strategies": [
{
"id": "code.model",
"kind": "code",
"prerequisites": [
"K&R 5.4 linear allocator complete"
],
"layout": [
"header",
"payload",
"remainder",
"address-ordered list"
],
"commands": [
"rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks"
],
"expected_observations": [
"requested size includes header and alignment",
"free list is ordered by block address"
],
"assertions": [
"payload begins after the header",
"split preserves the total arena size"
],
"evidence_fields": [
"code_ref",
"header bytes",
"wanted bytes",
"block address"
]
},
{
"id": "code.heap4",
"kind": "code",
"prerequisites": [
"FreeRTOS-Kernel V11.3.0 available"
],
"layout": [
"ucHeap",
"BlockLink_t",
"xStart",
"pxEnd"
],
"commands": [
"rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c"
],
"expected_observations": [
"heap_4 keeps metadata inside the arena",
"free blocks form one address-ordered intrusive list"
],
"assertions": [
"allocated bit is stored in the size field",
"xStart and pxEnd are sentinels"
],
"evidence_fields": [
"symbol",
"list link",
"block size",
"arena address"
]
},
{
"id": "run.fragmented",
"kind": "run",
"prerequisites": [
"clean Hazard3 RAM",
"task03 image loaded"
],
"layout": [
"source",
"free-list stats",
"ucHeap memory",
"registers"
],
"commands": [
"break heap4_fragmented_checkpoint",
"print g_fragmented_stats",
"x/64bx ucHeap"
],
"expected_observations": [
"A and C are free while B remains allocated",
"the free list contains two blocks"
],
"assertions": [
"xNumberOfFreeBlocks equals 2",
"current free bytes exceed the largest free block"
],
"evidence_fields": [
"free blocks",
"largest block",
"free bytes",
"heap bytes"
]
},
{
"id": "run.coalesced",
"kind": "run",
"prerequisites": [
"fragmented checkpoint reached"
],
"layout": [
"final stats",
"minimum-ever",
"OOM hook",
"PASS"
],
"commands": [
"break task03_debug_checkpoint",
"print g_final_stats",
"print g_task03_pass"
],
"expected_observations": [
"freeing B joins both neighbours",
"the arena returns to one reusable block"
],
"assertions": [
"final free equals initial free",
"minimum-ever does not rise after free",
"oversized allocation returns NULL and calls the hook once"
],
"evidence_fields": [
"final free",
"largest block",
"minimum-ever",
"OOM hook",
"PASS"
]
},
{
"id": "code.identity",
"kind": "code",
"prerequisites": [
"built ELF"
],
"layout": [
"symbols",
"sections",
"artifact hashes"
],
"commands": [
"tests/check_task03_elf.sh build/task03_freertos_heap4/prog.elf"
],
"expected_observations": [
"upstream heap_4 symbols are linked",
"checkpoint and ucHeap symbols remain observable"
],
"assertions": [
"pvPortMalloc and vPortFree are present",
"prvInsertBlockIntoFreeList is present"
],
"evidence_fields": [
"source blob",
"ELF SHA256",
"image SHA256",
"symbol"
]
}
],
"checkpoints": {
"task01.fragmented": {
"event_id": "E01",
"stop": {
"symbol": "heap4_fragmented_checkpoint",
"offset": 0
},
"verify": {
"expressions": [
{
"expr": "g_fragmented_stats.xNumberOfFreeBlocks",
"equals": 2
},
{
"expr": "g_initial_free > g_after_allocations",
"equals": 1
},
{
"expr": "g_allocations_aligned",
"equals": 1
}
]
}
},
"task01.coalesced": {
"event_id": "E02",
"stop": {
"symbol": "task03_debug_checkpoint",
"offset": 0
},
"verify": {
"expressions": [
{
"expr": "g_final_stats.xNumberOfFreeBlocks",
"equals": 1
},
{
"expr": "g_final_free == g_initial_free",
"equals": 1
},
{
"expr": "g_oom_is_null",
"equals": 1
},
{
"expr": "g_task03_pass",
"equals": 1
}
]
}
}
},
"sections": [
{
"id": "A1",
"label": "CONTEXT",
"title": "Od liniowego kursora do odzyskiwalnej areny",
"order": 10,
"orientation": "portrait",
"description": "Aplikacja korzysta z publicznego API, heap_4 zarządza jedną areną, a Hazard3 pokazuje jej rzeczywisty stan.",
"content_tex": "Kursor liniowy potrafi tylko rosnąć. heap_4 dodaje metadane i listę wolnych bloków, dzięki czemu zwolniona pamięć wraca do ponownego użycia.",
"assets": [
{
"stem": "a1-context",
"title": "A1 · granice odpowiedzialności heap_4",
"caption": "A1 CONTEXT — od żądania aplikacji do rzeczywistych bajtów ucHeap.",
"label": "fig:a1-context",
"alt": "A1 · granice odpowiedzialności heap_4",
"phases": [
{
"id": "boundary",
"label": "APPLICATION / API / ALLOCATOR / TARGET",
"steps": [
{
"id": "application",
"number": 1,
"label": "aplikacja żąda i zwalnia bajty",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "01",
"code_ref": "src/tasks/task03_freertos_heap4.c:78",
"description": "Aplikacja zna wyłącznie publiczne API i wskaźniki payloadu.",
"evidence": "trzy żądania 24, 40 i 16 bajtów"
},
{
"id": "api",
"number": 2,
"label": "FreeRTOS wystawia malloc, free i statystyki",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "02",
"code_ref": "src/tasks/task03_freertos_heap4.c:90",
"description": "API oddziela eksperyment od prywatnej listy bloków.",
"evidence": "pvPortMalloc, vPortFree, vPortGetHeapStats"
},
{
"id": "allocator",
"number": 3,
"label": "heap_4 zarządza blokami i kolejnością adresów",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "03",
"code_ref": "src/tasks/task03_freertos_heap4.c:70",
"description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki.",
"evidence": "reset i inicjalizacja listy"
},
{
"id": "arena",
"number": 4,
"label": "ucHeap jest jedną ograniczoną areną",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "04",
"code_ref": "src/tasks/task03_freertos_heap4.c:11",
"description": "Metadane i payload znajdują się w tej samej statycznej tablicy.",
"evidence": "4096 bajtów, wyrównanie portu"
},
{
"id": "target",
"number": 5,
"label": "Hazard3 ujawnia adresy i bajty",
"mode": "CODE",
"strategy_ref": "code.identity",
"svg_label": "05",
"code_ref": "tests/check_task03_elf.sh:8",
"description": "ELF łączy kod, symbole i pamięć obserwowaną przez GDB.",
"evidence": "ucHeap i checkpointy w symbolach ELF"
}
]
}
]
}
]
},
{
"id": "A2",
"label": "STRUCTURE",
"title": "Nagłówek, payload i lista wolnych bloków",
"order": 20,
"orientation": "portrait",
"description": "Każdy blok ma nagłówek, a tylko wolne bloki wykorzystują wskaźnik next do budowy listy uporządkowanej adresami.",
"content_tex": "Rozmiar żądania rośnie o nagłówek i wyrównanie. Duży wolny blok może zostać rozdzielony na blok przydzielony i użyteczną resztę.",
"assets": [
{
"stem": "a2-structure",
"title": "A2 · struktura bloku i listy",
"caption": "A2 STRUCTURE — metadane wewnątrz areny i adresowo uporządkowana lista.",
"label": "fig:a2-structure",
"alt": "A2 · struktura bloku i listy",
"phases": [
{
"id": "blocks",
"label": "HEADER / PAYLOAD / FREE LIST",
"steps": [
{
"id": "header",
"number": 1,
"label": "nagłówek przechowuje next i size",
"mode": "CODE",
"strategy_ref": "code.model",
"svg_label": "01",
"code_ref": "src/tasks/heap4_model.h:11",
"description": "ModelBlock pokazuje minimalny kontrakt metadanych heap_4.",
"evidence": "dwa słowa metadanych"
},
{
"id": "alignment",
"number": 2,
"label": "żądanie obejmuje nagłówek i wyrównanie",
"mode": "CODE",
"strategy_ref": "code.model",
"svg_label": "02",
"code_ref": "src/tasks/task01_first_fit_split.c:3",
"description": "13 bajtów payloadu zajmuje 32 bajty całego bloku.",
"evidence": "header=16, wanted=32"
},
{
"id": "split",
"number": 3,
"label": "split pozostawia osobny wolny blok",
"mode": "CODE",
"strategy_ref": "code.model",
"svg_label": "03",
"code_ref": "src/tasks/task01_first_fit_split.c:43",
"description": "Reszta zachowuje własny nagłówek i trafia na listę wolnych.",
"evidence": "32 + 224 = 256"
},
{
"id": "address-order",
"number": 4,
"label": "lista jest uporządkowana rosnącymi adresami",
"mode": "CODE",
"strategy_ref": "code.model",
"svg_label": "04",
"code_ref": "src/tasks/task02_address_order_coalesce.c:29",
"description": "Pozycja w liście ujawnia bezpośredniego poprzednika i następnika.",
"evidence": "previous < block < current"
},
{
"id": "right-join",
"number": 5,
"label": "blok scala się z prawym sąsiadem",
"mode": "CODE",
"strategy_ref": "code.model",
"svg_label": "05",
"code_ref": "src/tasks/task02_address_order_coalesce.c:40",
"description": "Koniec zwalnianego bloku równy adresowi current oznacza ciągłość.",
"evidence": "block + size == current"
},
{
"id": "left-join",
"number": 6,
"label": "wynik scala się z lewym sąsiadem",
"mode": "CODE",
"strategy_ref": "code.model",
"svg_label": "06",
"code_ref": "src/tasks/task02_address_order_coalesce.c:48",
"description": "Drugi test domyka dwustronne scalanie w jeden blok.",
"evidence": "previous + size == block"
}
]
}
]
}
]
},
{
"id": "A5",
"label": "FLOW",
"title": "First-fit, fragmentacja i pełne scalenie",
"order": 50,
"orientation": "landscape",
"description": "Jeden przebieg A/B/C przechodzi od pustej areny przez trzy przydziały i dwa wolne obszary do ponownie scalonego bloku.",
"content_tex": "Uczeń najpierw przewiduje liczbę wolnych bloków. RUN odtwarza dwa stabilne stany: po zwolnieniu A i C oraz po zwolnieniu B.",
"assets": [
{
"stem": "a5-flow",
"title": "A5 · pełny przebieg heap_4",
"caption": "A5 FLOW — inicjalizacja, A/B/C, fragmentacja, dwustronne scalenie i OOM.",
"label": "fig:a5-flow",
"alt": "A5 · pełny przebieg heap_4",
"diagram_kind": "sequence",
"phases": [
{
"id": "replay",
"label": "ALLOCATE / FRAGMENT / COALESCE",
"steps": [
{
"id": "reset",
"number": 1,
"label": "reset i inicjalizacja areny",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "01",
"code_ref": "src/tasks/task03_freertos_heap4.c:70",
"description": "Pierwsze małe żądanie inicjalizuje sentinele i listę.",
"evidence": "initial free = 4080"
},
{
"id": "alloc-a",
"number": 2,
"label": "first-fit przydziela A",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "02",
"code_ref": "src/tasks/task03_freertos_heap4.c:78",
"description": "Pierwszy wystarczający blok zostaje rozdzielony.",
"evidence": "A payload = 24"
},
{
"id": "alloc-bc",
"number": 3,
"label": "kolejne split tworzą B i C",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "03",
"code_ref": "src/tasks/task03_freertos_heap4.c:79",
"description": "B i C zajmują kolejne fragmenty tego samego wolnego bloku.",
"evidence": "after allocations = 3952"
},
{
"id": "free-ac",
"number": 4,
"label": "zwolnij A i C, pozostaw B",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "04",
"code_ref": "src/tasks/task03_freertos_heap4.c:88",
"description": "C scala się z prawą resztą, ale B oddziela ją od A.",
"evidence": "dwa wolne bloki"
},
{
"id": "fragmented",
"number": 5,
"label": "checkpoint fragmentacji",
"mode": "RUN",
"event_id": "E01",
"strategy_ref": "run.fragmented",
"svg_label": "05",
"code_ref": "src/tasks/task03_freertos_heap4.c:91",
"snapshot_ref": "task01.fragmented",
"description": "GDB zatrzymuje program przy dwóch wolnych blokach.",
"evidence": "xNumberOfFreeBlocks = 2"
},
{
"id": "free-b",
"number": 6,
"label": "zwolnij B między dwoma sąsiadami",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "06",
"code_ref": "src/tasks/task03_freertos_heap4.c:93",
"description": "Wstawienie adresowe umożliwia dwa testy ciągłości.",
"evidence": "A + B + C + reszta są ciągłe"
},
{
"id": "coalesced",
"number": 7,
"label": "arena wraca do jednego bloku",
"mode": "RUN",
"event_id": "E02",
"strategy_ref": "run.coalesced",
"svg_label": "07",
"code_ref": "src/tasks/task03_freertos_heap4.c:96",
"snapshot_ref": "task01.coalesced",
"description": "Finalne statystyki dowodzą pełnego odzyskania areny.",
"evidence": "final free = initial free; blocks = 1"
},
{
"id": "oom",
"number": 8,
"label": "zbyt duże żądanie kończy się NULL",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "08",
"code_ref": "src/tasks/task03_freertos_heap4.c:98",
"description": "Kontrolowany OOM nie narusza listy i wywołuje hook dokładnie raz.",
"evidence": "NULL, hooks=1, asserts=0"
}
]
}
]
}
]
},
{
"id": "A6",
"label": "STATE",
"title": "Stan bloku a stan statystyk",
"order": 60,
"orientation": "portrait",
"description": "Bieżąca liczba wolnych bajtów może rosnąć po free, ale minimum-ever pozostaje historycznym minimum.",
"content_tex": "Fragmentacja to nie tylko suma wolnych bajtów. O możliwości przydziału decyduje także największy pojedynczy blok.",
"assets": [
{
"stem": "a6-state",
"title": "A6 · stany bloków i liczników",
"caption": "A6 STATE — wolny, przydzielony, rozdzielony, scalony oraz minimum-ever.",
"label": "fig:a6-state",
"alt": "A6 · stany bloków i liczników",
"phases": [
{
"id": "state",
"label": "BLOCK STATE / HEAP STATS",
"steps": [
{
"id": "free",
"number": 1,
"label": "wolny blok należy do listy",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "01",
"code_ref": "src/tasks/task03_freertos_heap4.c:70",
"description": "Stan początkowy zawiera jeden największy wolny blok.",
"evidence": "initial free = largest free"
},
{
"id": "allocated",
"number": 2,
"label": "przydzielony blok znika z listy wolnych",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "02",
"code_ref": "src/tasks/task03_freertos_heap4.c:78",
"description": "Payload jest wyrównany, a bieżąca wolna pamięć maleje.",
"evidence": "all payload pointers aligned"
},
{
"id": "fragmented-state",
"number": 3,
"label": "dwa wolne bloki nie są jednym dużym blokiem",
"mode": "RUN",
"event_id": "E01",
"strategy_ref": "run.fragmented",
"svg_label": "03",
"code_ref": "src/tasks/task03_freertos_heap4.c:90",
"snapshot_ref": "task01.fragmented",
"description": "Suma wolnego miejsca nie gwarantuje jednego dużego przydziału.",
"evidence": "free blocks = 2"
},
{
"id": "coalesced-state",
"number": 4,
"label": "scalenie przywraca jeden największy blok",
"mode": "RUN",
"event_id": "E02",
"strategy_ref": "run.coalesced",
"svg_label": "04",
"code_ref": "src/tasks/task03_freertos_heap4.c:94",
"snapshot_ref": "task01.coalesced",
"description": "Current free i largest wracają do wartości początkowej.",
"evidence": "free blocks = 1"
},
{
"id": "minimum-ever",
"number": 5,
"label": "minimum-ever zachowuje najniższy poziom",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "05",
"code_ref": "src/tasks/task03_freertos_heap4.c:95",
"description": "Historyczne minimum nie zwiększa się po odzyskaniu pamięci.",
"evidence": "minimum-ever <= after allocations"
}
]
}
]
}
]
},
{
"id": "A7",
"label": "RUNTIME",
"title": "Dowód w Hazard3 i ELF",
"order": 70,
"orientation": "landscape",
"description": "Ten sam artefakt łączy źródło, symbole ELF, dwa checkpointy, pamięć ucHeap i końcowe asercje.",
"content_tex": "Snapshot jest dowodem tylko wtedy, gdy zawiera tożsamość artefaktu, pozycję programu i wartości, które rozstrzygają hipotezę.",
"assets": [
{
"stem": "a7-runtime",
"title": "A7 · dowód runtime heap_4",
"caption": "A7 RUNTIME — kod, ELF, checkpoint, pamięć i statystyki jednego przebiegu.",
"label": "fig:a7-runtime",
"alt": "A7 · dowód runtime heap_4",
"phases": [
{
"id": "evidence",
"label": "ARTIFACT / CHECKPOINT / MEMORY / ASSERTION",
"steps": [
{
"id": "source",
"number": 1,
"label": "źródło wskazuje eksperyment A/B/C",
"mode": "CODE",
"strategy_ref": "code.identity",
"svg_label": "01",
"code_ref": "src/tasks/task03_freertos_heap4.c:62",
"description": "Blob źródła jest częścią tożsamości karty.",
"evidence": "source git blob"
},
{
"id": "elf",
"number": 2,
"label": "ELF zawiera prawdziwe symbole heap_4",
"mode": "CODE",
"strategy_ref": "code.identity",
"svg_label": "02",
"code_ref": "tests/check_task03_elf.sh:8",
"description": "Test ABI odrzuca atrapę bez pvPortMalloc, vPortFree i ucHeap.",
"evidence": "upstream symbols present"
},
{
"id": "fragmented-runtime",
"number": 3,
"label": "checkpoint pokazuje dwa wolne bloki",
"mode": "RUN",
"event_id": "E01",
"strategy_ref": "run.fragmented",
"svg_label": "03",
"code_ref": "src/tasks/task03_freertos_heap4.c:91",
"snapshot_ref": "task01.fragmented",
"description": "Neovim, GDB i pamięć zatrzymują się na tym samym stanie.",
"evidence": "blocks=2 and aligned=1"
},
{
"id": "memory",
"number": 4,
"label": "ucHeap ujawnia nagłówki i payload",
"mode": "CODE",
"strategy_ref": "code.heap4",
"svg_label": "04",
"code_ref": "src/tasks/task03_freertos_heap4.c:11",
"description": "Widok bajtów łączy diagram z realnym układem areny.",
"evidence": "aligned arena and in-band metadata"
},
{
"id": "final-runtime",
"number": 5,
"label": "checkpoint końcowy dowodzi odzyskania",
"mode": "RUN",
"event_id": "E02",
"strategy_ref": "run.coalesced",
"svg_label": "05",
"code_ref": "src/tasks/task03_freertos_heap4.c:111",
"snapshot_ref": "task01.coalesced",
"description": "Jedna ramka łączy stats, OOM, hook i PASS.",
"evidence": "final=initial, blocks=1, pass=1"
}
]
}
]
}
]
}
],
"learning": {
"model_label": "Model bloków heap_4",
"model": "Uczeń wyjaśnia nagłówek, wyrównanie, first-fit, split, adresową listę wolnych bloków i dwustronne coalescing.",
"replay_label": "Fragmentacja i odzyskanie areny",
"replay": "Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz minimum-ever.",
"criterion": "Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.",
"requirement": "Analiza i weryfikacja mechaniki dynamicznej alokacji heap_4 w FreeRTOS C na RV32I/Hazard3."
},
"task": {
"short_label": "mechanika heap_4",
"title": "Predict and prove reusable heap_4 blocks",
"prompt_tex": "Przewidź układ bloków po alloc A/B/C, następnie po free(A,C) i free(B). Odtwórz oba checkpointy i udowodnij, że arena została scalona bez utraty minimum-ever.",
"conclusion_tex": "heap\\_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem.",
"flow": [
{
"kind": "block",
"id": "predict",
"title": "A — przewidywanie",
"content_tex": "Przejdź przez model nagłówka, split i porządek adresowy przed uruchomieniem prawdziwego heap\\_4.",
"steps": [
{
"id": "size",
"title": "Policz rozmiar bloku.",
"content_tex": "Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu."
},
{
"id": "list",
"title": "Narysuj listę po free(A,C).",
"content_tex": "Zaznacz, dlaczego przydzielony B rozdziela dwa wolne obszary."
}
]
},
{
"kind": "block",
"id": "replay",
"title": "B — replay Hazard3",
"content_tex": "Powiąż diagram z dwoma deterministycznymi checkpointami.",
"steps": [
{
"id": "fragmented",
"title": "Sprawdź E01.",
"content_tex": "Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty."
},
{
"id": "coalesced",
"title": "Sprawdź E02.",
"content_tex": "Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM."
}
]
},
{
"kind": "exercise",
"id": "fragmentation",
"title": "Ćwiczenie — ta sama suma, inna użyteczność",
"prompt_tex": "Zaproponuj dwa układy wolnych bloków o tej samej sumie bajtów, ale tylko jeden zdolny obsłużyć wskazane duże żądanie. Uzasadnij odpowiedź przez largest-free-block.",
"evidence_tex": "Dwa diagramy listy, suma wolnych bajtów, rozmiar największego bloku i wynik pvPortMalloc.",
"criterion": "Uczeń nie utożsamia sumy wolnej pamięci z możliwością pojedynczego dużego przydziału.",
"based_on": [
"predict",
"replay"
]
}
]
}
}
+1
View File
File diff suppressed because one or more lines are too long
+61
View File
File diff suppressed because one or more lines are too long
+4038
View File
File diff suppressed because one or more lines are too long
+31
View File
@@ -0,0 +1,31 @@
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A1 CONTEXT — from linear cursor to reusable heap
rectangle "<<application>>\n01 A / B / C experiment\nrequests payload bytes" as APP
rectangle "<<public API>>\n02 pvPortMalloc / vPortFree\nheap statistics" as API
rectangle "<<allocator>>\n03 heap_4\nfirst-fit · split · coalesce" as H4
rectangle "<<arena>>\n04 ucHeap[4096]\nheaders + payload" as ARENA
rectangle "<<target>>\n05 Hazard3 / RV32I\nGDB · registers · memory" as TARGET
APP -down-> API : request / release
API -down-> H4 : direct C call
H4 -down-> ARENA : manages
ARENA -down-> TARGET : stored in RAM
note right of H4
heap_1: allocate only
heap_2: free, no coalesce
heap_3: libc wrapper
heap_4: free + coalesce
heap_5: multiple regions
end note
@enduml
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.3488px" preserveAspectRatio="none" style="width:311px;height:600px;" version="1.1" viewBox="0 0 311 600" width="311.19px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="227.6552" x="44.9803" y="9.813">A1 CONTEXT — from linear cursor to reusable heap</text><!--MD5=[cd187d11655e4367e900de538d2f1d0c]
entity APP--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="121.1713" x="15.6054" y="20.2686"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="58.7497" x="24.785" y="39.2613">«application»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="102.812" x="24.785" y="51.764">01 A / B / C experiment</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="102.812" x="24.785" y="64.2667">requests payload bytes</text><!--MD5=[645d8587175d8f7ad110cd370775931d]
entity API--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="141.3665" x="5.5078" y="144.9833"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="52.324" x="14.6874" y="163.976">«public API»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="123.0073" x="14.6874" y="176.4787">02 pvPortMalloc / vPortFree</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="65.1755" x="14.6874" y="188.9813">heap statistics</text><!--MD5=[46e692d45a0b60d87b097c4043ce42a2]
entity H4--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="122.0893" x="15.1464" y="277.6108"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="48.6521" x="24.3261" y="296.6035">«allocator»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="44.9803" x="24.3261" y="309.1062">03 heap_4</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="103.73" x="24.3261" y="321.6088">first-fit · split · coalesce</text><!--MD5=[a55d5013c595d66e4d3c908e0eed28a7]
entity ARENA--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="100.0581" x="26.162" y="410.2384"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="34.8827" x="35.3416" y="429.231">«arena»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="74.3551" x="35.3416" y="441.7337">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="81.6988" x="35.3416" y="454.2364">headers + payload</text><!--MD5=[aba7613092619c8a5fef3de1c87efe89]
entity TARGET--><rect fill="#EDF6FA" height="55.8673" style="stroke: #2C7794; stroke-width: 1.3769468762104042;" width="129.433" x="11.4746" y="534.953"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="36.7186" x="20.6542" y="553.9457">«target»</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="84.4527" x="20.6542" y="566.4484">05 Hazard3 / RV32I</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="111.0737" x="20.6542" y="578.951">GDB · registers · memory</text><path d="M169.3645,269.698 L169.3645,301.8726 L137.6029,305.5445 L169.3645,309.2164 L169.3645,341.391 A0,0 0 0 0 169.3645,341.391 L300.6334,341.391 A0,0 0 0 0 300.6334,341.391 L300.6334,278.8776 L291.4538,269.698 L169.3645,269.698 A0,0 0 0 0 169.3645,269.698 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.9179645841402695;"/><path d="M291.4538,269.698 L291.4538,278.8776 L300.6334,278.8776 L291.4538,269.698 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="93.6324" x="174.8723" y="284.1008">heap_1: allocate only</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="111.9917" x="174.8723" y="296.6035">heap_2: free, no coalesce</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="91.7965" x="174.8723" y="309.1062">heap_3: libc wrapper</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="103.73" x="174.8723" y="321.6088">heap_4: free + coalesce</text><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="109.2378" x="174.8723" y="334.1115">heap_5: multiple regions</text><!--MD5=[ec942d3abfeef98a0155e2f031d4c131]
link APP to API--><path d="M76.1911,76.393 C76.1911,94.8441 76.1911,119.3262 76.1911,138.8972 " fill="none" id="APP-&gt;API" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,143.4136,79.8629,135.1519,76.1911,138.8238,72.5192,135.1519,76.1911,143.4136" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="76.1911" x="77.109" y="114.4059">request / release</text><!--MD5=[798ded9ffd9ac635cdedeacba358c97c]
link API to H4--><path d="M76.1911,201.2545 C76.1911,221.6609 76.1911,249.6129 76.1911,271.3044 " fill="none" id="API-&gt;H4" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,275.8575,79.8629,267.5958,76.1911,271.2677,72.5192,267.5958,76.1911,275.8575" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="52.324" x="77.109" y="239.1206">direct C call</text><!--MD5=[26d2234bc3ca60bb174d49bba6317b2c]
link H4 to ARENA--><path d="M76.1911,333.8821 C76.1911,354.2884 76.1911,382.2404 76.1911,403.9319 " fill="none" id="H4-&gt;ARENA" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,408.485,79.8629,400.2234,76.1911,403.8952,72.5192,400.2234,76.1911,408.485" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="40.3904" x="77.109" y="379.661">manages</text><!--MD5=[057090cc36f41caea0c560281f72f0d5]
link ARENA to TARGET--><path d="M76.1911,466.3627 C76.1911,484.8138 76.1911,509.2959 76.1911,528.8669 " fill="none" id="ARENA-&gt;TARGET" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><polygon fill="#8095A1" points="76.1911,533.3833,79.8629,525.1216,76.1911,528.7935,72.5192,525.1216,76.1911,533.3833" style="stroke: #8095A1; stroke-width: 0.9179645841402695;"/><text fill="#000000" font-family="Monospace" font-size="9.1796" lengthAdjust="spacingAndGlyphs" textLength="61.5036" x="77.109" y="504.3756">stored in RAM</text><!--MD5=[5f927a6771e8d55dac04e3c75dd184e1]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A1 CONTEXT — from linear cursor to reusable heap
rectangle "<<application>>\n01 A / B / C experiment\nrequests payload bytes" as APP
rectangle "<<public API>>\n02 pvPortMalloc / vPortFree\nheap statistics" as API
rectangle "<<allocator>>\n03 heap_4\nfirst-fit · split · coalesce" as H4
rectangle "<<arena>>\n04 ucHeap[4096]\nheaders + payload" as ARENA
rectangle "<<target>>\n05 Hazard3 / RV32I\nGDB · registers · memory" as TARGET
APP -down-> API : request / release
API -down-> H4 : direct C call
H4 -down-> ARENA : manages
ARENA -down-> TARGET : stored in RAM
note right of H4
heap_1: allocate only
heap_2: free, no coalesce
heap_3: libc wrapper
heap_4: free + coalesce
heap_5: multiple regions
end note
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

+48
View File
@@ -0,0 +1,48 @@
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
}
HEADER *-- ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
class "04 Address-ordered free list" as LIST {
previous < inserted < current
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
note right of LIST
Ordering makes both physical
neighbours locally visible.
end note
@enduml
+71
View File
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="620.2921px" preserveAspectRatio="none" style="width:295px;height:620px;" version="1.1" viewBox="0 0 295 620" width="295.9262px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="202.1522" x="49.1929" y="8.2167">A2 STRUCTURE — in-band metadata and address order</text><!--MD5=[9827fb78ff6e3f59cfadf959dc26af7c]
class HEADER--><rect fill="#EDF6FA" height="54.7579" id="HEADER" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="81.4758" x="29.5926" y="16.4642"/><ellipse cx="39.5849" cy="27.2252" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.5698,29.7593 Q40.3055,29.8914 40.0173,29.9515 Q39.7291,30.0235 39.4048,30.0235 Q38.2758,30.0235 37.6753,29.2789 Q37.0869,28.5343 37.0869,27.1171 Q37.0869,25.6999 37.6753,24.9553 Q38.2758,24.2107 39.4048,24.2107 Q39.7291,24.2107 40.0173,24.2828 Q40.3175,24.3428 40.5698,24.4749 L40.5698,25.7119 Q40.2815,25.4477 40.0053,25.3276 Q39.7411,25.2075 39.4648,25.2075 Q38.8523,25.2075 38.5401,25.6879 Q38.2278,26.1683 38.2278,27.1171 Q38.2278,28.0659 38.5401,28.5463 Q38.8523,29.0267 39.4648,29.0267 Q39.7411,29.0267 40.0053,28.9066 Q40.2815,28.7865 40.5698,28.5223 L40.5698,29.7593 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="48.8086" y="30.2075">01 Block header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="37.9862" y2="37.9862"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="34.2045" y="49.2775">next : BlockLink_t*</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="42.2752" x="34.2045" y="59.7463">size : size_t</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="65.073" y2="65.073"/><!--MD5=[40d637119be40bcfdc4ce848efbdda9e]
class ALLOC--><rect fill="#EDF6FA" height="65.2267" id="ALLOC" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="128.8701"/><ellipse cx="39.6618" cy="139.631" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.6466,142.1652 Q40.3824,142.2973 40.0942,142.3573 Q39.8059,142.4294 39.4816,142.4294 Q38.3527,142.4294 37.7522,141.6848 Q37.1637,140.9401 37.1637,139.523 Q37.1637,138.1058 37.7522,137.3612 Q38.3527,136.6165 39.4816,136.6165 Q39.8059,136.6165 40.0942,136.6886 Q40.3944,136.7486 40.6466,136.8808 L40.6466,138.1178 Q40.3584,137.8536 40.0821,137.7335 Q39.8179,137.6134 39.5417,137.6134 Q38.9292,137.6134 38.6169,138.0938 Q38.3047,138.5742 38.3047,139.523 Q38.3047,140.4717 38.6169,140.9521 Q38.9292,141.4325 39.5417,141.4325 Q39.8179,141.4325 40.0821,141.3124 Q40.3584,141.1923 40.6466,140.9281 L40.6466,142.1652 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="56.1107" x="52.5749" y="142.6134">Allocated block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="150.392" y2="150.392"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="161.6833">02 header + 13 byte request</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="88.3935" x="17.6787" y="172.1522">aligned total = 32 bytes</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="104.535" x="17.6787" y="182.621">payload begins after header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="187.9477" y2="187.9477"/><!--MD5=[71c2adef9be32489055f250a531e7c6f]
class REM--><rect fill="#EDF6FA" height="54.7579" id="REM" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="89.9308" x="25.3651" y="251.7448"/><ellipse cx="35.3574" cy="262.5058" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M36.3422,265.0399 Q36.078,265.172 35.7898,265.232 Q35.5015,265.3041 35.1773,265.3041 Q34.0483,265.3041 33.4478,264.5595 Q32.8593,263.8148 32.8593,262.3977 Q32.8593,260.9805 33.4478,260.2359 Q34.0483,259.4913 35.1773,259.4913 Q35.5015,259.4913 35.7898,259.5633 Q36.09,259.6234 36.3422,259.7555 L36.3422,260.9925 Q36.054,260.7283 35.7778,260.6082 Q35.5135,260.4881 35.2373,260.4881 Q34.6248,260.4881 34.3125,260.9685 Q34.0003,261.4489 34.0003,262.3977 Q34.0003,263.3465 34.3125,263.8269 Q34.6248,264.3073 35.2373,264.3073 Q35.5135,264.3073 35.7778,264.1872 Q36.054,264.0671 36.3422,263.8028 L36.3422,265.0399 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="44.5811" y="265.4881">03 Free remainder</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="273.2667" y2="273.2667"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="43.8125" x="29.9769" y="284.558">own header</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="29.9769" y="295.0269">size = 224 bytes</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="300.3535" y2="300.3535"/><!--MD5=[b0a0edd67d9eafaaa5639bbe6382adce]
class LIST--><rect fill="#EDF6FA" height="44.289" id="LIST" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="124.5196" x="8.0707" y="364.1506"/><ellipse cx="18.063" cy="374.9116" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M19.0478,377.4457 Q18.7836,377.5778 18.4954,377.6379 Q18.2071,377.7099 17.8829,377.7099 Q16.7539,377.7099 16.1534,376.9653 Q15.565,376.2207 15.565,374.8035 Q15.565,373.3863 16.1534,372.6417 Q16.7539,371.8971 17.8829,371.8971 Q18.2071,371.8971 18.4954,371.9692 Q18.7956,372.0292 19.0478,372.1613 L19.0478,373.3983 Q18.7596,373.1341 18.4834,373.014 Q18.2192,372.8939 17.9429,372.8939 Q17.3304,372.8939 17.0182,373.3743 Q16.7059,373.8547 16.7059,374.8035 Q16.7059,375.7523 17.0182,376.2327 Q17.3304,376.7131 17.9429,376.7131 Q18.2192,376.7131 18.4834,376.593 Q18.7596,376.4729 19.0478,376.2087 L19.0478,377.4457 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="102.9977" x="27.2867" y="377.8939">04 Address-ordered free list</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="385.6726" y2="385.6726"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="107.6095" x="12.6826" y="396.9639">previous &lt; inserted &lt; current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="402.2905" y2="402.2905"/><!--MD5=[490fcd32b6546c9bc615869efabd094a]
class RIGHT--><rect fill="#EDF6FA" height="44.289" id="RIGHT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="466.0876"/><ellipse cx="33.0899" cy="476.8486" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M34.0748,479.3827 Q33.8105,479.5148 33.5223,479.5748 Q33.2341,479.6469 32.9098,479.6469 Q31.7808,479.6469 31.1803,478.9023 Q30.5919,478.1577 30.5919,476.7405 Q30.5919,475.3233 31.1803,474.5787 Q31.7808,473.8341 32.9098,473.8341 Q33.2341,473.8341 33.5223,473.9061 Q33.8225,473.9662 34.0748,474.0983 L34.0748,475.3353 Q33.7865,475.0711 33.5103,474.951 Q33.2461,474.8309 32.9698,474.8309 Q32.3573,474.8309 32.0451,475.3113 Q31.7328,475.7917 31.7328,476.7405 Q31.7328,477.6893 32.0451,478.1697 Q32.3573,478.6501 32.9698,478.6501 Q33.2461,478.6501 33.5103,478.53 Q33.7865,478.4099 34.0748,478.1457 L34.0748,479.3827 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="44.5427" y="479.8309">05 Right neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="487.6095" y2="487.6095"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="498.9008">block + block.size == current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="504.2275" y2="504.2275"/><!--MD5=[007d3a1820cefd008c8dbdad7e6fdec6]
class LEFT--><rect fill="#EDF6FA" height="44.289" id="LEFT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="131.4374" x="4.6118" y="568.0246"/><ellipse cx="34.7809" cy="578.7855" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M35.7658,581.3197 Q35.5015,581.4518 35.2133,581.5118 Q34.9251,581.5839 34.6008,581.5839 Q33.4718,581.5839 32.8713,580.8393 Q32.2829,580.0946 32.2829,578.6775 Q32.2829,577.2603 32.8713,576.5157 Q33.4718,575.771 34.6008,575.771 Q34.9251,575.771 35.2133,575.8431 Q35.5135,575.9032 35.7658,576.0353 L35.7658,577.2723 Q35.4775,577.0081 35.2013,576.888 Q34.9371,576.7679 34.6608,576.7679 Q34.0483,576.7679 33.7361,577.2483 Q33.4238,577.7287 33.4238,578.6775 Q33.4238,579.6262 33.7361,580.1066 Q34.0483,580.587 34.6608,580.587 Q34.9371,580.587 35.2013,580.4669 Q35.4775,580.3468 35.7658,580.0826 L35.7658,581.3197 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="48.2321" y="581.7679">06 Left neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="589.5465" y2="589.5465"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="122.2137" x="9.2237" y="600.8378">previous + previous.size == block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="606.1645" y2="606.1645"/><path d="M159.877,371.9831 L159.877,383.2206 L132.7671,386.2952 L159.877,389.3697 L159.877,400.6072 A0,0 0 0 0 159.877,400.6072 L286.7025,400.6072 A0,0 0 0 0 286.7025,400.6072 L286.7025,379.6695 L279.0161,371.9831 L159.877,371.9831 A0,0 0 0 0 159.877,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><path d="M279.0161,371.9831 L279.0161,379.6695 L286.7025,379.6695 L279.0161,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="110.6841" x="164.4889" y="384.043">Ordering makes both physical</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="96.0799" x="164.4889" y="394.5119">neighbours locally visible.</text><!--MD5=[fc2657b7de304bb41a5d36ac60748945]
reverse link HEADER to ALLOC--><path d="M70.3305,82.6749 C70.3305,97.5173 70.3305,114.3505 70.3305,128.5626 " fill="none" id="HEADER&lt;-ALLOC" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,72.7056,67.256,77.3174,70.3305,81.9293,73.4051,77.3174,70.3305,72.7056" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="71.0992" y="103.2667">precedes payload</text><!--MD5=[bb73b5a7e21afff1a1d0c43dcbd5d11a]
link ALLOC to REM--><path d="M70.3305,194.2813 C70.3305,210.5842 70.3305,230.3382 70.3305,246.6026 " fill="none" id="ALLOC-&gt;REM" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,250.3689,73.4051,243.4512,70.3305,246.5257,67.256,243.4512,70.3305,250.3689" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="71.0992" y="226.1414">split preserves 256</text><!--MD5=[32aec76f28e14f88b0d74d9f592c80fb]
link REM to LIST--><path d="M70.3305,306.8178 C70.3305,322.8901 70.3305,343.1975 70.3305,359.1622 " fill="none" id="REM-&gt;LIST" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,362.8055,73.4051,355.8878,70.3305,358.9623,67.256,355.8878,70.3305,362.8055" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="63.7971" x="71.0992" y="338.5473">insert by address</text><!--MD5=[6bd3103bbaa36e7d502940b82c286473]
link LIST to RIGHT--><path d="M70.3305,408.6011 C70.3305,423.9508 70.3305,444.681 70.3305,461.0377 " fill="none" id="LIST-&gt;RIGHT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,464.7963,73.4051,457.8786,70.3305,460.9531,67.256,457.8786,70.3305,464.7963" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="30.7456" x="71.0992" y="440.4842">join first</text><!--MD5=[f41c07ebada6943a8deaf240fd528885]
link RIGHT to LEFT--><path d="M70.3305,510.538 C70.3305,525.8878 70.3305,546.618 70.3305,562.9746 " fill="none" id="RIGHT-&gt;LEFT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,566.7333,73.4051,559.8155,70.3305,562.8901,67.256,559.8155,70.3305,566.7333" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="47.6557" x="71.0992" y="542.4212">then join left</text><!--MD5=[83344144544ae5f259c61315a4ceaf0d]
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
}
HEADER *- - ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
class "04 Address-ordered free list" as LIST {
previous < inserted < current
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
note right of LIST
Ordering makes both physical
neighbours locally visible.
end note
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 15 KiB

+29
View File
@@ -0,0 +1,29 @@
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S7 -left-> S8 : oversized request
@enduml
+56
View File
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="263.7004px" preserveAspectRatio="none" style="width:811px;height:263px;" version="1.1" viewBox="0 0 811 263" width="811.5712px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="231.1894" x="294.4053" y="11.5848">A5 FLOW — allocate, fragment, coalesce, verify</text><!--MD5=[d0cae5ff9305becd6f502d4fe4f41481]
entity S1--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="108.37" x="7.2247" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="45.7562" x="19.2658" y="55.942">01 RESET</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="19.2658" y="70.7021">initial free = 4080</text><!--MD5=[d3395af3100fe8cebf35265100c4415f]
entity S2--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="104.7577" x="224.5668" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="236.6079" y="48.5608">02 ALLOC A</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="80.6755" x="236.6079" y="63.3209">24 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="63.8179" x="236.6079" y="78.081">first-fit + split</text><!--MD5=[6c7192638421eaf134d201765ac5db29]
entity S3--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="127.6358" x="450.3377" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="74.6549" x="462.3789" y="48.5608">03 ALLOC B / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="103.5536" x="462.3789" y="63.3209">40 + 16 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="462.3789" y="78.081">after = 3952</text><!--MD5=[01b905ebe31ca24275b86a9951c478d0]
entity S4--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="671.2922" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="683.3333" y="55.942">04 FREE A / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="683.3333" y="70.7021">B remains allocated</text><!--MD5=[099bd2cf1f4f3a6dbf2f1fde6174f38e]
entity S5--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="132.4523" x="665.8737" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="108.37" x="677.9148" y="206.0345">05 E01 FRAGMENTED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="62.6138" x="677.9148" y="220.7946">2 free blocks</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="677.9148" y="235.5547">current &gt; largest</text><!--MD5=[0656c7721b015b9ca8cf2e2c2e8f5aee]
entity S6--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="111.9824" x="465.3891" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="477.4302" y="206.0345">06 FREE B</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="87.9001" x="477.4302" y="220.7946">insert by address</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="72.2467" x="477.4302" y="235.5547">join right + left</text><!--MD5=[6ba532df225878998c5769132c3837e2]
entity S7--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="258.2819" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="270.3231" y="206.0345">07 E02 COALESCED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="57.7974" x="270.3231" y="220.7946">1 free block</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="270.3231" y="235.5547">final = initial</text><!--MD5=[ce611cd767df6ac8a45071985dabb378]
entity S8--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="115.5947" x="8.4288" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="79.4714" x="20.4699" y="206.0345">08 OOM CHECK</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="73.4508" x="20.4699" y="220.7946">NULL · hook=1</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="91.5125" x="20.4699" y="235.5547">asserts=0 · PASS=1</text><!--MD5=[15cb110786dd224ca6a510a3d2a24e20]
link S1 to S2--><path d="M115.7994,59.1196 C146.5043,59.1196 184.9515,59.1196 216.5956,59.1196 " fill="none" id="S1-&gt;S2" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="222.2429,59.1196,211.4059,54.3031,216.2223,59.1196,211.4059,63.936,222.2429,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="137.5698" y="51.4386">pvPortMalloc</text><!--MD5=[8eac89d31ced3c9003fbd6a8a005c745]
link S2 to S3--><path d="M329.5894,59.1196 C362.7266,59.1196 405.9181,59.1196 442.1979,59.1196 " fill="none" id="S2-&gt;S3" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="448.0018,59.1196,437.1648,54.3031,441.9812,59.1196,437.1648,63.936,448.0018,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="77.0631" x="351.2996" y="51.4386">split remainder</text><!--MD5=[82e284a09e4ebade00512bdc77bff32c]
link S3 to S4--><path d="M578.3709,59.1196 C605.1142,59.1196 636.2044,59.1196 663.4053,59.1196 " fill="none" id="S3-&gt;S4" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="669.1369,59.1196,658.2999,54.3031,663.1163,59.1196,658.2999,63.936,669.1369,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="599.9486" y="51.4386">vPortFree</text><!--MD5=[0e6b031b378ab8978eaa734a548bdfb6]
link S4 to S5--><path d="M732.0999,86.2723 C732.0999,110.3906 732.0999,146.6826 732.0999,174.6541 " fill="none" id="S4-&gt;S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="732.0999,180.494,736.9163,169.657,732.0999,174.4735,727.2834,169.657,732.0999,180.494" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="51.7768" x="733.304" y="142.2166">heap stats</text><!--MD5=[3c9aaad44b43c509ca535c241fdd0151]
reverse link S6 to S5--><path d="M585.5595,216.5812 C610.8338,216.5812 639.8529,216.5812 665.368,216.5812 " fill="none" id="S6&lt;-S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="579.6714,216.5812,590.5084,221.3977,585.6919,216.5812,590.5084,211.7648,579.6714,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="44.5521" x="599.3465" y="208.9003">continue</text><!--MD5=[5f6ea4567bb0950bff1d27387d49b4c2]
reverse link S7 to S6--><path d="M388.0009,216.5812 C413.0223,216.5812 440.9938,216.5812 464.8352,216.5812 " fill="none" id="S7&lt;-S6" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="382.1489,216.5812,392.9996,221.3667,388.1694,216.564,392.9721,211.7339,382.1489,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="40.9398" x="402.1733" y="208.9003">coalesce</text><!--MD5=[630b9631f886cf9c8b0d992525b86cf3]
reverse link S8 to S7--><path d="M132.1994,216.5812 C171.0802,216.5812 219.9551,216.5812 257.9689,216.5812 " fill="none" id="S8&lt;-S7" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="126.3836,216.5812,137.2206,221.3977,132.4041,216.5812,137.2206,211.7648,126.3836,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="90.3084" x="145.9985" y="208.9003">oversized request</text><!--MD5=[2e2dc33d46c2ffc454d35cea5ea70934]
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S7 -left-> S8 : oversized request
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 11 KiB

+29
View File
@@ -0,0 +1,29 @@
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
[*] --> Free : 01 one list node
Free --> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated --> Fragmented : free A and C
Fragmented : 03 two free blocks
Fragmented : sum free > largest block
Fragmented --> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced --> OOMChecked : request > arena
OOMChecked : NULL + hook once
OOMChecked --> [*]
state "05 minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
+50
View File
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.2823px" preserveAspectRatio="none" style="width:346px;height:600px;" version="1.1" viewBox="0 0 346 600" width="346.9454px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="154.5281" x="99.1803" y="7.9418">A6 STATE — block state and heap statistics</text><ellipse cx="212.8476" cy="23.6993" fill="#000000" rx="7.4292" ry="7.4292" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="37.1462" x="194.2745" y="86.8478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="194.2745" x2="231.4207" y1="104.3956" y2="104.3956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="15.6014" x="205.0469" y="98.5042">Free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="48.29" x="188.7026" y="190.1142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="188.7026" x2="236.9926" y1="207.662" y2="207.662"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="33.4316" x="196.1318" y="201.7706">Allocated</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="101.0376" x="111.0671" y="282.9796"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="111.0671" x2="212.1047" y1="300.5275" y2="300.5275"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="140.0411" y="294.6361">Fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="65.3773" x="114.7817" y="312.1839">03 two free blocks</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="86.1791" x="114.7817" y="322.3025">sum free &gt; largest block</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="103.2664" x="4.4575" y="394.3142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="4.4575" x2="107.7239" y1="411.862" y2="411.862"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="36.4033" x="37.8891" y="405.9706">Coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="61.6627" x="8.1722" y="423.5185">04 one free block</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="88.4079" x="8.1722" y="433.6371">current free = initial free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="78.7499" x="16.7158" y="495.2478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="16.7158" x2="95.4657" y1="512.7956" y2="512.7956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="48.29" x="31.9457" y="506.9042">OOMChecked</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="63.8914" x="20.4304" y="524.4521">NULL + hook once</text><ellipse cx="56.0907" cy="585.1415" fill="none" rx="7.4292" ry="7.4292" style="stroke: #000000; stroke-width: 0.742923663722561;"/><ellipse cx="56.4622" cy="585.513" fill="#000000" rx="4.4575" ry="4.4575" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="77.2641" x="190.5599" y="398.3482"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="190.5599" x2="267.824" y1="415.8961" y2="415.8961"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="62.4056" x="197.9892" y="410.0047">05 minimum-ever</text><!--MD5=[f16808fa220dde377303612249059854]
link *start to Free--><path d="M212.8476,31.2845 C212.8476,42.3689 212.8476,64.7384 212.8476,81.885 " fill="none" id="*start-&gt;Free" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,85.4436,215.8193,78.7573,212.8476,81.729,209.8759,78.7573,212.8476,85.4436" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.948" x="213.5906" y="62.101">01 one list node</text><!--MD5=[19abaf48dc778410378e95e0d1bca006]
link Free to Allocated--><path d="M212.8476,124.358 C212.8476,141.3635 212.8476,166.8235 212.8476,185.1663 " fill="none" id="Free-&gt;Allocated" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,188.7843,215.8193,182.098,212.8476,185.0697,209.8759,182.098,212.8476,188.7843" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="59.4339" x="224.3629" y="154.9664">02 first-fit + split</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="80.9787" x="213.5906" y="165.085">current free decreases</text><!--MD5=[f6fa3e1917b73de38ea03346a6903b17]
link Allocated to Fragmented--><path d="M203.0856,227.6021 C195.3518,241.9925 184.4382,262.304 175.746,278.4849 " fill="none" id="Allocated-&gt;Fragmented" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="174.0076,281.7241,179.7784,277.2257,175.7573,278.4473,174.5357,274.4262,174.0076,281.7241" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="191.028" y="258.2328">free A and C</text><!--MD5=[c73bca393b062d6a86dff80fa900c78c]
link Fragmented to Coalesced--><path d="M110.7031,318.744 C93.6455,325.4006 76.1571,335.4523 65.0058,350.4817 C56.8188,361.5141 54.33,376.536 54.0031,389.4331 " fill="none" id="Fragmented-&gt;Coalesced" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="53.9808,392.9546,56.9907,386.2854,54.0021,389.24,51.0474,386.2514,53.9808,392.9546" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="21.5448" x="110.6956" y="359.1664">free B</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="111.4385" x="65.7487" y="369.285">address-order joins neighbours</text><!--MD5=[2b306524d92469efb3bb270d490680cf]
link Coalesced to OOMChecked--><path d="M56.0907,439.7959 C56.0907,454.8922 56.0907,474.8471 56.0907,490.1216 " fill="none" id="Coalesced-&gt;OOMChecked" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,493.7842,59.0624,487.0979,56.0907,490.0696,53.119,487.0979,56.0907,493.7842" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.2051" x="56.8337" y="470.501">request &gt; arena</text><!--MD5=[6b8be85e17f6174335a5329fe1414850]
link OOMChecked to *end--><path d="M56.0907,532.55 C56.0907,545.306 56.0907,562.0366 56.0907,573.0022 " fill="none" id="OOMChecked-&gt;*end" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,576.4716,59.0624,569.7853,56.0907,572.757,53.119,569.7853,56.0907,576.4716" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><!--MD5=[b09143a670c8c67aa163b99fca5c6b6b]
link Allocated to MIN--><path d="M228.8056,227.6169 C233.6049,234.1101 238.3299,241.7622 241.0787,249.548 C259.2432,300.9509 258.5449,318.5879 247.765,372.0264 C246.2941,379.3145 243.5824,386.8998 240.685,393.6827 " fill="none" id="Allocated-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="239.214,396.9813,244.6551,392.0892,240.7295,393.5899,239.2288,389.6643,239.214,396.9813" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="82.4645" x="256.1378" y="308.6996">records low watermark</text><!--MD5=[1fa23b8554d20d5dd3f2f8930c0e2df3]
link Fragmented to MIN--><path d="M172.2766,328.3871 C178.8143,341.366 187.6105,357.9332 196.5033,372.0264 C201.2283,379.5151 206.8225,387.3752 212.0378,394.3513 " fill="none" id="Fragmented-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="214.2072,397.2338,212.5727,390.1018,211.9784,394.2621,207.818,393.6678,214.2072,397.2338" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="46.8042" x="197.2462" y="364.3669">does not rise</text><!--MD5=[87522a40b34d64237ec6603d41372cd8]
link Coalesced to MIN--><path d="M108.0285,416.9213 C132.7679,416.9213 162.0242,416.9213 185.5972,416.9213 " fill="none" id="Coalesced-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="189.1038,416.9213,182.4175,413.9496,185.3892,416.9213,182.4175,419.893,189.1038,416.9213" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="55.7193" x="121.2823" y="412.2335">history remains</text><!--MD5=[994b73c618d067de5faae1a7c19b4f86]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
[*] - -> Free : 01 one list node
Free - -> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated - -> Fragmented : free A and C
Fragmented : 03 two free blocks
Fragmented : sum free > largest block
Fragmented - -> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced - -> OOMChecked : request > arena
OOMChecked : NULL + hook once
OOMChecked - -> [*]
state "05 minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 11 KiB

+23
View File
@@ -0,0 +1,23 @@
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC --> ELF : compile + link
ELF --> E1 : reset / load / replay
E1 --> MEM : inspect bytes
MEM --> E2 : continue
@enduml
+44
View File
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="82.7447px" preserveAspectRatio="none" style="width:814px;height:82px;" version="1.1" viewBox="0 0 814 82" width="814.2079px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="190.3128" x="314.8436" y="7.9609">A7 RUNTIME — one artifact, two checkpoints, one proof</text><!--MD5=[183d75e42a7a852d02a7f9ce2cc3343f]
entity SRC--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="78.6075" x="4.9647" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="31.443" x="13.2392" y="38.0453">«source»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="38.89" x="13.2392" y="48.1882">01 task03 C</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="62.0585" x="13.2392" y="58.3311">A/B/C experiment</text><!--MD5=[4a7b087cd571ae358eb895b9dc7ce0ed]
entity ELF--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="71.9879" x="181.2109" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="32.2704" x="189.4854" y="38.0453">«artifact»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="51.3017" x="189.4854" y="48.1882">02 ELF + image</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="55.439" x="189.4854" y="58.3311">heap_4 symbols</text><!--MD5=[45565a74ca8123df0b8413ce5340d40a]
entity E1--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="86.0545" x="370.6963" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="378.9707" y="38.0453">«checkpoint E01»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="52.1292" x="378.9707" y="48.1882">03 fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="69.5055" x="378.9707" y="58.3311">blocks=2 · aligned=1</text><!--MD5=[5ceda9279414f57783e95166b8d927b7]
entity MEM--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="81.0898" x="553.5621" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="37.2351" x="561.8365" y="38.0453">«memory»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="58.7487" x="561.8365" y="48.1882">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="64.5409" x="561.8365" y="58.3311">headers + payload</text><!--MD5=[a3c437a7ee715155cf6a0fec80d7cbaf]
entity E2--><rect fill="#EDF6FA" height="57.1206" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="88.5368" x="716.5691" y="16.7377"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="724.8436" y="32.9731">«checkpoint E02»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="43.0272" x="724.8436" y="43.116">05 coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="71.9879" x="724.8436" y="53.2589">final=initial · blocks=1</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="57.0938" x="724.8436" y="63.4018">OOM=1 · PASS=1</text><!--MD5=[2e73c4d4efa4a7715d66b06010e70f85]
link SRC to ELF--><path d="M83.961,45.2929 C111.3744,45.2929 148.0054,45.2929 175.7911,45.2929 " fill="none" id="SRC-&gt;ELF" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="179.6222,45.2929,172.1752,41.9831,175.485,45.2929,172.1752,48.6027,179.6222,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="46.337" x="109.223" y="42.497">compile + link</text><!--MD5=[98439561a91d683361f6e8599ebb304f]
link ELF to E1--><path d="M253.5463,45.2929 C284.8735,45.2929 330.7719,45.2929 365.2765,45.2929 " fill="none" id="ELF-&gt;E1" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="369.2482,45.2929,361.8012,41.9831,365.111,45.2929,361.8012,48.6027,369.2482,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="66.1958" x="278.8496" y="42.497">reset / load / replay</text><!--MD5=[14b84038a04448f34eb55bd119f2d935]
link E1 to MEM--><path d="M457.1314,45.2929 C484.5447,45.2929 520.1332,45.2929 548.0513,45.2929 " fill="none" id="E1-&gt;MEM" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="551.9154,45.2929,544.4684,41.9831,547.7782,45.2929,544.4684,48.6027,551.9154,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="45.5096" x="482.4016" y="42.497">inspect bytes</text><!--MD5=[28f0a5a321106494a7afb95cbc1e35b0]
link MEM to E2--><path d="M634.8918,45.2929 C657.8783,45.2929 686.93,45.2929 711.2486,45.2929 " fill="none" id="MEM-&gt;E2" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="715.1128,45.2929,707.6658,41.9831,710.9756,45.2929,707.6658,48.6027,715.1128,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="30.6155" x="660.3027" y="42.497">continue</text><!--MD5=[bc1681809f0cb7bb82cdf81f0385b8f2]
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC - -> ELF : compile + link
ELF - -> E1 : reset / load / replay
E1 - -> MEM : inspect bytes
MEM - -> E2 : continue
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Java Version: 25.0.4-ea+4-1-Debian
Operating System: Linux
Default Encoding: UTF-8
Language: en
Country: null
--></g></svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

+15
View File
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="card-renderer" content="react">
<title>Karta pracy</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="app.css">
</head>
<body class="resource-header-enabled">
<div id="root"></div>
<script type="module" src="app.js"></script>
</body>
</html>
+39
View File
File diff suppressed because one or more lines are too long