From: Jon Masters <jonmasters@xxxxxxxxx> Reply-To: jonathan@xxxxxxxxxxxxxx To: Bao zhao <paozhaokeats@xxxxxxxxxxx> CC: kernelnewbies@xxxxxxxxxxxx Subject: Re: why does switch_to need three arguments? Date: Sun, 3 Oct 2004 03:54:02 +0100
On Sun, 03 Oct 2004 08:41:29 +0800, Bao zhao <paozhaokeats@xxxxxxxxxxx> wrote:
> context_switch function is the only one which calls switch_to, and the first
> argument and the third argument are same. Is it not redundant?
Page 92 of Understanding the Linux Kernel states:
``You might easily guess the role of prev and next - they are just placeholders for the local variables prev and next - but what about the third parameter last? Well, the point is that in any process switch, three processes are involved, not just two.
Suppose the kernel decides to switch off process A and to activate process B. In the schedule() function, prev points to A's descriptor and next points to B's descriptor. As soon as the switch_to macro deactivates A, the execution flow of A freezes.
Later, when the kernel wants to reactivate A, it must switch off another process C (in general, this is different from B) by executing another switch_to macro with prev pointing to C and next pointing to A. When A resumes its execution blow, it finds its old kernel mode stack, so the prev local variable points to A's descriptor and next points to B's descriptor. The kernel, which is now executing on behalf of process A, has lost any reference to C.''
[ Quoted text from Understanding the Linux kernel, second edition. O'relly and associates. ISBN: 0-596-00213-0. RRP 49.95USD, 77.95CAN. http://www.oreilly.com/ ]
So what it's getting at is that during context switch, the kernel stack and current process switches so the local variables available within the function doing the switch also change. This needs to be accounted for ahead of time by providing the kernel with enough information to deal with switching processes back at a later point in time.
It's really worth picking up a copy of UTLK - it's only 12.50GBP or so in bargin shops here, which works out at around 20USD for the second edition which covers 2.4. Much of that is relevent for 2.6 because the fundamental concepts have not changed, just lots of bits in the vm and scheduler which aren't a major hurdle at the outside.
rml does a good job with his book but (probably in an attempt at differentiation) he avoids some of the topics the UTLK goes in to in more detail (but this also means his book is more practical on the train - people I work with generally agree that smaller manageable books are often much more useful than big oversized ones just from a practical viewpoint). I do have lists of points I've spotted in several kernel books that I keep planning to put online at some point - perhaps I can abuse the kernelnewbies wiki for this purpose.
Jon.
hi, I have read the ULK. what confuse me is the protype of switch_to,
# define switch_to(prev,next,last){
.....
}
we can see it has three parameters.
But when switch_to was called, prev and last always have the same valuse(see my previous post),
So I think the protype of switch_to should be:
# define switch_to(prev,next){ ..... }
each original "last" can be replaced by "prev"
_________________________________________________________________
MSN 8 with e-mail virus protection service: 2 months FREE* http://join.msn.com/?page=features/virus
-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/