mailing list of musl libc
 help / color / mirror / code / Atom feed
* 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).