* How to setup pre-allocated heap stack space? @ 2014-08-05 20:26 Weiming Zhao 2014-08-05 20:47 ` Rich Felker 0 siblings, 1 reply; 5+ messages in thread From: Weiming Zhao @ 2014-08-05 20:26 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 221 bytes --] Hi, In musl's crt1.c , I want to let libc to use preallocated heap and stack. I can set the SP register in crt1. But how do I specify the base address of heap? So malloc will starts from there. Thanks, Weiming [-- Attachment #2: Type: text/html, Size: 2193 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to setup pre-allocated heap stack space? 2014-08-05 20:26 How to setup pre-allocated heap stack space? Weiming Zhao @ 2014-08-05 20:47 ` Rich Felker 2014-08-05 20:59 ` Weiming Zhao 0 siblings, 1 reply; 5+ messages in thread From: Rich Felker @ 2014-08-05 20:47 UTC (permalink / raw) To: musl On Tue, Aug 05, 2014 at 01:26:51PM -0700, Weiming Zhao wrote: > Hi, > > In musl's crt1.c , I want to let libc to use preallocated heap and stack. > > I can set the SP register in crt1. But how do I specify the base address of > heap? So malloc will starts from there. Are you using musl pretty much as-is on Linux, or on a custom OS, bare-metal setup, etc.? On Linux the stack is *always* pre-allocated (with a constant size of 128k, with more committed only lazily as needed, and with possible failure resulting in process death) so I don't know why you'd need to do your own stack pre-allocation, but like you said, it's not really hard. For the heap, if you have a custom OS, you can just define the SYS_brk syscall to give a pointer to your pre-allocated heap, but beware that musl will start using mmap if this heap runs out of space. If you're using Linux and you just want a pre-allocated heap to ensure that memory is committed at exec-time, so allocations can't fail later, the way to achieve this from crt1 would be to use the strategy reclaim_gaps() uses in the dynamic linker, which essentially amounts to passing the pointer to free() after setting up some adjacent bookkeeping structures. However I would strongly advise AGAINST this approach unless you're static-linking with a known version of musl. If dynamic linking, you would be encoding a dependency on the internal heap representation into your application binary, and things would horribly break if musl is later upgraded and the representation no longer matches. Rich ^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: How to setup pre-allocated heap stack space? 2014-08-05 20:47 ` Rich Felker @ 2014-08-05 20:59 ` Weiming Zhao 2014-08-05 21:04 ` Rich Felker 0 siblings, 1 reply; 5+ messages in thread From: Weiming Zhao @ 2014-08-05 20:59 UTC (permalink / raw) To: musl Hi Rich, I'm using it on a bare-metal setup. So the heap space some fixed address. So I think I should modify __brk() like: uintptr_t __brk(uintptr_t newbrk) { return newbrk == 0 ? HEAP_BASE : newbrk ; // assume heap is large enough } Is that correct? I don't need to worry about free(), right? Thanks, Weiming -----Original Message----- From: Rich Felker [mailto:dalias@aerifal.cx] On Behalf Of Rich Felker Sent: Tuesday, August 05, 2014 1:47 PM To: musl@lists.openwall.com Subject: Re: [musl] How to setup pre-allocated heap stack space? On Tue, Aug 05, 2014 at 01:26:51PM -0700, Weiming Zhao wrote: > Hi, > > In musl's crt1.c , I want to let libc to use preallocated heap and stack. > > I can set the SP register in crt1. But how do I specify the base > address of heap? So malloc will starts from there. Are you using musl pretty much as-is on Linux, or on a custom OS, bare-metal setup, etc.? On Linux the stack is *always* pre-allocated (with a constant size of 128k, with more committed only lazily as needed, and with possible failure resulting in process death) so I don't know why you'd need to do your own stack pre-allocation, but like you said, it's not really hard. For the heap, if you have a custom OS, you can just define the SYS_brk syscall to give a pointer to your pre-allocated heap, but beware that musl will start using mmap if this heap runs out of space. If you're using Linux and you just want a pre-allocated heap to ensure that memory is committed at exec-time, so allocations can't fail later, the way to achieve this from crt1 would be to use the strategy reclaim_gaps() uses in the dynamic linker, which essentially amounts to passing the pointer to free() after setting up some adjacent bookkeeping structures. However I would strongly advise AGAINST this approach unless you're static-linking with a known version of musl. If dynamic linking, you would be encoding a dependency on the internal heap representation into your application binary, and things would horribly break if musl is later upgraded and the representation no longer matches. Rich ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to setup pre-allocated heap stack space? 2014-08-05 20:59 ` Weiming Zhao @ 2014-08-05 21:04 ` Rich Felker 2014-08-05 21:07 ` Weiming Zhao 0 siblings, 1 reply; 5+ messages in thread From: Rich Felker @ 2014-08-05 21:04 UTC (permalink / raw) To: musl On Tue, Aug 05, 2014 at 01:59:21PM -0700, Weiming Zhao wrote: > Hi Rich, > > I'm using it on a bare-metal setup. So the heap space some fixed address. > So I think I should modify __brk() like: > uintptr_t __brk(uintptr_t newbrk) { > return newbrk == 0 ? HEAP_BASE : newbrk ; // assume heap is large enough > } > Is that correct? I don't need to worry about free(), right? Well I would at least make sure you don't overflow into other memory, by checking against an upper bound for the heap. But yes, something like the above looks right. Rich ^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: How to setup pre-allocated heap stack space? 2014-08-05 21:04 ` Rich Felker @ 2014-08-05 21:07 ` Weiming Zhao 0 siblings, 0 replies; 5+ messages in thread From: Weiming Zhao @ 2014-08-05 21:07 UTC (permalink / raw) To: musl Yes, I will check the limit of the heap. Just want to check with you if the basic idea is correct. Thanks a lot! -----Original Message----- From: Rich Felker [mailto:dalias@aerifal.cx] On Behalf Of Rich Felker Sent: Tuesday, August 05, 2014 2:05 PM To: musl@lists.openwall.com Subject: Re: [musl] How to setup pre-allocated heap stack space? On Tue, Aug 05, 2014 at 01:59:21PM -0700, Weiming Zhao wrote: > Hi Rich, > > I'm using it on a bare-metal setup. So the heap space some fixed address. > So I think I should modify __brk() like: > uintptr_t __brk(uintptr_t newbrk) { > return newbrk == 0 ? HEAP_BASE : newbrk ; // assume heap is large > enough } Is that correct? I don't need to worry about free(), right? Well I would at least make sure you don't overflow into other memory, by checking against an upper bound for the heap. But yes, something like the above looks right. Rich ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-08-05 21:07 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-08-05 20:26 How to setup pre-allocated heap stack space? Weiming Zhao 2014-08-05 20:47 ` Rich Felker 2014-08-05 20:59 ` Weiming Zhao 2014-08-05 21:04 ` Rich Felker 2014-08-05 21:07 ` Weiming Zhao
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/musl/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).