4

私はカーネルについて学ぼうとしていますが、カーネルランドスケープを構成する基本的なデータ構造のいくつかを印刷しようとして失敗しました。私の問題は、メモリアドレスを指定して、そのアドレスの内容を印刷できるようにしたいということです。

たとえば、IDTの場所を決定する関数があります。(void *)のオーダーで戻ります0xffff81b8c0000fff。ただし、そのアドレスにあるものにしようとするprintkと、カーネルパニックが発生します。ユーザースペースからカーネルメモリにアクセスできないようにするための保護が設定されていることは理解していますが、読み取り可能と思われるstart_kernel内からこれを実行しようとしています。

コードは次のとおりです。

idt_ptr = sidt(); // returns (void *)
printk(KERN_INFO "680: IDT TABLE, FIRST ENTRY\n");
//entry is 64 bits
printk(KERN_INFO "680: %llx\n", *(unsigned long long *)idt_ptr);

この試行を行った後に発生するカーネルパニックの最後は次のとおりです。

ここに画像の説明を入力してください

読み取りアクセスにはセマフォが必要なようですが、これは単なる任意のアドレスではありませんか?

4

2 に答える 2

5

たとえば、IDT の場所を特定する関数があります。0xffff81b8c0000fff の順で (void *) を返す

char*等しい可能性がある以外のものへのポインターはありません。0x...ffそのアドレスは、s 以外のものを含むデータ構造へのポインターに対して適切に整列されていませんchar

結論: あなたのsidt関数は壊れており、偽のアドレスを返します。

于 2012-04-16T02:38:20.237 に答える
1

カーネル内をいじるには、 kdbを試してみることをお勧めします。

kdb パッチを適用したカーネルでKVMまたはqemu VM をセットアップしてみてください。

于 2012-04-16T03:26:42.523 に答える