2017-03-09 2 views
0

私はvsyscall_gtod_dataの内容を調べています(clock_gettime()を動作させるために必要な関連情報を常に保持しています)。vsdo varsを調べるには?

Iは__vdso_clock_gettimeのアセンブリコード(介して単一のステップにGDBを使用している)と私は、次のセクションを見ている:私は、次のCコードのアセンブリが(からであると考えて

0x00007ffff7ffaa71 <clock_gettime+129>: cmp eax,DWORD PTR [rbx] 
    0x00007ffff7ffaa73 <clock_gettime+131>: je  0x7ffff7ffaa47 <clock_gettime+87> 
    0x00007ffff7ffaa75 <clock_gettime+133>: jmp 0x7ffff7ffaa56 <clock_gettime+102> 
    0x00007ffff7ffaa77 <clock_gettime+135>: pause 
    0x00007ffff7ffaa79 <clock_gettime+137>: mov r12d,DWORD PTR [rbx] 
=> 0x00007ffff7ffaa7c <clock_gettime+140>: test r12b,0x1 
    0x00007ffff7ffaa80 <clock_gettime+144>: jne 0x7ffff7ffaa77 <clock_gettime+135> 
    0x00007ffff7ffaa82 <clock_gettime+146>: mov eax,DWORD PTR [rip+0xffffffffffffd5fc]  # 0x7ffff7ff8084 
    0x00007ffff7ffaa88 <clock_gettime+152>: mov DWORD PTR [rbp-0x1c],eax 
    0x00007ffff7ffaa8b <clock_gettime+155>: mov rax,QWORD PTR [rip+0xffffffffffffd61e]  # 0x7ffff7ff80b0 
    0x00007ffff7ffaa92 <clock_gettime+162>: mov QWORD PTR [rsi],rax 
    0x00007ffff7ffaa95 <clock_gettime+165>: mov edx,DWORD PTR [rip+0xffffffffffffd5e9]  # 0x7ffff7ff8084 
    0x00007ffff7ffaa9b <clock_gettime+171>: mov r10,QWORD PTR [rip+0xffffffffffffd616]  # 0x7ffff7ff80b8 
    0x00007ffff7ffaaa2 <clock_gettime+178>: cmp edx,0x1 
    0x00007ffff7ffaaa5 <clock_gettime+181>: je  0x7ffff7ffabc0 <clock_gettime+464> 

Linuxベース4.8.0 /アーチ/ x86の/含む/ ASM/vgtod.h):

static inline unsigned gtod_read_begin(const struct vsyscall_gtod_data *s) 
{ 
    unsigned ret; 

repeat: 
    ret = ACCESS_ONCE(s->seq); 
    if (unlikely(ret & 1)) { 
     cpu_relax(); 
     goto repeat; 
    } 
    smp_rmb(); 
    return ret; 
} 

(アセンブリ命令pausecpu_relax()と一致)

私はstruct vsyscall_gtod_data *srbxで開催され、アドレスはこの命令に読まれることを理解したよう:

mov r12d,DWORD PTR [rbx] 

デバッグプログラムがこのアドレスを読み取ることができますが、私はGDBでそれを検討しようとすると、私はエラーを取得することを意味:

(gdb) x $rbx 
0x7ffff7ff8080: Cannot access memory at address 0x7ffff7ff8080 
(gdb) 

何が起こっているのか、どのようにそのメモリを調べるのですか?

答えて

0

「特権レベル」が0(OSレベル)の場合にのみアクセスできるメモリロケーションにアクセスしようとしていると思います。その名前で私を信用しないでください、私はインテルのマニュアルで数日前にそれを読んだので、専門用語が間違っているかもしれないので、コンセプトは正しいはずです。

私は100%sudoには十分だとは思っていませんが、試しても痛いことはありません。私はいくつかの命令カウントレジスタが同様の問題を抱えていることを知っていて、sudoの場合はユーザー空間からアクセスできます。

関連する問題