2011-10-21 13 views
8

:Segment kayıtlarını x86-64'te nasıl yorumlayabilirim? Bu fonksiyon ile

mov 1069833(%rip),%rax  # 0x2b5c1bf9ef90 <_fini+3250648> 
add %fs:0x0,%rax 
retq 

nasıl ikinci talimat yorumlamak ve Rax eklendi öğrenmek mı?

+3

Eğer linux altında çalışan ediyoruz Assming [bu] (http://stackoverflow.com/questions/6611346/amd64-fs-gs-registers-in-linux) soru alakalı olabilir. arasında – user786653

+1

Olası kopyalar [ "DS: \ [40207A \]"? ne yapar mecliste demek] (http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly) –

cevap

8

Bu kod:

mov 1069833(%rip),%rax  # 0x2b5c1bf9ef90 <_fini+3250648> 
add %fs:0x0,%rax 
retq 

bir iş parçacığı yerel değişkenin adresini döndürüyor. %fs:0x0, TCB'nin (Thread Control Block) adresidir ve 1069833(%rip), değişkenin programa ya da programın yüklenme zamanında yüklenen bazı dinamik kitaplığa (çalışma zamanında yüklenen kitaplıklar) sahip olmasından dolayı, değişkenin değişkenidir. dlopen() aracılığıyla bazı farklı kodlara ihtiyaç duyarsınız).

Bu özel Ulrich Drepper en TLS document büyük ayrıntılı olarak açıklanmıştır §4.3 ve §4.3.6 edilir.

3

Onların segmentli mimarisinin eski kötü günlerinden beri segmenti kayıt çağırıldım emin değilim. Doğru terimin bir seçici olduğuna inanıyorum (ama yanılıyor olabilirim).

Ancak, ben sadece fs alanındaki ilk quadword (64 bit) de ihtiyacım var.

%fs:0x0 bit fs:0 de hafıza içeriği anlamına gelir. Jenerik add'u (örneğin, addl yerine) kullandığınızdan, veri genişliğini hedef %rax'dan alacağını düşünüyorum.

Gerçek değeri almayla ilgili olarak, eski veya uzun modda olmanıza bağlı olarak değişir.

Eski modda, temel adresi almak için fs değerini almanız ve GDT'ye (veya muhtemelen LDT'ye) bakmanız gerekir. Uzun modda, ilgili modele özgü kayıtlara bakmanız gerekir. Eğer bu noktada olursanız maalesef uzmanlık düzeyimin ötesine geçtiniz.

+0

ben düşündüm çok, ama asıl adresi bir seçiciden nasıl alabilirim? Koşu sürecim yok, sadece çekirdek bir çöplük. –

+0

Korkarım ki uzun moddayım. –

+0

Evet, seçiciler dizinlerdir (örneğin LDT/GDT'yi belirten bir bayrak gibi). GDT/LDT'nin nerede olduğunu bilmek zorundasınız ve kesinlikle kayıt defterinden elde edebileceğinizden emin değilim. – paxdiablo

İlgili konular