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 }
函数的参数是一个重启命令参数。如果仅需要重启系统,直接传一个空指针进去就好。