2012-02-10 17 views
10

x86-64 komut seti, çalıştırılabilir kodun düzenlenmesine yardımcı olmak için daha fazla kayıt ve diğer geliştirmeler ekler. Ancak, birçok uygulamada artan işaretçi boyutu bir yüktür. Her işaretçideki fazladan kullanılmayan baytlar önbelleği tıkar ve hatta RAM'i taşabilir. GCC, örneğin, -m32 bayrağı ile oluşturur ve bunun sebebi olduğunu varsayalım.x86-64 ISA ile 32 bit işaretçiler: neden olmasın?

32 bitlik bir değer yüklemek ve bunu bir işaretçi olarak ele almak mümkündür. Bu ekstra talimatlar gerektirmez, sadece 32 biti yükler ve hesaplar ve sonuçta ortaya çıkan adres. Ancak, platformlar farklı hafıza haritalarına sahip olduklarından, numara taşınabilir değildir. Mac OS X'te, adres alanının tüm düşük 4 GiB'si saklıdır. Yine de, yazdığım bir program için, gerçek 64 bit adresler üzerinde gelişmiş performans kullanmadan veya -m32 ile derleme yapmadan önce, 0x100000000L'u 32 bit "adresler" e eklemeye devam edin.

32 bit, x86-64 platformuna sahip olmak için herhangi bir temel engel var mı? Böyle bir chimera'yı desteklemenin herhangi bir işletim sistemine karmaşıklık katacağını ve son 20% 'nin sadece Make it Work ™' i istemesini isteyen herkesin var olduğunu düşünüyoruz, fakat yine de bunun çeşitli hesaplama yoğunluklu programlar için en uygun olacağını düşünüyor.

+0

Uygulamaların çoğunda profillerin oluşturulması, işaretçi boyutunun artması nedeniyle önemli bir kayıp olmadığını gösterir. – Puppy

+0

Intel Derleyicisi, ['Qauto-ilp32'] seçeneğine sahiptir (http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32 .htm) x64 modunda bile 32 bit biti işaretçileri kullanmaya çalışır. – Mysticial

+0

@Mysticial ama bu daha çok eski moda "yakın" ve "uzak" işaretçilere benziyor, değil mi? Bu çözüm tamam, sanırım, ama atıfta bulunduğum kadar temiz değil. – Potatoswatter

cevap

10

Geliştirmede linux için "x32" adlı bir ABI var. Tanımladığınız şeye benzeyen x86_64 ve ia32 arasında bir karışımdır - 64 bit kayıt seti kullanılırken 32 bit adres alanı. Özel bir çekirdek, binutils ve gcc'ye ihtiyaç duyar. Bazı SPEC çalıştırmaları bazı benchmarklarda yaklaşık% 30'luk bir performans artışı olduğunu gösterir. https://sites.google.com/site/x32abi/

+0

Bu gerçekten iyi bir bilgi. Soruyu sormak konusunda biraz emin değildim, çünkü onun ifadesi muhtemelen iyi bir cevabı engelliyordu. Ancak, kimeranı desteklemek için sadece bir platformun olması, farkın yeterince önemli olması durumunda, oyun alanını değiştirir. – Potatoswatter

-4

"x86-32 öykünmesi" veya Windows'ta WOW64 (muhtemelen diğer işletim sistemlerinde başka bir şey) olarak adlandırılır ve işlemcideki bir donanım bayrağıdır. Burada herhangi bir kullanıcı modu hilesi gerek yok.

+0

Bu kullanıcı tarafından erişilebilen bir bayrak mı? Yani işletim sisteminin kaydedilmesi/geri yüklenmesi ve desteklenmesi gerekiyor mu? – Potatoswatter

+0

Ah, baktı - http://en.wikipedia.org/wiki/WOW64. Hayır, bu sadece standart x86 kodunu çalıştırıyor, eski ISA sadece 8 kayıtlı, 64 bit işletim sisteminde çalışıyor. Sadece -32 'ile aynı. Diğer OS'lerin bu "özelliği" bir ad vererek rahatsız etmiyor sanmıyorum. – Potatoswatter

+0

@Potatoswatter: Ve bu, tam olarak nasıl tarif ettiğinizi anlamlı bir şekilde farklı mı? Amaca ulaşmak için kullanıcı modu hack yapmak yerine, işlemci bunu donanımda gerçekleştirir. Bu her zaman daha hızlı olacak. Bunu sağlayan bir derleyici bayrağı yok, bu bir donanım işlemci özelliği. – Puppy

0

Daha fazla bilgi için OS'de böyle bir modeli desteklemeyi çok zor beklemiyorum. Bu modeldeki süreçler için değişmesi gereken tek şey sayfa yönetimi, sayfalar 4 GB noktasının altında ayrılmalıdır. Çekirdek, aynı zamanda, tamponlarını uygulama alanına aktarırsa, sanal adres alanının ilk 4 GB'ından ayırmalıdır. Aynısı, uygulamaları yükleyen ve başlatan yükleyici için de geçerlidir. Bunun dışında bir 64 bit çekirdeği, bu tür uygulamaları büyük değişiklikler olmadan idare edebilmelidir.

Derleyici desteği de büyük bir sorun olmamalıdır. Çoğunlukla ekstra CPU kayıtlarını ve tam 64 bitini kullanabilen ve gerektiğinde uygun REX önekleri ekleyebilen bir kod oluşturma meselesi.

İlgili konular