2017-03-09 95 views
0

我想檢查一下vsyscall_gtod_data的內容(所有的時間保持clock_gettime()工作所需的相關信息)。如何檢查vsdo變量?

我使用gdb進行單步通過__vdso_clock_gettime的彙編代碼()和我看的以下部分:

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> 

,我相信是用於下面的C代碼的程序集(從Linux的4.8.0 /拱/ 86 /包含/ 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; 
} 

(組裝指令pause匹配cpu_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(操作系統級別)才能訪問的內存位置。不要相信我的名字,幾天前我在英特爾手冊上看過它,所以我可能會弄錯行話,但這個概念應該是正確的。

我不是100%確定這將足以sudo,但嘗試不會傷害。我知道一些指令計數寄存器有類似的問題,如果您使用sudo,可以從用戶空間訪問它們。