On Wednesday 02 February 2005 16:29, Alex LIU wrote:
> Hi,Blaisorblade. You wrote:
> >do_syscall is called, and then this is done:
> >
> >                                sig = SIGUSR2;
> >                                tracing = 0;
> >... after, this saves the new tracing value inside "task", which is a
> > struct task_struct.
> >
> >                       set_tracing(task, tracing);
Pre-question: I hope for you that you use a ctags/etags enabled editor (or at 
least LXR) to help in source browsing, otherwise you'll get lost.

There is more than one good introduction about ctags (which is supported at 
least by Vim and Emacs, and maybe even by Kate).

> But what's the exact meaning of the task in the tracer function? It is
> defined as:
>
>  task = cpu_tasks[proc_id].task
>
> Is it the task struct of the traced thread?

Yes, it is... proc_id is the ID of the virtual processor (it will be always 0 
on a uniprocessor UML instance). 

If you look at the comment before that line (when it is re-executed) and at 
do_proc_op(), you'll see that when doing an exec the host process is changed.

> What's the difference between "task->pid" and
> "task->thread.mode.tt.extern_pid"?

> I know in TT mode every thread in UML 
> will has a corresponding thread in host.

Yes, and while task->pid (which is a field also existing in i386 Linux) is the 
pid you see inside UML for that task, extern_pid is the pid of the matching 
host thread.

> But I don't know the exact 
> relationship between them.

It's 1-1 I think, and the code does not show sign of working otherwise (even 
if, probably, it could be changed to make sure that multiple threads have 
only one corresponding host thread)...

I don't know the relation between tracer() running instances and childs... in 
SKAS mode, the scheduler does a context switch (through sigsetjmp() / 
siglongjmp()) between multiple tracers (i.e. ; when  a new tracer is 
scheduled inside UML, it makes the host process switch to the right thread 
and execute it.

Instead, in TT mode there is just one tracer, which does a waitpid() on every 
thread... a process is scheduled away by making it wait on a pipe 
(task->thread.mode.tt.switch_pipe[]).

> And I didn't found how UML creat the 
> corresponding thread in host.

To create a process (with fork(), vfork() or clone()) the do_fork() call is 
executed with appropriate flags...

The arch-dependent hook for the process creation is copy_thread()... and 
copy_thread_tt() calls start_fork_tramp() which creates the host thread with 
clone (actually with 2 clone calls, I dunno why) and returns the pid of the 
newly created thread, which is then assigned inside copy_thread to 
task->.....extern_pid.

Also notice the messages sent with SIGUSR1 named by OP_* (OP_FORK, OP_EXEC...)
> Thanks a lot!
Well, this was also an occasion to learn these things myself (I didn't need 
understanding it in detail until now since I've not been working on TT code, 
I had a feeling of what happened), so thanks to you.

Regards
-- 
Paolo Giarrusso, aka Blaisorblade
Linux registered user n. 292729
http://www.user-mode-linux.org/~blaisorblade




-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to