内核态到用户态切换(二)

本文深入分析了Linux系统中从内核态切换到用户态的过程,涉及系统调用、中断、陷阱门以及init进程。在内核态,通过系统调用(syscall)和中断处理,利用中断描述符表(IDT)定位中断程序。通过模拟系统调用,实现在执行完内核代码后返回用户态的init进程,从而启动用户空间的init旅程。
摘要由CSDN通过智能技术生成

引言:(一)分析了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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值