Domanda

Anche se la mia comprensione che non c'è ragione fondamentale un programma scritto per hardware a 32 bit / OS non funziona su hardware a 64 bit / sistemi operativi, in pratica, ho trovato molti programmi destinati per le versioni a 32 bit di Windows che non funziona nelle versioni a 64 bit di Windows. Gli esempi includono una serie di utility di sicurezza popolari (la maggior parte dei prodotti da Norton e Check Zone Alarm Point) e diversi giochi (che ho cercato di ottenere Grand Theft Auto 4 a correre per un paio di settimane, ma senza alcun risultato - naturalmente, che potrebbero essere collegati a qualsiasi numero di altri problemi legati alla GTA4, ma questo è né qui né là).

Ho sentito che l'incompatibilità di un programma potrebbe derivare da qualcosa di semplice come il non voler correre dalla cartella "Program Files (x86)", ma quali sono alcuni degli altri motivi? Perché un programma antivirus o un firewall scritta per un sistema a 32-bit non eseguito su un sistema a 64 bit? Perché un gioco viene eseguito quando tutto è teoricamente compatibile all'indietro?

È stato utile?

Soluzione

La migliore spiegazione che ho trovato è offerti qui che dice fondamentalmente programmi a 32 bit vengono eseguiti su uno strato di emulazione che non consente l'accesso al sistema si otterrebbe da programmi nativi funzionare in un ambiente a 64 bit:

http://blogs.msdn.com/oldnewthing /archive/2008/12/22/9244582.aspx

Vorrei assumere questo significa che i problemi con programmi come GTA4 provengono dallo strato di emulazione di non produrre i risultati attesi trovati su un sistema nativo a 32-bit. Questo è il motivo per cui continui a vedere gli aggiornamenti di compatibilità di rilascio di Microsoft per tutto il tempo.

Ecco cosa MSDN ha da dire sulla questione:

http://msdn.microsoft.com/ it-it / library / bb427430 (VS.85) aspx

Altri suggerimenti

C'è un sacco di disinformazione su questo thread.

Quando un'applicazione a 32 bit viene eseguito su Windows a 64 bit:

  • La maggior parte dei problemi di compatibilità arrivano quando l'applicazione tenta di installare un driver in modalità kernel. Un driver a 32 bit non può essere installato sul sistema operativo a 64 bit. Questo è amost certamente il problema con un firewall. Si sta cercando di collegare in stack di driver TCP / IP.
  • NON C'È EMULATOR! Il codice oggetto 32 bit viene eseguito dalla CPU completamente nativo a piena velocità.
  • Non v'è alcun supporto per il vecchio codice a 16 bit. Questo ha rotto un sacco di programmi di installazione.
  • Accesso alle cartelle giuste è in generale non è un problema. Quando un programma a 32 bit apre un file, per esempio% windir% \ system32 \, il sistema operativo reindirizza automagicamente a% windir% \ syswow64. Lo stesso vale per alcune parti del Registro di sistema. Ci sono alcuni trucchi potenziale qui, ma sono generalmente lungo le linee di assumendo che vari WINAPI Get ... funzioni Elenco () restituiscono lo stesso stringhe che hanno fatto in Windows 95.
  • Se è stato compilato 10 anni fa o solo ieri, quindi i puntatori C / C ++ sono ancora 32 bit (4 byte) e tutto il codice che appena assunto che - tra cui SendMessage ()! -- funziona ancora. La questione puntatore 8 byte non arriva in scena fino a quando si inizia la conversione in compilatori a 64 bit.

I driver sono una storia diversa che i programmi: http://support.microsoft.com/kb/896456

Zone Alarm utilizza uno speciale driver a 32 bit creato da Check Point per fare il monitoraggio. Questo è probabilmente ciò che è di creare il problema con tale applicazione. Per quanto riguarda Grand Theft Auto 4? Non ho idea.

Non ci può essere qualsiasi numero di ragioni.

Qualsiasi applicazione che è programmato ad un livello basso potrebbe essere in attesa 32 registro bit. Il driver di Zone Alarm pubblicato da novatrust è un buon esempio. GTA4 potrebbe usare assieme per migliorare le prestazioni in diversi punti che potrebbero derivare da qualcosa o anche semplicemente assumendo 32 bit su C ++. Per esempio prendere il seguente codice:

struct GPoint
{
  int x;
  int y;
}

// Array of twenty GPoints
GPoint[] myArr = malloc(20 * sizeof(GPoint);

GPoint* myPointer = myArr;
int index = GetIndexAffectedPoint();

// Invert X and Y for the point
myPointer += 8*index;
swap(myPointer);

So che l'esempio è piuttosto ingenuo, ma in ogni caso, in quel codice si stanno assumendo sei struct è lungo 8 byte (4 byte del x intero e 4 byte per l'intero y), ma in un sistema a 64 bit è in realtà il doppio che a lungo così si finirà per scambiare il punto sbagliato ... cose del genere succedono un sacco sui linguaggi di basso livello, specialmente quando si cerca di migliorare le prestazioni ...

Applicazioni sicurezza sono un cattivo esempio. Tutti svolgono le cose non supportate contro le cose senza documenti. I cambiamenti tra una versione a 32 bit di Windows al successivo sono sufficienti per rompere loro, non importa passare a 64 bit.

Detto questo, ci sono alcuni spessori di compatibilità che Fixup il codice su 32 bit che non sarà quando l'applicazione è a 64 bit . Questo perché Microsoft presuppone che si sia provato a 64 bit.

Una risultante Gotcha è con NET applicazioni . Quando si esegue su un sistema a 32 bit, l'exe è jitted a 32 bit - dove ci sono compatibilità spessori per correggere i bug. Se il cliente sembra essere in esecuzione su un sistema a 64 bit, l'eseguibile verrà jitted a 64-bit, in cui tali spessori di compatibilità che si erano protetti da te stesso sono non è più presente.

Chris Jackson aveva un bel blog su questo: noreferrer Applicazioni spessoramento su Windows Vista 64-bit

Il problema è probabilmente driver. Con i giochi, è probabilmente un qualche tipo di schema DRM viscido. Prova ad ottenere il crack no-CD per il gioco in modo da poter funzionare senza DRM.

Se si utilizza il file system o il Registro di sistema, assicurarsi che si accedere alle cartelle di destra . Come un programma x86 probabilmente si vuole per accedere a "Program Files (x86)", "SysWOW64", "WOW6232Node" e tali cartelle al posto di quelli x64.

I prodotti con applicazioni x86 come Norton e Check Point Zone Alarm di non riescono a eseguire il loro autista x86, come il conducente ha bisogno di x64 per essere in grado di corse dal sistema operativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top