2013-03-05 33 views
5

Linux x86/x64 üzerinde test ettiğim bazı kodlar var. Bir ARM işlemcisinde ne olacağını simüle etmek için yanlış hizalanmış verilerin otomatik olarak sabitlenmesini kapatmak istiyorum.Linux x86/x64: Yanlışlıkla hizalanmış veri düzeltmelerini kapatın

Windows'ta SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPT ile yapabilirim.

Linux'taki düzeltmeleri nasıl devre dışı bırakırım? Görmeyi beklediğim otobüs hatasını alamıyorum?

+0

, ben Tanımsız Davranışı Temizleyici buldum GCC ve Clang'ın burada yardımcı olması, yanlış hizalanmış yük tanımsız bir davranıştır (*** '-fsanitize = undefined' ***). – jww

cevap

6

Ben x86 ve x86_64 işlemciler (anahtar satan bir i386 veya i486 günden Intel'in mimarisi hakkının parçası olmuştur ve oldu gelmiştir tarafından desteklenen otomatik hizalama kapatmak mümkün olup olmadığını gerçekten oldukça emin değilim mimarlık için noktalar.

Kesme 17 Hizalama ara durum (#AC)

durum Sınıf Hata: Bölüm Interrupt 17—Alignment Check Exception (#AC) altında Intel® 64 and IA-32 Architectures Software Developer’s Manual, sayfa 6-45 dayanarak

.

Açıklama

hizalama etkinleştirilmiş Kontrolden işlemci bir hizalanmamış bellek işlenen tespit gösterir. Hizalama kontrolleri sadece veri (veya yığın) erişimlerinde (kod getirileri veya sistem segmenti erişimlerinde değil) gerçekleştirilir. Bir hizalama kontrol ihlali örneği, bir tek bayt adresinde depolanmış bir sözcük veya bir 4 numaralı tamsayı değil, bir adresinde saklanan bir ikili sözcüktür. Tablo 6-7, hizalama gereksinimlerini listeleyen çeşitli veri türlerini listeler. işlemci

Hizalama denetimi istisnasının (#AC) yalnızca kelime, çift dilli ve dörtlü sınırlarında hizalanması gereken veri türleri için oluşturulduğunu unutmayın. Genel koruma istisnası (#GP), 16 baytlık bir sınırda hizalanmayan 128 bit veri türleri oluşturulur. İçinde mecliste bu yapabileceğini Yani eğer

• AM flag in CR0 register is set. 
• AC flag in the EFLAGS register is set. 
• The CPL is 3 (protected mode or virtual-8086 mode). 

:

hizalama denetimi sağlamak için yerine getirilmesi gereken koşullar tarafından takip değişik veri türleri için hizalama gerekliliklerini tanımlayan bir tablo vardır Programınızın başlangıcı, muhtemelen bir hizalama istisnası elde edebilirsiniz.

Ayrıca #AC üretebilir sadece kullanıcı modu kodu gibi görünüyor: ayrıcalık düzeyinde 3 (kullanıcı modu) de çalışırken

Hizalama-çek istisnalar (#AC) sadece oluşturulur. ayrıcalık düzeyinde yapılan bir hafıza referansı kaynaklanan bu tür segmenti açıklayıcısı yüklenirken ayrıcalık düzeyine 0, varsayılan, hatta hizalama-çek istisnalar, üretemeyen Hafıza referansları 3.

Kullanıcı kodu direkt olarak ayarlayamıyor İşletim Sisteminden yardım almadan numaralı telefondan AM.

Sorunuzu yanıtlamak için, Linux'un zaten INT 17h koduna sahip olabileceği bir kod zaten olabilir, herhangi bir başvuruda bulunup bulunamayacağını görmek için çekirdek kaynaklarını incelemeyi deneyin. Mimariye özgü kod olmalıdır. Ayrıca

bazı işaretçiler size verebilir SO üzerinde bazı ilgili konuları: biraz önlem olarak