2010-11-28 8 views
9

Şu anda Robert Love tarafından 'Linux Kernel Development' okuyor ve bu montajın ne yaptığını anlamıyorum.linux kernel development

Temel olarak, her işlem çekirdeği yığında, yığının sonunda bulunan bir struct thread_info vardır. Şimdi x86 mimarisine, görünüşte şu takımını kullanarak bu (varsayarak 8KB yığın boyutu) yakalayabilir

movl $-8192, %eax 
andl %esp, %eax 

Yani temelde ANDing 0xffffe000 yığın işaretçisi. Burada neler olduğu konusunda kafam karıştı mı? En az 13 bit %esp maskelemenin neden yapısını yapmamızı anlamıyorum. Açıklanınca aptalca hissedeceğimi biliyorum, ama bu beni rahatsız ediyor.

Teşekkürler.

+0

Şu anda bu kitabı okuyorum ve daha da temel sorularım var: -8192'nin '0xffffe000' olduğunu nereden biliyorsunuz? CPU kayıtlarında negatif sayılar nasıl saklanır? –

cevap

5

Yığın aşağı doğru büyür, böylece yığının ucu yığındaki en düşük adres ve yapının başlangıç ​​adresidir. Ve yığınlar 8KB'nin katlarında saklanır. Bu nedenle, 13 en az anlamlı bitin silinmesi yığının en düşük adresini ve dolayısıyla yapının başlangıcını alır. Bu mantıklı mı?

+0

Ama% esp'in yığının altına işaret ettiğini düşündüm? Yapı sondaki yığına itildiğinde,% esp azaltılır. – tbh

+0

Yığın, yüksek bellek adresinden başlar (şeyler itildiğinde, yığın işaretçisi azalır). % esp, yığının altına işaret eder, yani yığının büyümesine izin verilen boşluğun tabanından ziyade "geçerli" tabana işaret eder. – lijie

+0

Ah, bkz. Süreç başlatıldığında ve kendi yığını verildiğinde yığının çukurunda aşağı doğru itmek yerine her şeyin sonu. Tamam, teşekkürler lijie – tbh