Android 在 kernel 中重启系统的接口

2019-06-14

关键字:kernel 重启函数、kernel reboot、kernel restart


Android 重启系统的方法可太多了。但大多数都需要我们在正常运行的 Android 之上才可以操作,甚至稍微偏底层一点的都需要我们的文件系统存在时才能使用。对于一些特定的场景,比如在 Android 的 kernel 进程里,想要直接发起一个重启命令要如何做呢?

方法其实很简单,kernel 中有现成的接口可以直接使用。

./kernel/kernel/sys.c

在上面这个源码中定义了一个函数

/**
 *    kernel_restart - reboot the system
 *    @cmd: pointer to buffer containing command to execute for restart
 *        or %NULL
 *
 *    Shutdown everything and perform a clean reboot.
 *    This is not safe to call in interrupt context.
 */
void kernel_restart(char *cmd)
{
    kernel_restart_prepare(cmd);
    migrate_to_reboot_cpu();
    syscore_shutdown();
    if (!cmd)
        printk(KERN_EMERG "Restarting system.
");
    else
        printk(KERN_EMERG "Restarting system with command '%s'.
", cmd);
    kmsg_dump(KMSG_DUMP_RESTART);
    machine_restart(cmd);
}

这个函数很友好,只要是在 kernel 中的程序,你可以直接声明这个函数的 extern 函数形式,然后直接调用它。它的使用方式如下

extern void kernel_restart(char *cmd);

void main()
{
  kernel_restart(0);        //相当于 reboot
  kernel_restart("loader"); //相当于 reboot loader
}

函数的参数是一个重启命令参数。如果仅需要重启系统,直接传一个空指针进去就好。


原文地址:https://www.cnblogs.com/chorm590/p/11022561.html