From: "Petr Vandrovec" <VANDROVE@vc.cvut.cz>
To: Brent Baccala <baccala@freesoft.org>
Cc: linux-kernel@vger.kernel.org
Subject: Re: Do kernel threads need their own stack?
Date: Wed, 18 Jul 2001 11:57:41 MET-1 [thread overview]
Message-ID: <8F87F416D97@vcnet.vc.cvut.cz> (raw)
On 18 Jul 01 at 3:16, Brent Baccala wrote:
> The first thing I notice is that this function refers not only to the
> clone flags in ebx, but also to a "newsp" in ecx - and ecx went
> completely unmentioned in kernel_thread()! A disassembly of
>
> Anyway, I'm confused. My analysis might be wrong, since I don't spend
> that much time in the Linux kernel, but bottom line - doesn't
> kernel_thread() need to allocate stack space for the child? I mean,
> even if everything else is shared, doesn't the child at least need it's
> own stack?
ecx specifies where userspace stack lives, not kernel space one, and
each process gets its own kernel stack automagically. As you must not
ever return to userspace from kernel_thread(), it is not a problem.
Because of exiting from kernel_thread() to userspace is not trivial
task, I do not think that is worth of effort.
If you are in doubts, you can trace code down to copy_thread. It copies
parent's registers as entered by int 0x80, and then uses ret_from_fork
for child's return path. So it returns to same place from where it
was invoked - in kernel_thread() case into kernel, with esp just being
on the top of kernel stack. And value passed for esp into clone() is lost
in that case, as it was stored in return stackframe esp field (oldesp
in entry.S) which was not used by processor because of it did not change
its CPL to userspace (stack->cs & 3 was equal to %cs & 3, so stack pointer
was not fetched from stack).
Only problem I see is that we could give 8 more bytes to child by doing
add $8,%esp in child path in kernel_thread(), as currently we leave
these 8 bytes (oldesp, oldss) filled with garbage. But on other side,
if 8 bytes is everything what saves you from stack overflow, you are
in serious troubles anyway (in Linux, of course; 8 bytes is half of
your stack on i8048). And leaving it this way we ensure that child
has 16byte aligned stack on its enter, which can speed up code a bit
too.
Best regards,
Petr Vandrovec
vandrove@vc.cvut.cz
next reply other threads:[~2001-07-18 9:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-07-18 11:57 Petr Vandrovec [this message]
2001-07-18 16:04 ` Do kernel threads need their own stack? Brent Baccala
-- strict thread matches above, loose matches on Subject: below --
2001-07-19 10:57 alad
2001-07-18 7:16 Brent Baccala
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8F87F416D97@vcnet.vc.cvut.cz \
--to=vandrove@vc.cvut.cz \
--cc=baccala@freesoft.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox