Thank you for clarification!

> Date: Tue, 29 Sep 2009 08:24:09 -0700
> From: jonathan.adams at sun.com
> To: mydino_vi at hotmail.com
> CC: on-discuss at opensolaris.org
> Subject: Re: [on-discuss] question about cfork
> 
> On Tue, Sep 29, 2009 at 09:15:08PM +0800, ???? ?? wrote:
>> 
>> Thank you for your reply!
>> 
>> My words is a little confused:)
>> 
>> to simplify it, we assume fork1() is invoked by PT. In your words,"The
>> kernel thread stack is not copied or shared between PT and CT" , but
>> forklwp() invokes lwp_forkregs(lwp, clwp) which to copy struct regs in
>> kernel stack frame from PT to CT.
> 
> Right.  So the new thread starts with the same register set as the parent,
> except that:
> 
> usr/src/uts/common/os/fork.c:
>  509         if (PROC_IS_BRANDED(p))
>  510                 BROP(p)->b_lwp_setrval(clone, p->p_pid, 1);
>  511         else
>  512                 lwp_setrval(clone, p->p_pid, 1);
>  513 
>  514         /* set return values for parent */
>  515         r.r_val1 = (int)cp->p_pid;
>  516         r.r_val2 = 0;
> 
> The parent gets (child pid, 0), and the child gets (parent pid, 1) in the
> syscall return value registers.
> 
>> It means that CT will be dispatched to execute lwp_rtt_initial() in
>> kernel mode,which invoke IRET instruction to translate from kernel
>> mode to userland.
> 
> Indeed.
>> because CT's kernel stack frame is copied from PT, it will execute the
>> code after fork() in PT.
> 
> I'd say that CT's user-space register set was copied from PT.  Calling it
> a kernel stack frame is a bit misleading.
> 
>> *USER CODE AS FOLLOWS:*
>> 
>> ////////////////////////////////
>> 
>> int ret = fork();
>> 
>> if (ret> 0) {
>> 
>> // in parent process
>> 
>> } else if (ret == 0) {
>> 
>> // in child process
>> 
>> }
>> 
>> ////////////////////////////////
>> 
>>  
>> 
>> Yesterday I think that CT has no user thread struct named ulwpt_t, how
>> it is to control userland exuction flow?
>>
>> Now It seems that the as struct is copied from PP to CP.PP and CP
>> share the same process address space this time.When CT to execute the
>> text code,because of copy on write(COW),the page frames involving
>> ulwp_t struct will copied for CP.Now CT has its own ulwp_t struct, it
>> conforms to that a process's thread has an ulwp_t struct, a klwp_t
>> struct and a kthread_t struct.
> 
>> Oh,Is That right?
> 
> Yup;  all user-space state is COWed from the state of the parent, so the
> new thread's ulwp_t is at the same virtual address as the parents, and
> starts out as a copy of PT's ulwp_t.
> 
> Once CT gains control and returns to userland, libc (which has the thread
> interfaces in Solaris) does have to clean up a bit, especially after a
> non-forkall() fork.  If you're curious, take a look at forkx() and forkallx()
> in usr/src/lib/libc/port/threads/scalls.c.
> 
> Cheers,
> - jonathan
> 
>>
>>  
>> 
>> 
>>  
>>> Date: Mon, 28 Sep 2009 09:24:35 -0700
>>> From: jonathan.adams at sun.com
>>> To: mydino_vi at hotmail.com
>>> CC: on-discuss at opensolaris.org
>>> Subject: Re: [on-discuss] question about cfort
>>> 
>>> On Mon, Sep 28, 2009 at 09:09:42PM +0800, ?? ? wrote:
>>>> 
>>>> For example, 
>>>> 
>>>> the some thread maked by PT in parent process marked by PP
>>>> invoked syscall fork(), cfork() is invoked in the kernel
>>>> state which create child process marked by CP, CP's proc
>>>> struct(as,p_exec,p_user,klwp_t/kthread pairs) is duplicated by PP's
>>>> proc.
>>> 
>>> To re-write:
>>> 
>>> Some thread (PT) in a process (PP) invoked the "fork" syscall, which
>>> causes the kernel function cfork() to be called. This creates a child
>>> process (CP), whose state is a duplicate of PP's.
>>> 
>>>> Besides the kernel stack of CP's kthread is equal to the kernel
>>>> statck of PT,so CP's current thread is dispatched by cpu to execute
>>>> the code after fork() in PT thread code.
>>>> 
>>>> Question:CP has no any user thread(ulwp_t), why not duplicate ulwp_t? 
>>>> 
>>>> Is PT's ulwp_t shared by PP and CP? if so, it is not conform 
>>>> ulwp_t:klwp_t:kthread_t=1:1:1?!
>>> 
>>> I'm not sure exactly what you're asking here. Assuming we're talking
>>> about fork1() (which only creates one thread in CP), cfork() will
>>> create a single thread (CT) in the child, using the "forklwp()"
>>> call, which creates threads and associated LWPs, and duplicates the
>>> *userland* thread state from PT. The kernel thread stack is not copied
>>> or shared between PT and CT; the CT starts out with an empty stack in
>>> lwp_rtt_initial(), an assembly routine which sets up the stack, does some
>>> initial dtrace probes, and returns to userland.
>>> 
>>> Does that answer your question?
>>> 
>>> Cheers,
>>> - jonathan
>>> 
>>                                        
>> _________________________________________________________________
>> Invite your mail contacts to join your friends list with Windows Live 
>> Spaces. It's easy!
>> http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friends.aspx&mkt=en-us
                                          
_________________________________________________________________
Windows Live?: Keep your life in sync. Check it out!
http://windowslive.com/explore?ocid=TXT_TAGLM_WL_t1_allup_explore_012009
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.opensolaris.org/pipermail/on-discuss/attachments/20090930/762cf648/attachment.html>

Reply via email to