Respostas:
Esta referência parece ter respostas para suas perguntas, intituladas: Linux Kernel Development Second Edition .
excerto
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. Aprintk()
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 queprintk()
, 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.
Como o printK funciona quando o sistema operacional ainda está inicializando?
printk()
vai para o console, se possível, e a prioridade é alta o suficiente; Não sei em que momento o kernel inicializa um VT para tornar isso possível, mas é obviamente bastante cedo.
[src]/kernel/printk/printk.c
está muito bem documentado. O acesso ao console parece ser controlado por semáforos. A mensagem também é injetada /dev/dmsg
, independentemente da prioridade.