3.0 以前のカーネルでカーネルスレッドを検出する

3.0 以前のカーネルでカーネルスレッドを検出する

procのマンページ(http://man7.org/linux/man-pages/man5/proc.5.html)値()/proc/<pid>/statを見ると、どのプロセスがカーネルスレッドであるかを確認できます。flagsPF_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.

このプロセスフラグ(PF_KTHREAD)はカーネルバージョン2.6.18(RHEL5で使用されている)には存在しないように見え、この値は他のフラグで使用されます。

pidがカーネルスレッドであることを確認する別の方法はありますか?

答え1

経験的には、以下を参照してください。https://stackoverflow.com/questions/12213445/identifying-kernel-threads

psそしてtopprocps-3.28)「コマンドラインなし」を検査として使用し、理解していませんPF_KTHREAD。これが[``]プロセス名に追加される理由です。いいえ実際のプロセス名の一部です。コマンドラインはプロセス自体の制御を受けているため、変更された可能性があります。

どのくらいの距離に戻るかによって異なります(2.4?2.2?)。一部のシステムをすばやく検索すると、明確な共通署名は表示されません(フィールド9 /proc/PID/stat)。

2.6.x以降のバージョンでは、親のPIDが0であると推測できます。[kthreadd]通常、PIDは2で、すべてのスレッドは対応する子になります(initPPID = 0にすることもできます)。それとも(初期2.6.x?)、[kthread]PID 2ではなく、すべてのスレッドではなく、ほとんどのスレッドである可能性があります。

別の方法は、カーネルスレッドの空のユーザー空間メモリマップを確認することです/proc/PID/maps。したがって、プロセスフラグ(in /proc/PID/stat)が空でない&(PF_EXITING)限り/proc/PID/maps空であることは良い指標です。サイズが 0 と誤って報告されているため、実際に読み取る必要があり、maps権限stat()も受け取る必要があります。そうしないと、エラーなしで空白としてマークされることがあります。

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

cmdline同様の式を追加して空であることを確認することもできます。

答え2

3.8シリーズカーネルのカーネルスレッドエントリを見ると、明らかにリンクは空/procでゼロで埋められており、exeすべてのエントリが欠けていて空です。statmstatusVm*maps

おそらく、これらのいくつかは問題の古いカーネルに適用されるかもしれません。

関連情報