Que função no kernel do Linux faz a ação de desligar?

2

Eu não estou perguntando como desligar. Eu estou perguntando como cortar o poder.

Qual é a função no código do kernel Linux a ação de corte do poder? E por favor, explique o código.

    
por Victor 22.10.2014 / 18:04

2 respostas

3

O código real do kernel depende do arco do seu sistema. Para sistemas x86, eles estão localizados em arch / x86 / kernel / reboot.c

A parada interromperá a máquina e a deixará no estado ligado. Então ele simplesmente pára o kernel, mas normalmente não liga.

static void native_machine_halt(void)
{
  /* Stop other cpus and apics */
  machine_shutdown();

  tboot_shutdown(TB_SHUTDOWN_HALT);

  stop_this_cpu(NULL);
}

Enquanto o power_off também cortará a fonte elétrica do APM / ACPI pm_power_off ()

static void native_machine_power_off(void)
{
  if (pm_power_off) {
    if (!reboot_force)
      machine_shutdown();
    pm_power_off();
  }
  /* A fallback in case there is no PM info available */
  tboot_shutdown(TB_SHUTDOWN_HALT);
}

machine_shutdown () é um loop infinito

tboot_shutdown () ( arch / x86 / kernel / tboot.c )

stop_this_cpu (NULL) ( arch / x86 / kernel /process.c desativa os IRQs da CPU, configure a CPU offline,

pm_power_off () ( arch / x86 / kernel / apm_32.c ) é um ponteiro de função para apm_power_off ()

Como você pode ver, todo o trabalho depende do arco. Em todos os casos, é feito com chamadas ASM.

Para apm_power_off () , o BIOS é chamado com o código APT_STATE_OFF (0x0003).

apm_bios_call_simple(APM_FUNC_SET_STATE, APM_DEVICE_ALL, APM_STATE_OFF, eax, err);

Para native_halt () (arch / x86 / include / asm / irqflags.h), esta chamada é usada:

asm volatile("hlt": : :"memory");

Escolha seu veneno:)

    
por 22.10.2014 / 23:21
-1

Tradicionalmente, o Software pode controlar o Nível de Energia, passando comandos para um Shell ou Subshell. Você deve ser gentil com os usuários ao usar essa abordagem e dar a eles tempo para responder adequadamente. Dependendo do seu sistema init, você passa um nível ao sistema init. A seguir, uma tabela de níveis

+-------------------+-------------------------------------------------------+----------------------------------------------------------------------------------------------+
| Sysvinit Runlevel |                    Systemd Target                     |                                            Notes                                             |
+-------------------+-------------------------------------------------------+----------------------------------------------------------------------------------------------+
| 0                 | runlevel0.target, poweroff.target                     | Halt the system.                                                                             |
| 1, s, single      | runlevel1.target, rescue.target                       | Single user mode.                                                                            |
| 2, 4              | runlevel2.target, runlevel4.target, multi-user.target | User-defined/Site-specific runlevels. By default, identical to 3.                            |
| 3                 | runlevel3.target, multi-user.target                   | Multi-user, non-graphical. Users can usually login via multiple consoles or via the network. |
| 5                 | runlevel5.target, graphical.target                    | Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login.    |
| 6                 | runlevel6.target, reboot.target                       | Reboot                                                                                       |
| emergency         | emergency.target                                      | Emergency shell                                                                              |
+-------------------+-------------------------------------------------------+----------------------------------------------------------------------------------------------+

A razão que eu digo para ser legal é porque você não pode fazer isso sem avisar. Se um usuário estiver trabalhando em um sistema multiusuário, e outro usuário com permissões apropriadas usar seu software, o usuário que estiver trabalhando será sumariamente expulso do sistema (e conseqüentemente perderá todo o trabalho) até ser reiniciado, etc.

Como afirma Goldilocks, isso é o mais próximo que você conseguirá usando um método userspace. Todos os outros códigos estão armazenados no kernel, o que não consigo encontrar no momento, mas aqui está o Documento Relacionado ao gerenciamento de energia do driver , no arquivo do kernel do Linux

    
por 22.10.2014 / 19:05