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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

kernel 調(diào)用uefi的run time service 關(guān)機(jī)

2019-11-09 17:00:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
當(dāng)上層調(diào)用reboot命令時(shí),就會(huì)調(diào)用到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;}我們重點(diǎn)開(kāi)看請(qǐng)參數(shù)是LINUX_REBOOT_CMD_RESTART時(shí),會(huì)調(diào)用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的話,就會(huì)調(diào)用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",最終轉(zhuǎn)成兩種mode EFI_RESET_WARM和 EFI_RESET_COLD最后通過(guò)    efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL);來(lái)reboot系統(tǒng).在reboot命令中如果參數(shù)是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();}可見(jiàn)最后是調(diào)用pm_power_off 來(lái)關(guān)機(jī)的.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,這兩者感覺(jué)有的重復(fù)。bool efi_poweroff_required(void){    return efi_enabled(EFI_RUNTIME_SERVICES);}總之會(huì)調(diào)用efi_power_off來(lái)關(guān)機(jī)而static void efi_power_off(void){    efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);}也是調(diào)用efi接口來(lái)實(shí)現(xiàn)關(guān)機(jī).
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吉林省| 遂川县| 牟定县| 虎林市| 华安县| 四子王旗| 夹江县| 清水河县| 桂平市| 东兰县| 台南县| 鄢陵县| 霍林郭勒市| 策勒县| 黑水县| 章丘市| 克拉玛依市| 孟州市| 桃江县| 彭山县| 盐山县| 丰都县| 应用必备| 聊城市| 普宁市| 丰台区| 太湖县| 和政县| 江山市| 枝江市| 乌兰浩特市| 融水| 苗栗县| 南雄市| 集安市| 永新县| 乌恰县| 东源县| 策勒县| 孟州市| 莱阳市|