国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

kernel 調用uefi的run time service 關機

2019-11-09 15:45:58
字體:
來源:轉載
供稿:網友
當上層調用reboot命令時,就會調用到arch/arm64/kernel/PRocess.c 中的SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,void __user *, arg){    struct pid_namespace *pid_ns = task_active_pid_ns(current);    char buffer[256];    int ret = 0;        mutex_lock(&reboot_mutex);    switch (cmd) {    case linux_REBOOT_CMD_RESTART:        kernel_restart(NULL);        break;    case LINUX_REBOOT_CMD_POWER_OFF:        kernel_power_off();        do_exit(0);        break;}我們重點開看請參數是LINUX_REBOOT_CMD_RESTART時,會調用kernel_restart->machine_restartvoid machine_restart(char *cmd){    /* Disable interrupts first */    local_irq_disable();    smp_send_stop();    /*     * UpdateCapsule() depends on the system being reset via     * ResetSystem().     */    if (efi_enabled(EFI_RUNTIME_SERVICES))        efi_reboot(reboot_mode, NULL);    /* Now call the architecture specific reboot code. */    if (arm_pm_restart)        arm_pm_restart(reboot_mode, cmd);    else        do_kernel_restart(cmd);    /*     * Whoops - the architecture was unable to reboot.     */    printk("Reboot failed -- System halted/n");    while (1);}在machine_restart 中,可以看到如果kernel可以使用uefi的runtime service的話,就會調用efi_rebootvoid efi_reboot(enum reboot_mode reboot_mode, const char *__unused){    const char *str[] = { "cold", "warm", "shutdown", "platform" };    int efi_mode, cap_reset_mode;    if (!efi_enabled(EFI_RUNTIME_SERVICES))        return;    switch (reboot_mode) {    case REBOOT_WARM:    case REBOOT_SOFT:        efi_mode = EFI_RESET_WARM;        break;    default:        efi_mode = EFI_RESET_COLD;        break;    }    /*     * If a quirk forced an EFI reset mode, always use that.     */    if (efi_reboot_quirk_mode != -1)        efi_mode = efi_reboot_quirk_mode;    if (efi_capsule_pending(&cap_reset_mode)) {        if (efi_mode != cap_reset_mode)            printk(KERN_CRIT "efi: %s reset requested but pending "                   "capsule update requires %s reset... Performing "                   "%s reset./n", str[efi_mode], str[cap_reset_mode],                   str[cap_reset_mode]);        efi_mode = cap_reset_mode;    }    efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL);}在efi_reboot 中可以看到reboot分為四中"cold", "warm", "shutdown", "platform",最終轉成兩種mode EFI_RESET_WARM和 EFI_RESET_COLD最后通過    efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL);來reboot系統.在reboot命令中如果參數是LINUX_REBOOT_CMD_POWER_OFF的話kernel_power_off->machine_power_offvoid machine_power_off(void){    local_irq_disable();    smp_send_stop();    if (pm_power_off)        pm_power_off();}可見最后是調用pm_power_off 來關機的.static int __init efi_shutdown_init(void){    if (!efi_enabled(EFI_RUNTIME_SERVICES))        return -ENODEV;    if (efi_poweroff_required())        pm_power_off = efi_power_off;    return 0;}late_initcall(efi_shutdown_init);同上肯定是可以使用uefi的runtime service ,而efi_poweroff_required 也是判斷是否可以使用runtime service,這兩者感覺有的重復。bool efi_poweroff_required(void){    return efi_enabled(EFI_RUNTIME_SERVICES);}總之會調用efi_power_off來關機而static void efi_power_off(void){    efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);}也是調用efi接口來實現關機.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳泉市| 桓台县| 邓州市| 区。| 玉溪市| 富宁县| 凤冈县| 土默特左旗| 兴宁市| 余庆县| 安多县| 江口县| 怀宁县| 准格尔旗| 达拉特旗| 镇雄县| 凤凰县| 崇明县| 都兰县| 灯塔市| 兴义市| 道真| 孟津县| 吴江市| 新昌县| 南川市| 康乐县| 武鸣县| 白水县| 安顺市| 蚌埠市| 龙游县| 玉屏| 新蔡县| 桂平市| 仁化县| 宜春市| 温州市| 武城县| 大足县| 武城县|