3

私はC++のLinuxプラットフォーム用のプロセスローダーに取り組んでいます。それは単なるレクリエーションプロジェクトです。基本的には、実行可能ファイルのすべてのセクションを手動でメモリにロードしてから実行したいと思います。

私は約1週間前に、ここで関連するがより具体的な質問をしました。しかし、さらに読んだ後、実際にプロセスを作成する方法を学ぶまで、メモリマッピングは無関係であることに気付きました。だから私の質問は、Linux上に独自の仮想アドレス空間(コードとデータをロードするためにアクセスできるようになる)を使用して「空白の」新しいプロセスを作成する方法はありますか?

プロセスローダーの開発に関する一般的なリソースでさえ、まだ見つけていないので役に立ちます。

4

2 に答える 2

3

Linuxプロセスローダーが舞台裏で実際に何をしているのかを知りたい場合exec()は、カーネルソースのコピーを取得して、内部を探してfs/exec.cくださいdo_execve_common()

ELFバイナリを実行しようとすると呼び出されるELFハンドラー自体は、に存在しますfs/binfmt_elf.c。特に、ディスクからプロセスイメージをロードするために必要な情報が含まれている場合load_elf_binary()、実際のロードは実行されますか。struct linux_binprm

binfmt_*.cLinuxがサポートするバイナリ形式のファイルがたくさんあることに注意してください。カスタムバイナリ形式を使用している場合、原則として、独自の形式を作成してカーネルモジュールとして提供できます。プロセスの読み込みの内部は、ユーザーモードのコードに対して不透明です(そして当然のことながら、そうでない場合は深刻なセキュリティホールが存在します)。

于 2012-08-08T20:00:29.383 に答える
1

fork()関数を使用して、親プロセスのレプリカを作成する新しいプロセスを作成し、execファミリ関数の1つを使用して、実行可能ファイルをロードして実行できます。

于 2012-08-08T18:50:30.233 に答える