私はカーネルについて学ぼうとしていますが、カーネルランドスケープを構成する基本的なデータ構造のいくつかを印刷しようとして失敗しました。私の問題は、メモリアドレスを指定して、そのアドレスの内容を印刷できるようにしたいということです。
たとえば、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);
この試行を行った後に発生するカーネルパニックの最後は次のとおりです。
読み取りアクセスにはセマフォが必要なようですが、これは単なる任意のアドレスではありませんか?