私はカーネルについて学習しようとしており、しばらくの間カーネルランドスケープを構成する基本的なデータ構造の一部を印刷しようとしていました。私の問題は、メモリアドレスが与えられた場合、そのアドレスの内容を印刷できるようにしたいということです。ポインタを指定してカーネル内からカーネルメモリにアクセスする
たとえば、私は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);
は、ここでは、この試みを行った後に発生するカーネルパニックのテールエンドです:
私が読み取りアクセスのためのセマフォを必要とするようだが、これはちょうど任意のアドレスではありませんか?
OS開発の経験から、ページ違反を引き起こしているように見えます。これは、ページングされたメモリにアクセスしようとすると発生します。残念ながら、私はあなたを助けるためにもっと多くのことを知らない。 – user99545