引言:(一)分析了0号进程(任务0)、内核线程、用户线程相关问题,有了这个铺垫,开始本文的分析。3)如何从内核空间切换到用户空间去的?
假设1号进程(内核态)init中已ramdisk_execute_command已传入,毕竟是要分析android系统的。
static int __init kernel_init(void * unused) {
if (!ramdisk_execute_command)
ramdisk_execute_command = "/init";
init_post();
}
static noinline int init_post(void)
{
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command);
}
static void run_init_process(char *init_filename)
{
argv_init[0] = init_filename;
kernel_execve(init_filename, argv_init, envp_init);
}
在init内核进程中,直接运行run_init_process,实际是调用 了kernel_execve ,而kernel_execve的实质是通过一个系统调用,同时改变pt_regs,达到切换到用户空间。
/*
* Do a system call from kernel instead of calling sys_execve so we
* end up with proper pt_regs.
*/
int kernel_execve(const char *filename, char *const argv[], char *const envp[])
{
long __res;
asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
: "=a" (__res)
: "0" (__NR_execve), "ri" (filename), "c" (argv), "d" (envp) : "memor