printk ()
A função de impressão do kernel printk()
se comporta quase de forma idêntica à printf()
função da biblioteca C. De fato, ao longo deste livro, não fizemos uso de nenhuma diferença real. Para a maioria das intenções, isso é bom; printk()
é simplesmente o nome da função de impressão formatada do kernel. No entanto, existem algumas diferenças.
A robustez do printk ()
Uma propriedade de printk()
rapidamente tomada como certa é sua robustez. A printk()
função pode ser chamada de qualquer lugar do kernel a qualquer momento. Pode ser chamado de interrupção ou contexto do processo. Pode ser chamado enquanto um bloqueio é mantido. Ele pode ser chamado simultaneamente em vários processadores, mas não exige que o chamador mantenha uma trava.
É uma função resiliente. Isso é importante porque a utilidade de printk()
repousa no fato de que ela está sempre lá e sempre funciona.
A não robustez da printk ()
Existe uma fenda na armadura da printk()
robustez. É inutilizável antes de um certo ponto no processo de inicialização do kernel, antes da inicialização do console. De fato, se o console não for inicializado, para onde a saída deve ir?
Normalmente, isso não é um problema, a menos que você esteja depurando problemas muito cedo no processo de inicialização (por exemplo, em setup_arch()
, que executa inicialização específica da arquitetura). Essa depuração é um desafio para começar, e a ausência de qualquer tipo de método de impressão apenas aumenta o problema.
Há alguma esperança, mas não muita. Os hackers de arquitetura hardcore usam o hardware que funciona (por exemplo, uma porta serial) para se comunicar com o mundo exterior. Confie em mim, isso não é divertido para a maioria das pessoas. Algumas arquiteturas suportadas implementam uma solução sã; no entanto, outras (incluindo o i386) têm patches disponíveis que também salvam o dia.
A solução é uma printk()
variante que pode saída para o console muito cedo no processo de inicialização: early_printk()
. O comportamento é o mesmo que printk()
, apenas o nome e sua capacidade de trabalhar anteriormente são alterados. Porém, essa não é uma solução portátil, porque nem todas as arquiteturas suportadas têm esse método implementado. Pode se tornar seu melhor amigo, se assim for.
A menos que você precise gravar no console muito cedo no processo de inicialização, você pode confiar printk()
para sempre trabalhar.