Linux Boxを使用する場合は、bashをシェルとして使用します。ここでbashがELFファイルの実行をどのように処理するかを知りたいと思います。つまり、./programと入力すると、プログラムはELFファイルです。 bash-4.3.tar.gzをgrepしましたが、ファイルがELFかどうかを調べる一種の魔法パーサがないようで、 exec() システムコールも見つからないようです。
全体のプロセスはどのように行われますか? BashはELFの実行をオペレーティングシステムにどのように渡しますか?
答え1
BashはELFについて何も知りません。単に外部プログラムを実行するように要求したものを見て、指定した名前をそのまま渡します。execve(2)
。実行ファイル形式などの知識を理解し、シェルボーンライン、実行権限が後ろにありますシステムコール、カーネルから。
(他のシェルにも同様に適用されますが、使用することを選択できます。exec(3)
しかし、家族。 )
Bash 4.3では、5195行でこれが発生します。execute_cmd.c
shell_execve()
機能から。
ソースコードレベルでLinuxを理解したい場合は、コピーをダウンロードすることをお勧めします。Unix V6またはV7の研究と通過それ最新のLinuxシステムで見つかったすべての複雑さの代わりに。ライオンの本コーディングのための良いガイドです。
V7はどこにありますか?ボンシェルデビュー。完全なCソースコードは、BashのCファイルサイズの半分を少し超えています。これトンプソンシェルV6のサイズは元のBourneシェルサイズのほぼ半分です。しかし、これら2つの単純なシェルはすべてBashと同じことを行い、同じ理由もあります。 (これはThompsonシェルでの呼び出しexecv(2)
とBourneシェルモジュールでの呼び出しのようです。)texec()
execve()
execs()
service.c