ページ保護違反をインターセプトするときにカーネル モジュールが使用するカスタムの「状態」値を格納するには、PTE の 2 ビットを使用する必要があります。
私はARM Cortex A9(ARM v7だと思います)を搭載したGalaxy Nexusで開発しています。Linux カーネル バージョン 3.0.31。Linux PTE 定義は次のとおりです ( からarch/arm/include/asm/pgtable.h
:
/*
* "Linux" PTE definitions.
*
* We keep two sets of PTEs - the hardware and the linux version.
* This allows greater flexibility in the way we map the Linux bits
* onto the hardware tables, and allows us to have YOUNG and DIRTY
* bits.
*
* The PTE table pointer refers to the hardware entries; the "Linux"
* entries are stored 1024 bytes below.
*/
#define L_PTE_PRESENT (_AT(pteval_t, 1) << 0)
#define L_PTE_YOUNG (_AT(pteval_t, 1) << 1)
#define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */
#define L_PTE_DIRTY (_AT(pteval_t, 1) << 6)
#define L_PTE_RDONLY (_AT(pteval_t, 1) << 7)
#define L_PTE_USER (_AT(pteval_t, 1) << 8)
#define L_PTE_XN (_AT(pteval_t, 1) << 9)
#define L_PTE_SHARED (_AT(pteval_t, 1) << 10) /* shared(v6), coherent(xsc3) */
この定義のリストを見るだけで、ビット 3、4、5、およびビット 11 以上が使用可能であるように見えます。ただし、上位 20 ビット [31:12] がページ番号 (PFN だと思います) に使用されていることがわかっているため、それらのいずれも使用できません。
ビット [5:3] を自由に使用できますか?それとも問題が発生しますか? これに対する答えを探すのに何時間も費やしましたが、Linux が x86 アーキテクチャで PTE ビットをどのように使用するかについてのドキュメントしか見つけることができません。
更新:
私は、各 PTE ビットが何であると私が信じているかのリストをまとめました。
bit 0 PRESENT
bit 1 YOUNG
bit 2 MEMORY TYPES 0 B FILE (only when not PRESENT)
bit 3 MEMORY TYPES 1 C
bit 4 AP0
bit 5 AP1
bit 6 DIRTY
bit 7 RD_ONLY
bit 8 USER
bit 9 XN
bit 10 SHARED
bit 11 EXT_NG (no idea what this is)
bit 12 |---|
... |PFN|
bit 31 |---|
残念ながら、読み取りまたは書き込みのアクセス許可を指定しない方法はわかりませんが、何とか機能mmap
しPROT_NONE
ているようです。読み取りまたは R/W のアクセス許可を指定する方法は知っていますが、ページにアクセス許可を持たないように設定する方法を知る必要があります。