Adb reboot流程

ADB 根据ADB_HOST可以编译出电脑上使用adb和手机内使用的adbd,代码目录在system/core/adb
 
作为adb  adb_commandline是主要的命令处理函数。
 
作为adbd service_to_fd是接收到socket命令后的处理函数。
adb_main
transport_registration_func
transport_socket_events
handle_packet
create_local_service_socket
service_to_fd 
 
以下部分是reboot的代码执行流程
__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, (char *)arg);
这个__reboot是调用了bionic/libc/arch-arm/syscalls/__reboot.S
                    
.text
    .type __reboot, #function
    .globl __reboot
    .align 4
    .fnstart
__reboot:
    .save   {r4, r7}
    stmfd   sp!, {r4, r7}
    ldr     r7, =__NR_reboot
    swi     #0
    ldmfd   sp!, {r4, r7}
    movs    r0, r0
    bxpl    lr
    b       __set_syscall_errno
    .fnend

swi # 0系统调用应该等同于int 0x80
__NR_reboot调用定义在kernel/include/asm-generic/unistd.h
#define __NR_reboot 142
__SYSCALL(__NR_reboot, sys_reboot)
 
sys_reboot实现 LINUX_REBOOT_CMD_RESTART2应该是后来实现,用来拓展参数的。
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,void __user *, arg)
{
    .....
    case LINUX_REBOOT_CMD_RESTART2:
        if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
            ret = -EFAULT;
            break;
        }
        buffer[sizeof(buffer) - 1] = '\0';
 
        kernel_restart(buffer);
        break;
    ......
}

 
kernel_restart接口
    kernel_restart_prepare(cmd);     //这里会调用到msm_reboot_call,在这个接口里会根据str来赋值reboot reason 
     if ( !cmd)
        printk(KERN_EMERG "Restarting system.\n");
     else
        printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
    kmsg_dump(KMSG_DUMP_RESTART);
    machine_restart(cmd);       //这里会调用到msm_pm_restart
  
msm_pm_restart 调用 msm_proc_comm(PCOM_RESET_CHIP, &restart_reason, 0);
把reboot reason写到内存里,机器开启后aboot.c会判断reason后进入对应的模式。

你可能感兴趣的:(android,adb,reboot)