Quando um sistema Linux hiberna e sai da hibernação, acho que o kernel precisa saber que está retomando, não inicializando. Caso contrário, o kernel iniciará o processo de inicialização normal e não carregará os dados trocados. Como o kernel sabe que está retomando?
A princípio, pensei que o GRUB (ou outro gerenciador de inicialização) informa o kernel pelos parâmetros do kernel. Mas, desde que eu verifique /proc/cmdline, os parâmetros do kernel são os mesmos de sempre. Existe algum mecanismo para o kernel saber que está retomando?
A hibernação funciona usando uma partição swap¹ para trocar as memórias de todos os processos, o estado do kernel, finalmente salvar algum estado da CPU e possivelmente outros dispositivos e, em seguida, desligar. No caminho, ele observa na partição swap que esta é uma imagem de hibernação.
Sair da hibernação funciona dizendo ao kernel para tentar sair de uma partição de troca, usando o
resume=
argumento do kernelresume=/dev/sda4
(se /dev/sda4 for sua partição de troca)resume=UUID=deadbeef-cafe-b00b-1337-123456123456
ou similar.O kernel durante a inicialização examina essa partição, encontra a nota na partição de troca que diz "ei, esta é uma imagem de hibernação" e restaura o dispositivo, o kernel e os processos a partir dela. Se a nota não estiver lá, ele inicializa normalmente.
Você pode verificar o código-fonte , especificamente a descrição da
software_resume()
função:Portanto, isso envolve duas instâncias do kernel, o "kernel de inicialização" e o "kernel de imagem" e o processo é descrito na documentação oficial do kernel , que também explica por que isso não é feito por meio do gerenciador de inicialização:
¹ Hoje em dia, também pode ser um arquivo de troca em muitos (a maioria?) sistemas de arquivos ou um volume LVM….