looking more into the memory allocation debug, there is a lot more dynamic allocation (obviously) when loading the elf program than when loading the same program as built-in.. So, seems the problem is due to a high heap fragmentation, what explains that a call to dmesg can also make the system crash.. So, maybe my question should be, is increasing the heap a solution for that? If yes, how do I increase it? BR, Florian prints of debug output with my comments: calling the Elf program (Neo_Ledtest): PID PRI POLICY TYPE NPX STATE EVENT SIGMASK STACK COMMAND 0 0 FIFO Kthread N-- Ready 00000000 000000 Idle Task 1 224 FIFO Kthread --- Waiting Signal 00000000 002028 hpwork 2 100 FIFO Task --- Running 00000000 002028 init 3 80 RR pthread --- Waiting Semaphore 00000000 001564 netinit 0x0 4 100 FIFO Task --- Waiting Semaphore 00000000 002004 Telnet daemon0 6 100 FIFO Task --- Waiting Semaphore 00000000 006116 Neo_Ledtest nsh> cat /proc/6/stack StackBase: 0x0x200214b0 StackSize: 6116 StackEnd = 0x200214b0 - 6116d = 0x2001FCCC nsh> dmesg //called right after calling the elf program, after flushing the syslog.. mm_free: Freeing 0x2001d010 mm_malloc: Allocated 0x2000cbd0, size 64 mm_malloc: Allocated 0x20009710, size 32 mm_malloc: Allocated 0x2000cc10, size 48 mm_malloc: Allocated 0x2001d010, size 48 mm_malloc: Allocated 0x2001d040, size 528 mm_malloc: Allocated 0x2001d250, size 448 mm_malloc: Allocated 0x2001d410, size 6624 mm_malloc: Allocated 0x2001edf0, size 528 mm_malloc: Allocated 0x2001f000, size 2064 mm_malloc: Allocated 0x2001f810, size 48 mm_malloc: Allocated 0x2001f840, size 48 mm_malloc: Allocated 0x2001f870, size 48 mm_malloc: Allocated 0x2001f8a0, size 48 mm_malloc: Allocated 0x2001f8d0, size 48 mm_malloc: Allocated 0x2001f900, size 48 mm_malloc: Allocated 0x2001f930, size 48 mm_malloc: Allocated 0x2001f960, size 48 mm_malloc: Allocated 0x2001f990, size 48 mm_malloc: Allocated 0x2001f9c0, size 48 mm_malloc: Allocated 0x2001f9f0, size 48 mm_malloc: Allocated 0x2001fa20, size 48 mm_malloc: Allocated 0x2001fa50, size 48 mm_malloc: Allocated 0x2001fa80, size 48 mm_malloc: Allocated 0x2001fab0, size 48 mm_malloc: Allocated 0x2001fae0, size 48 mm_malloc: Allocated 0x2001fb10, size 48 mm_malloc: Allocated 0x2001fb40, size 48 mm_malloc: Allocated 0x2001fb70, size 48 mm_malloc: Allocated 0x2001fba0, size 48 mm_malloc: Allocated 0x2001fbd0, size 48 mm_malloc: Allocated 0x2001fc00, size 48 mm_malloc: Allocated 0x2001fc30, size 48 mm_malloc: Allocated 0x2001fc60, size 48 mm_malloc: Allocated 0x2001fc90, size 48 mm_malloc: Allocated 0x2001fcc0, size 48 mm_malloc: Allocated 0x2001fcf0, size 48 mm_malloc: Allocated 0x2001fd20, size 48 mm_malloc: Allocated 0x2001fd50, size 48 mm_malloc: Allocated 0x2001fd80, size 48 mm_malloc: Allocated 0x2001fdb0, size 48 mm_malloc: Allocated 0x2001fde0, size 48 mm_malloc: Allocated 0x2001fe10, size 48 mm_malloc: Allocated 0x2001fe40, size 48 mm_malloc: Allocated 0x2001fe70, size 48 mm_malloc: Allocated 0x2001fea0, size 48 mm_malloc: Allocated 0x2001fed0, size 48 mm_malloc: Allocated 0x2001ff00, size 48 mm_malloc: Allocated 0x2001ff30, size 48 mm_malloc: Allocated 0x2001ff60, size 48 mm_malloc: Allocated 0x2001ff90, size 48 mm_malloc: Allocated 0x2001ffc0, size 48 mm_malloc: Allocated 0x2001fff0, size 48 mm_malloc: Allocated 0x20020020, size 48 mm_free: Freeing 0x2001f000 mm_free: Freeing 0x2001f930 mm_free: Freeing 0x2001fd50 mm_free: Freeing 0x2001fa50 mm_free: Freeing 0x20020020 mm_free: Freeing 0x2001fff0 mm_free: Freeing 0x2001f840 mm_free: Freeing 0x2001f9c0 mm_free: Freeing 0x2001ffc0 mm_free: Freeing 0x2001ff90 mm_free: Freeing 0x2001fab0 mm_free: Freeing 0x2001fa80 mm_free: Freeing 0x2001fed0 mm_free: Freeing 0x2001fd20 mm_free: Freeing 0x2001fe70 mm_free: Freeing 0x2001fe40 mm_free: Freeing 0x2001ff30 mm_free: Freeing 0x2001ff60 mm_free: Freeing 0x2001fea0 mm_free: Freeing 0x2001ff00 mm_free: Freeing 0x2001fba0 mm_free: Freeing 0x2001fb40 mm_free: Freeing 0x2001fae0 mm_free: Freeing 0x2001fe10 mm_free: Freeing 0x2001fcf0 mm_free: Freeing 0x2001fb10 mm_free: Freeing 0x2001fde0 mm_free: Freeing 0x2001fdb0 mm_free: Freeing 0x2001fd80 mm_free: Freeing 0x2001fa20 mm_free: Freeing 0x2001fcc0 mm_free: Freeing 0x2001fc90 mm_free: Freeing 0x2001fc60 mm_free: Freeing 0x2001fc30 mm_free: Freeing 0x2001fc00 mm_free: Freeing 0x2001fbd0 mm_free: Freeing 0x2001fb70 mm_free: Freeing 0x2001f9f0 mm_free: Freeing 0x2001f990 mm_free: Freeing 0x2001f960 mm_free: Freeing 0x2001f900 mm_free: Freeing 0x2001f8d0 mm_free: Freeing 0x2001f8a0 mm_free: Freeing 0x2001f870 mm_free: Freeing 0x2001f810 mm_free: Freeing 0x2001d250 mm_free: Freeing 0x2001edf0 mm_free: Freeing 0x2001d040 mm_free: Freeing 0x2001d010 mm_free: Freeing 0x2000cc10 mm_free: Freeing 0x20009710 mm_malloc: Allocated 0x2001d010, size 256 mm_malloc: Allocated 0x2001edf0, size 2064 mm_malloc: Allocated 0x2001f600, size 832 mm_malloc: Allocated 0x2000cc10, size 64 mm_malloc: Allocated 0x2001d110, size 80 mm_malloc: Allocated 0x2001d160, size 80 mm_malloc: Allocated 0x2001d1b0, size 80 mm_malloc: Allocated 0x2001d200, size 256 mm_malloc: Allocated 0x2001f940, size 832 mm_malloc: Allocated 0x2001d300, size 64 mm_malloc: Allocated 0x2001d340, size 80 mm_malloc: Allocated 0x2001d390, size 80 mm_malloc: Allocated 0x2001fc80, size 80 mm_malloc: Allocated 0x2001fcd0, size 6160 //here allocating my (ELF) tasks stack, just befor my stack-end 0x2001FCCC mm_malloc: Allocated 0x20009710, size 32 mm_free: Freeing 0x2001d110 mm_free: Freeing 0x2001d160 mm_free: Freeing 0x2001d1b0 mm_free: Freeing 0x2000cc10 mm_free: Freeing 0x2001d410 mm_free: Freeing 0x2000cbd0 mm_free: Freeing 0x2001edf0 mm_free: Freeing 0x2001d010 mm_free: Freeing 0x2001f600 mm_free: Freeing 0x20009710 mm_malloc: Allocated 0x2001d3e0, size 1008 //here allocating 1K in my task, heap not within my stack mm_free: Freeing 0x2001d3e0 //after short usage test, freeing the memory within my task mm_malloc: Allocated 0x2000cbd0, size 64 //allocation for dmesg: CONFIG_STDIO_BUFFER_SIZE mm_malloc: Allocated 0x20009710, size 32 //allocation for dmesg mm_malloc: Allocated 0x2000a8d0, size 32 //also mm_free: Freeing 0x2000a8d0 mm_free: Freeing 0x20009710 mm_free: Freeing 0x2000cbd0 mm_malloc: Allocated 0x2001d3e0, size 528 //also caused by dmesg, maybe CONFIG_NSH_IOBUFFER_SIZE //16K space left to my stack-end //all other tasks, pthreads etc shown by ps command have stack allocated before this address!! ---------------------------- calling the Neo_Ledtest as builtin: nsh> ps PID PRI POLICY TYPE NPX STATE EVENT SIGMASK STACK COMMAND 0 0 FIFO Kthread N-- Ready 00000000 000000 Idle Task 1 224 FIFO Kthread --- Waiting Signal 00000000 002028 hpwork 2 100 FIFO Task --- Running 00000000 002028 init 3 80 RR pthread --- Waiting Semaphore 00000000 001564 netinit 0x0 4 100 FIFO Task --- Waiting Semaphore 00000000 002004 Telnet daemon0 6 100 FIFO Task --- Waiting Semaphore 00000000 006116 Neo_Ledtest nsh> nsh> nsh> cat /proc/6/stack StackBase: 0x0x20020a50 StackSize: 6116 StackEnd = 0x200214b0 - 6116d = 0x2001F26C nsh> dmesg mm_free: Freeing 0x2001d010 mm_malloc: Allocated 0x2000cbd0, size 64 mm_malloc: Allocated 0x20009710, size 32 mm_malloc: Allocated 0x2000cc10, size 48 mm_free: Freeing 0x2000cc10 mm_free: Freeing 0x20009710 mm_free: Freeing 0x2000cbd0 mm_malloc: Allocated 0x2001d010, size 256 mm_malloc: Allocated 0x2001d110, size 832 mm_malloc: Allocated 0x2000cbd0, size 64 mm_malloc: Allocated 0x2000cc10, size 80 mm_malloc: Allocated 0x2001d450, size 80 mm_malloc: Allocated 0x2001d4a0, size 80 mm_malloc: Allocated 0x2001d4f0, size 6160 mm_malloc: Allocated 0x2001ed00, size 256 mm_malloc: Allocated 0x2001ee00, size 832 mm_malloc: Allocated 0x2001f140, size 64 mm_malloc: Allocated 0x2001f180, size 80 mm_malloc: Allocated 0x2001f1d0, size 80 mm_malloc: Allocated 0x2001f220, size 80 mm_malloc: Allocated 0x2001f270, size 6160 //here is my builtin task stack allocated, just before calculated stack- end mm_malloc: Allocated 0x20009710, size 32 mm_free: Freeing 0x2000cc10 mm_free: Freeing 0x2001d450 mm_free: Freeing 0x2001d4a0 mm_free: Freeing 0x2000cbd0 mm_free: Freeing 0x2001d4f0 mm_free: Freeing 0x2001d010 mm_free: Freeing 0x2001d110 mm_free: Freeing 0x20009710 mm_malloc: Allocated 0x2001d010, size 7008 //allocating 7000Bytes in my task mm_free: Freeing 0x2001d010 //freeing mm_malloc: Allocated 0x2000cbd0, size 64 //dmesg stuff.. mm_malloc: Allocated 0x20009710, size 32 //dmesg stuff.. mm_malloc: Allocated 0x2000a8d0, size 32 //dmesg stuff.. mm_free: Freeing 0x2000a8d0 mm_free: Freeing 0x20009710 mm_free: Freeing 0x2000cbd0 mm_malloc: Allocated 0x2001d010, size 528 //dmesg stuff.. //8.5K left until my stack-end
-- Florian WehmeyerTFW Tech-SolutionsOn Seg, 2020-05-11 at 11:35 -0300, Florian Wehmeyer wrote: > Hi all, > > again a question related to the execution of external / elf > programs: > > When I use malloc within the running elf program, allocating more > than > 1K bytes, malloc seems to work (doesn't return NULL), but when I use > that memory (memset) I get a assertion/Kernel panic.. > > Funnily this does not happen if I use the same program as built-in > program (the one which is already in ROM flash).. Here I can allocate > and use 8K or more without any problem.. > > So, it seems the binary loader itself consumes a lot of memory, > decreasing the available heap.. I was not able to solve that problem > even increasing all available and possibly related stacksizes in > .config > After loading the elf file, even running dmesg can cause that > assertion.. (using RAMLOG with 8K buffer and memory debug output) . > free shows about 130K of free RAM.. > > in the memory debug output I can see that the periodical allocation > at > about 10K of distance of the next stack-end (means stackbase minus > stacksize, knowing stack decreases), which is my app.. > so, I thought allocate 2K on the heap should not be a problem. > > > Any ideas about any configuration that's important here? > > > Many thanks & BR, > > > -- > Florian WehmeyerTFW Tech-Solutions