Eu sei que o comando dmesg imprime a mensagem armazenada em um buffer de anel. Mas, a partir do código-fonte do Linux, qual é o nome do buffer? Quero olhar para o buffer depois que o Linux for encerrado sem nenhuma mensagem. Suspeito que não seja por uma armadilha de software (portanto, nenhuma mensagem de pânico), mas posso examinar a memória (com algum System.map e conversão de endereço virtual para físico).
kernel/printk/printk.c (de um Kernel v4.18, já que esse é o Kernel no PC de onde você está digitando esta resposta) tem o seguinte que define o buffer de registro :
Olhando para
printk.c
:__log_buf
é um array com um tamanho definido durante a configuração do Kernel para garantir que haja um buffer de log durante a inicialização antecipada. O tamanho de__log_buf
é definido a partir doCONFIG_LOG_BUF_SHIFT
parâmetro config.setup_log_buf é chamado de boot e alocará espaço para um novo buffer de log se:
CONFIG_LOG_CPU_MAX_BUF_SHIFT
parâmetro de configuração).log_buf_len
é usado na linha de comando do Kernel para especificar um tamanho de buffer de anel maior que__LOG_BUF_LEN
.Quando um novo buffer de log é alocado:
__log_buf
é copiado para o novo buffer alocado.log_buf
é alterado para apontar para o novo buffer de anel.log_buf_len
é alterado para o tamanho do novo buffer de anel.O buffer de anel é acessado por meio do
log_buf
ponteiro elog_buf_len
do comprimento.Olhando para
/boot/System.map-`uname -r
um Kernel v4.18 é possível ver os endereços das variáveislog_buf
elog_buf_len
.Esta resposta deve mostrar como começar a examinar a memória que contém o buffer de anel. Veja
printk.c
para o formato interno do buffer de anel, que usastruct printk_log
. Não verifiquei quando o formato interno do buffer de anel mudou entre as versões do Kernel.