|
|
1.1 root 1:
2: HATARI MEMORY USAGE
3:
4: Here are some stats on Hatari 0.81 memory usage (on Linux) and what
5: could be done to decrease it for embedded devices.
6:
7:
8: First the binary size from "size ./hatari":
9: text data bss dec
10: 1382406 10712 18255264 19648382
11:
12: I.e. the binary size is 1.3MB, it has 10KB of pre-defined arrays and
13: 18MB of non-initialized fixed size arrays. The names of the arrays
14: are listed at the bottom, but STRam is the one taking 16MB.
15:
16: Happily Hatari doesn't dirty (zero) all of STRam, just first 4MB
17: (accessible as ST ram) and 2MB at the top (used as IO-memory,
18: TOS and cartridge memory). In next Hatari version Hatari will
19: zero only part of the ST ram that user has configured
20: (e.g. 0.5MB instead of 4MB -> 3.5MB private memory save).
21:
22:
23: When I profiled Hatari with Valgrind (valgrind.kde.org) Massif plugin,
24: it tells that Hatari malloc()s about 3MB of memory. The allocations
25: and how to make them smaller for embedded devices (no generic way
26: unfortunately) are:
27:
28: * In includes/vdi.h set MAX_VDI_WIDTH and MAX_VDI_HEIGHT from 1024 and
29: 768 to 640 and 400 respectively. This decrease memory usage from 1.5MB
30: to 0.5MB (btw. for page flipping Allocation 2*2 framebuffers).
31: - Change list of VDI modes in Hatari dialog accordingly
32:
33: * Do not load bigfont in gui-sdl/sdlgui.c, especially if the device
34: screen is smaller than VGA. Both fonts together take about 1/3 MB.
35:
36: * Change uncompressed file read to use mmap() instead, currently
37: memory is allocated for the whole disk image before reading it.
38: - With normal DD floppy image Hatari would use that amount which
39: might be acceptable, but with e.g. 2MB disk needed for running
40: Wolf3D v0.8, mmap() sounds much better
41: - For compressed disk images memory needs to be allocated for
42: uncompressed image data, i.e. there we cannot save memory.
43:
44: * Check whether the m86k instruction table could be made smaller:
45: #include "uae-cpu/readcpu.h"
46: printf("%d -> %d\n", sizeof(struct instr), sizeof(struct instr) * 65536);
47: On x86 it's slightly over 1MB.
48:
49: You can also Massif Hatari yourself, its allocation calltrees
50: are very short, so it's easy to find these from the produced
51: PostScript graph and txt/html calltree listing.
52:
53:
54: From /proc/sysvipc/shm one can see how much shared memory Hatari/libSDL
55: has allocated and that it shares it with the X server:
56: - >100KB in lowrez
57: - ~200KB in lowrez with borders
58: - ~500KB in monochrome or zoomed lowrez
59: - >800KB in zoomed lowrez with borders
60: I don't think these could be made smaller from the code. Besides
61: user can just use a the smaller Hatari screen mode.
62:
63: According to Xrestop, Hatari doesn't keep any Pixmap resources
64: at the X server side.
65:
66:
67: Finally when looking at the Hatari process with "pmap", you can
68: see that the binaries Hatari links don't use so much private
69: (writable) memory:
70: map <Hatari PID>|grep /|grep w
71:
72: Rest of the 30MB Hatari VMSIZE you see in "top" (about 10MB), goes to
73: shared library code (their .text sections with "r-x" rights) Hatari
74: links. That is memory mapped read-only / read in on-demand / pagable
75: back to disk so it's not so much of a problem.
76:
77:
78: Unmodified Hatari runs on (Linux) systems having about 20MB of free
79: memory (e.g. according to /proc/meminfo free+buffers+cached fields).
80: Using low-rez without borders nor zooming, setting emulated ST memory
81: amount to <=1MB, limiting the VDI screen size and removing bigfont
82: (discussed with Massif findings above) should enable running Hatari
83: well on a system with only 10MB free memory, if it's otherwise fast
84: enough.
85:
86:
87: - Eero Tamminen
88:
89: To see the objects in the binary BSS section, get the datadump script
90: from here:
91: http://live.gnome.org/MemoryReduction_2fTools
92:
93: Compile Hatari without stripping, and use:
94: datadump.py -n -s .bss ./hatari
95:
96: As a result you see these array variables (larger ones):
97: 16777216 STRam hatari
98: 321536 CyclePalettes hatari
99: 262144 mem_banks hatari
100: 262144 cpufunctbl hatari
101: 131072 pInterceptWriteTable hatari
102: 131072 pInterceptReadTable hatari
103: 69632 InternalDTAs hatari
104: 65536 EnvelopeShapeValues hatari
105: 53588 DialogParams hatari
106: 53588 ConfigureParams hatari
107: 19976 FrameBuffers hatari
108: 16384 ST2RGB hatari
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.