linux-mips
[Top] [All Lists]

Re: How to trigger a binary to excute in Linux/MIPS?

To: kjlin <kj.lin@viditec-netmedia.com.tw>
Subject: Re: How to trigger a binary to excute in Linux/MIPS?
From: "Justin Carlson" <carlson@sibyte.com>
Date: Thu, 14 Jun 2001 21:03:22 -0700
Cc: linux-mips@oss.sgi.com
In-reply-to: <04a201c0f542$28184620$056aaac0@kjlin>
Organization: Sibyte
References: <04a201c0f542$28184620$056aaac0@kjlin>
Reply-to: carlson@sibyte.com
Sender: owner-linux-mips@oss.sgi.com
On Thu, 14 Jun 2001, you wrote:
> 
> Hi,
> 
> To execute a program, the load_elf_binary() loads it and descdes the value of 
> elf_entry, start_code, start_data....etc..
> Then , the start_thread(regs, elf_entry, bprm->p) will trigger it.
> But it just sets up the value of regs->cp0_status, regs->cp0_epc, 
> regs->regs[29] and current->thread.current_ds.
> Why can the start_thread() trigger a program?
> 

It does trigger a program, just not in the way you're thinking. 

At that point, you're in kernel space, with kernel privileges, so you can't
just jump to the entry point of the elf binary; you have to drop privs first.

What you're probably missing is that, when the kernel returns to userspace, it
does so (in mips) via an eret, which returns to the epc.  The registers are
restored from the regs struct that is being modified by start_thread, so it is
effectively modifying the registers for userspace, which is what it should be
doing.

In short, you're not going to see the new process, in your case, /sbin/hello,
start executing until the syscall returns.  Check out
arch/mips/kernel/entry.S:ret_from_sys_call to see where this happens.  You'll
also want to check out include/asm-mips/stackframe.h

Does this make sense?

-Justin


<Prev in Thread] Current Thread [Next in Thread>