Thanks a lot!<br>It is very clear now.<br><br>Actually, the reason that I have confused is the following:<br>If you see the source code below, the type of stack is long [] and the type of stack_base is addr_t.<br>Although they are both pointers, it confuses me that one is pure address (addr_t) and the other is long [].<br>
That's why I conjectured they could be different things.<br><br>Also, is there a particular reason that you position thread_base in between stack and stack base?<br>If not, I think placing stack and stack_base right next to each other would be better (just an opinion).<br>
<br>                                /**<br>                                 * Top of the stack<br>                                 */<br>                                long stack[];<br><br>                                /**<br>
                                 * Pointer to corresponding 'Thread_base' object<br>                                 */<br>                                Thread_base *thread_base;<br><br>                                /**<br>
                                 * Virtual address of the start of the stack<br>                                 *<br>                                 * This address is pointing to the begin of the dataspace used<br>                                 * for backing the thread context except for the UTCB (which is<br>
                                 * managed by the kernel).<br>                                 */<br>                                addr_t stack_base;<br>Best regards,<br>Jaeyong<br><br><div class="gmail_quote">On Sat, Dec 29, 2012 at 4:37 AM, Norman Feske <span dir="ltr"><<a href="mailto:norman.feske@...1..." target="_blank">norman.feske@...1...</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Jaeyong,<br>
<div><div class="h5"><br>
> While I was browsing source code, I found two confusing variables:<br>
> At genode/base/include/base/thread.h<br>
>         Thread_base::Context {<br>
><br>
>                                 long stack[];<br>
><br>
>                                 addr_t stack_base;<br>
>         }<br>
><br>
> Although, they are commented a bit, it is hard to understand what are they<br>
> doing and what's the difference.<br>
> Could you tell me about them more?<br>
<br>
</div></div>please let me first refer you to the brief description of the concept<br>
behind the code:<br>
<br>
<br>
<a href="http://genode.org/documentation/release-notes/10.02#New_thread-context_management" target="_blank">http://genode.org/documentation/release-notes/10.02#New_thread-context_management</a><br>
<br>
Each 'Thread_base' object is accompanied by a 'Thread_base::Context'<br>
object, which holds the thread's stack and information about<br>
thread-local storage (i.e., the UTCB) and similar meta data. In contrast<br>
to 'Thread_base' objects, which are plain C++ objects that can reside<br>
anywhere (on BSS, heap, or even on a stack), thread context objects are<br>
placed within the so-called thread-context area, which is a region of<br>
the process' virtual address space managed by the process itself. Each<br>
thread owns a 1MB portion of the context area. Only a tiny bit of this<br>
portion is actually used for the thread context. The gaps between the<br>
thread contexts are not populated with memory. This way, stack overruns<br>
will result in an unresolvable page fault (similar to a segmentation<br>
fault) rather than corrupted memory.<br>
<br>
Each thread context consists of two parts, meta data expressed by the<br>
'Thread_base::Context' type and the stack. Whereas the meta data has the<br>
same size and layout for each thread (well, the main thread is an<br>
exception here), the stack size differs from thread to thread. The<br>
metadata is always positioned such that it starts after the stack.<br>
Because the stack always grows from higher to lower addresses, an<br>
overrunning stack won't overwrite its meta data. The 'stack_base'<br>
variable points to the "other end" of the stack - the lower one which<br>
would get crossed if the stack overruns.<br>
<br>
I hope this description could be of help. Do you have a suggestion about<br>
a comment that would have helped you to get a better understanding in<br>
the first place? I'd like to make the situation easier for future<br>
readers of the code.<br>
<br>
Best regards<br>
Norman<br>
<br>
--<br>
Dr.-Ing. Norman Feske<br>
Genode Labs<br>
<br>
<a href="http://www.genode-labs.com" target="_blank">http://www.genode-labs.com</a> · <a href="http://genode.org" target="_blank">http://genode.org</a><br>
<br>
Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden<br>
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth<br>
<br>
------------------------------------------------------------------------------<br>
Master HTML5, CSS3, <a href="http://ASP.NET" target="_blank">ASP.NET</a>, MVC, AJAX, Knockout.js, Web API and<br>
much more. Get web development skills now with LearnDevNow -<br>
350+ hours of step-by-step video tutorials by Microsoft MVPs and experts.<br>
SALE $99.99 this month only -- learn more at:<br>
<a href="http://p.sf.net/sfu/learnmore_122812" target="_blank">http://p.sf.net/sfu/learnmore_122812</a><br>
_______________________________________________<br>
Genode-main mailing list<br>
<a href="mailto:Genode-main@lists.sourceforge.net">Genode-main@...12...ceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/genode-main" target="_blank">https://lists.sourceforge.net/lists/listinfo/genode-main</a><br>
</blockquote></div><br>