2013-03-05 14 views
5

Ho un codice che sto testando su Linux x86/x64. Voglio disattivare il fissaggio automatico dei dati disallineati per simulare cosa succederebbe su un processore ARM.Linux x86/x64: Disattiva le correzioni di dati non allineati

Su Windows, posso farlo con SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPT.

Come disabilitare le correzioni su Linux? Non ricevo l'errore del bus che mi aspetto di vedere?

+0

Come un gap fermata, ho trovato il comportamento indefinito Sanitizer per GCC e Clang essere utili qui perché il carico disallineato è un comportamento indefinito (*** '-fsanitize = undefined' ***). – jww

risposta

6

Sono davvero non del tutto sicuro se è possibile disattivare l'auto-allineamento supportata da x86 e x86_64 processori (che ha fatto parte della giusta architettura di Intel dai i386 o i486 giorni ed è stato uno dei più venduti chiave punti per l'architettura).

Sulla base di Intel® 64 and IA-32 Architectures Software Developer’s Manual, pag 6-45 nella sezione Interrupt 17—Alignment Check Exception (#AC):

interrupt 17-allineamento Check Exception (#AC)

Eccezione Classe guasto.

Descrizione

indica che il processore ha rilevato un operando memoria ottenibile quando allineamento checking abilitata. I controlli di allineamento vengono eseguiti solo in accessi di dati (o stack) (non nel recupero del codice o negli accessi al segmento di sistema ). Un esempio di violazione dell'allineamento-controllo è una parola memorizzata a un indirizzo di byte dispari o una doppia parola memorizzata in un indirizzo che è non un multiplo intero di 4. La tabella 6-7 elenca i requisiti di allineamento vari tipi di dati riconosciuti da il processore.

Si noti che l'eccezione di controllo di allineamento (#AC) viene generata solo per i tipi di dati che devono essere allineati sui limiti di parola quadrupla. Un'eccezione di protezione generale (#GP) viene generata a 128 bit tipi di dati che non sono allineati su un limite di 16 byte.

C'è una tabella che descrive i requisiti di allineamento per i diversi tipi di dati, seguita dalle condizioni che devono essere soddisfatte per consentire la verifica di allineamento:

• 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). 

Quindi, se si potesse farlo in assemblea nella all'inizio del tuo programma, potresti probabilmente ottenere un'eccezione di allineamento.

Inoltre sembra che solo il codice in modalità utente può generare #AC:

eccezioni Allineamento-check (#AC) vengono generati solo quando si opera a livello di privilegi 3 (modalità utente). i riferimenti di memoria che di default per livello di privilegio 0, come ad esempio i carichi descrittore di segmento, non generano eccezioni allineamento-controllo, anche se causata da un riferimento di memoria a base di livello di privilegio 3.

codice utente non può impostare direttamente AM in CR0 senza l'aiuto del sistema operativo.

Quindi per rispondere alla tua domanda, Linux potrebbe già avere il codice per la gestione di INT 17h, provare a scavare attraverso i sorgenti del kernel per vedere se è possibile trovare riferimenti. Dovrebbe essere nel codice specifico dell'architettura.

anche alcune discussioni correlate sul SO che potrebbero darvi alcune indicazioni:

Problemi correlati