2

VMALLOC_START と VMALLOC_END の間のページを反復処理しており、毎回取得するアドレスが有効かどうかを確認したいと考えています。どうすればこれを管理できますか?

次のようにページを繰り返します。

unsigned long *p;

    for(p = (unsigned long *) VMALLOC_START; p <= (unsigned long *) (VMALLOC_END - PAGE_SIZE); p += PAGE_SIZE)
    {
            //How to check if p is OK to access it?     

    }

ありがとう!

4

1 に答える 1

2

最も簡単な方法は、それを赤くして例外をキャッチすることです。

例外のキャッチは、__ex_tableインラインアセンブリを使用して、セクションにエントリを定義することによって行われます。
例外テーブルエントリには、メモリアクセス命令へのポインタとリカバリアドレスへのポインタが含まれています。この命令でセグメンテーションフォールトが発生した場合、EIPはリカバリアドレスに設定されます。

このようなもの(私はこれをテストしませんでした、私は何かが欠けているかもしれません):

void *ptr=whatever;
int ok=1;
asm(
    "1: mov (%1),%1\n"    // Try to access
    "jmp 3f\n"            // Success - skip error handling
    "2: mov $0,%0\n"      // Error - set ok=0
    "3:\n"                // Jump here on success
    "\n.section __ex_table,\"a\""
    ".long 1b,2b\n"       // Use .quad for 64bit.
    ".prev\n"
    :"=r"(ok) : "r"(ptr)
);
于 2012-06-21T10:46:18.180 に答える