6

別の syscall テーブルを使用して独自のカスタム カーネルを構築したいと考えていました。(同じシステムコールですが、位置/番号が異なります)

私はカーネル 3.2.29 で作業していました。

カーネルの変更は非常に簡単でした:

1) arch/x86/kernel/syscall_table_32.S の syscall 位置を変更する</p>

2) arch/x86/include/asm/unistd_32.h の syscall マクロ番号を変更する

3) 新しいカーネルのコンパイルとインストール

私はシステムコールを入れ替えました:sys_openの場所と数を取りましたsys_read

カーネル ヘッダーを変更してコンパイルすればglibc、システムを実行できると考えましたが、残念ながらそれだけでは十分ではなく、システムが起動しません。

何か不足していますか?システムを稼働させるには、他に何をする必要がありますか?


私が取った手順は次のとおりです。

1)私の質問で説明されているようにカーネルを構築してインストールする

2)を使用して新しいカーネルヘッダーを抽出するmake headers_install INSTALL_HDR_PATH=[path]

3) パラメータを使用して glibc を構築する--with-headers=[path/include]

4) 新しい をインストールするために、ライブ CD を使用して外部からファイル システムにアクセスしましglibcmake install install_root=[the original file system](インストール中にシステムが壊れないようにするため)。

新しいものが適切に構築されたことを願っていglibcますが、よくわかりません。

その後、システムをブートすると、ブートが (initrafms) シェル画面で停止しinitrdます。

4

4 に答える 4

1

すべてを再構築する必要があります。すべてのバイナリが動的にリンクされている場合でも、C 関数の多くが単にreturn syscall(__NR_somecall,...).

これは手動で行うこともできますが、buildroot や aboriginal などのクロス コンパイル可能なツールチェーンを使用しない限り、ツールチェーンをまっすぐに保つのは難しい場合があります。あなたに最も適したものを選んでください(私はロブ・ランドリーのアボリジニが好きです - http://landley.net/aboriginal/

次に、{z,bz,xz}cat oldinit.rd |cpio -id; を使用して古い initrd を展開するだけです。rm oldinit.rd. 古いカーネル モジュール、ライブラリ、およびバイナリを新しい cpio に置き換えて圧縮し直します (cpio には -H newc オプションが必要です) ... または、カーネルを再構築して initramfs をそのディレクトリに向けることができますが、お勧めしません。たとえば、まったく新しいシステムコール構造をテストしていて、多くのデバッグを行う必要がある場合など、initrd を頻繁に変更する必要がある場合。

于 2013-02-22T22:41:47.290 に答える
0

どの時点で起動が失敗するかはわかりませんが、カーネルが起動した場合でも、元のsyscall番号がハードコーディングされているため、initrd圧縮RAMディスクに含まれる重要なプログラムが失敗する可能性があります。それらも再構築して再パッケージ化する必要があります。

最初にinitを静的なhello-worldタイプのプログラムに置き換えて、カーネルがユーザースペースをサポートできることを確認することを検討してください。次に、最新のLinuxユーザースペースのすべての複雑さを一致させる方法の詳細を調べます。

于 2012-11-30T15:58:00.460 に答える
0

システムコール番号をスクランブリングすることは本当に痛いです。少なくとも、システムとinitrd(使用している場合)で静的にリンクされたすべてのバイナリを再構築する必要があります。

于 2012-11-30T13:54:05.607 に答える
0

pansic dump のメッセージの読み方を学び、kenrel のパニックを示す必要がありました。この情報がなければ、人々はあなたを助けたり、有用な提案を提供したりすることはほとんどできません.

于 2012-12-12T01:54:38.953 に答える