Detectando thread do kernel em kernels pré-3.0

2

Olhando para a página man proc ( link ) é possível detectar qual Processos são threads do kernel em /proc/<pid>/stat , observando o valor flags ( PF_KTHREAD )

flags %u (%lu before Linux 2.6.22)
     (9) The kernel flags word of the process.  For bit
     meanings, see the PF_* defines in the Linux kernel
     source file include/linux/sched.h.  Details depend
     on the kernel version.

Este sinalizador de processo ( PF_KTHREAD ) parece não existir na versão do kernel 2.6.18 (usada no RHEL5), o valor é usado por um sinalizador diferente.

Existe outro método para determinar se um pid é um segmento do kernel?

    
por tMC 18.10.2013 / 18:48

2 respostas

4

Heuristicamente, consulte o link

ps e top (de procps-3.28 ) usam "nenhuma linha de comando" como verificação e não têm conhecimento de PF_KTHREAD . É isso que os aciona para adicionar [''] ao nome do processo, não é parte do nome do processo real. Como a linha de comando está sob controle do processo em si, é possível que ele tenha sido modificado.

Depende de quão longe você está (2.4? 2.2?). Um rápido remexer em alguns sistemas indica que não há bandeira comum evidente (campo 9 de /proc/PID/stat )

No final de 2.6.x você pode adivinhar principalmente pelo PID pai sendo 0 para [kthreadd] , que frequentemente terá PID 2, e todos os segmentos serão seus filhos ( init pode ter PPID = 0 também). Ou possivelmente (início 2.6.x?) A [kthread] , mas não PID 2, mas pode ser apenas o pai da maioria, não de todos os threads.

Outra maneira é inspecionar /proc/PID/maps (mapa de memória do espaço do usuário), pois um encadeamento do kernel estará vazio - assim, o sinalizador de processo (em /proc/PID/stat ) não será &(PF_EXITING) , /proc/PID/maps sendo vazio é um bom indicador. Note que você deve realmente ler maps , não apenas stat() , já que o tamanho é incorreto como 0; e você também deve ter permissão, se não aparecer, pode parecer vazio sem causar um erro.

for pp in /proc/[0-9]*; do 
  if [ -z "$(< $pp/maps)" ]; then echo ${pp##/proc/}; fi; 
done 

Você pode adicionar uma expressão semelhante para verificar se cmdline também está vazio.

    
por 18.10.2013 / 20:29
0

Examinando a entrada /proc de um encadeamento do kernel em um kernel da série 3.8, aparentemente o link exe está vazio, o statm está cheio de zeros, o status está faltando todas as entradas Vm* e o maps está vazio também.

Talvez alguns deles se apliquem ao kernel antigo em questão.

    
por 18.10.2013 / 19:10