Como exatamente o printk funciona internamente?

10

Eu sei que printfprecisa de ajuda do sistema operacional para fazer seu trabalho.

Eu também sei printfque não funciona no código fonte do Linux, pois não há biblioteca. E assim temos printkpara depuração.

Como printkfunciona quando o sistema operacional ainda está inicializando?

gpuguy
fonte

Respostas:

11

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. 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.

slm
fonte
4

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.cestá muito bem documentado. O acesso ao console parece ser controlado por semáforos. A mensagem também é injetada /dev/dmsg, independentemente da prioridade.

Cachinhos Dourados
fonte