Cum se rulează un program în modul pe 64 de biți

La urma urmei, computerul dumneavoastră rulează pe o versiune de Windows pe 64 de biți. Dacă deschideți „Watch Manager”, veți vedea că majoritatea programelor de pe sistemul dumneavoastră sunt pe 32 de biți. Este aceasta cu adevărat o problemă?

Există o mulțime de opțiuni între versiunile de Windows pe 64 și 32 de biți. Versiunile pe 64 de biți ale Windows pot fi convertite în versiuni pe 32 de biți software de securitate Cu toate acestea, versiunile pe 32 de biți ale Windows nu pot accesa software-ul pe 64 de biți.

Cum să aflați despre capacitatea programelor?

Să verificăm cu dispecerul pentru a vedea ce programe sunt pe 64 de biți și care sunt pe 32 de biți. Faceți clic dreapta pe panoul de activități și selectați „Manager de activități” sau apăsați combinația de taste Ctrl+Shift+Esc pentru a o deschide.

Uimește-te de toate numele proceselor. Dacă utilizați versiunea pe 64 de biți a Windows 8.1 sau 8, veți adăuga cuvântul „(32 de biți)” după numele versiunii pe 32 de biți a programului. Dacă utilizați versiunea pe 64 de biți a Windows 7, veți vedea „*32”.

Programele pe 32 de biți sunt instalate în folderul C:\Program Files (x86)\ pe cele pe 64 de biți versiuni Windows, în acel moment sunt instalate programe pe 64 de biți în folderul C: Program Files.
Este doar o regulă. Inutil să spun că nu există nicio altă regulă care să interzică instalarea de programe pe 64 de biți în folderul C: Program Files (x86). De exemplu, Steam este un program pe 32 de biți, deci este instalat în „C: Program Files (x86)” pentru instalare. Jocurile pe care le instalați pe Steam sunt instalate în folderul C: Program Files (x86) Steam pentru instalare, incl. Descărcați versiuni de jocuri pe 64 de biți.

Dacă comparați două foldere diferite de fișiere de program, veți descoperi că majoritatea programelor dvs. sunt probabil instalate în folderul C:\Program Files (x86). Eu, chiar și cu programe mai mari, sunt pe 32 de biți.


Rulează software pe 32 de biți pe un sistem de operare pe 64 de biți

La prima vedere, pare lacom că mai mult de-al tău program Windows Nu faceți compromisuri cu arhitectura pe 64 de biți a sistemului de operare S-ar putea să credeți că există o penalizare de productivitate pentru rularea programelor pe 32 de biți pe un sistem de operare pe 64 de biți, dar nu este cazul.

Windows convertește programele pe 32 de biți prin versatilitatea WoW64 pe versiunile de Windows pe 64 de biți. Cu toate acestea, pe 64 de biți procesoare IntelȘi AMD înapoi este nebun și poate converti cu ușurință software-ul pe 32 de biți. Toate programele tale Windows pe 32 de biți funcționează la fel ca pe o versiune de Windows pe 32 de biți. Astfel, există multe coduri hard pentru a trece la instalarea multor programe pe 64 de biți sistem de operare.

Cu toate acestea, dacă programul de skin pe care îl utilizați este încă pe 32 de biți, veți beneficia de faptul că sistemul dvs. de operare în sine rulează în modul pe 64 de biți. Și versiunea pe 64 de biți a Windows este sigură.

Programe pe 64 de biți și programe pe 32 de biți: care este mai bine?

Programele pe 32 de biți rulează fără probleme pe versiunile pe 64 de biți ale sistemelor de operare Windows. Ar fi mai bine dacă toate programele tale ar fi pe 64 de biți?

Există absolut avantaje pentru programele pe 64 de biți. Programele pe 32 de biți pot consuma doar 2 GB de memorie, în timp ce programele pe 64 de biți pot consuma mult mai mult. Pentru că programul, care era cel mai bun pentru toate, a fost distrus de atac, funcții suplimentare Puteți ajuta dacă trebuie să vă ocupați de cum să instalați programe pe 64 de biți. Google ChromeÎn prezent, un add-on pe 32 de biți este disponibil pe versiunile de Windows pe 64 de biți, dar a apărut deja o versiune pe 64 de biți a acestui program. Și Google promite că versiunea pe 64 de biți a Chrome va fi mai rapidă, mai sigură și mai stabilă.


Toate programele au versiuni pe 64 de biți. De exemplu: Photoshop, iTunes, Microsoft Office, și acțiuni din cele mai populare programe pentru Windows și toate sunt disponibile într-o vizualizare pe 64 de biți. Restul jocurilor De asemenea, sunt adesea pe 64 de biți, astfel încât să poată folosi mai mult de 2 GB de memorie.


Multe programe nu au făcut tranziția la 64 de biți și majoritatea nu vor fi cruțate. Puteți rula în continuare majoritatea programelor Windows pe 32 de biți de astăzi, inclusiv cele care au fost lansate în urmă cu zece ani, pe o versiune de Windows pe 64 de biți, chiar dacă furnizorii lor sunt deja actualizați.

Un comerciant cu amănuntul care dorește să ofere o versiune pe 64 de biți a programelor lor poate descărca o gamă largă de instrumente suplimentare. Trebuie să vă asigurați că codul original se compilează și rulează corect ca un program de securitate pe 64 de biți. Sunteți responsabil pentru securizarea și susținerea a două versiuni diferite ale programului, deoarece utilizatorii Windows care rulează versiunea pe 32 de biți a Windows nu pot rula versiunea pe 64 de biți.

Să luăm ca exemplu programul Evernote pentru versiune desktop Windows. Aparent, dacă ar fi lansat o versiune de Evernote pe 64 de biți, dezvoltatorii, cel mai probabil, nu ar fi observat diferența. Un program pe 32 de biți poate rula foarte bine pe o versiune de Windows pe 64 de biți și, deși nu există avantaje semnificative, nu există nicio diferență în versiunea pe 64 de biți.

Cum să găsiți programe pe 64 de biți

De regulă, nu veți alege între versiunile de software pe 32 și 64 de biți. De exemplu, când instalați iTunes pentru Windows, site-ul web Apple vă direcționează automat către versiunile pe 32 de biți sau 64 de biți ale programului de instalare împreună cu versiunea de Windows. Când instalați Photoshop pentru Windows, asigurați-vă că sunt instalate atât fișierele pe 32 de biți, cât și cele pe 64 de biți. Photoshop selectează automat їх. Uneori puteți adăuga mai multe informații pentru a descărca versiuni de programe pe 32 și 64 de biți, dar nu atât de mult.

Este important să nu căutați programe pe 64 de biți, ci să aflați programele care funcționează cel mai bine pentru dvs. Pentru majoritatea programelor, chiar nu contează dacă este o versiune pe 64 de biți sau o versiune pe 32 de biți.


Este ușor să furnizați energie, motiv pentru care există atât de multe suplimente pe 32 de biți, dacă deschideți managerul de activități. Nu este chiar o problemă mare, de aceea. Pentru că majoritatea programelor nu câștigă nimic prin trecerea la edițiile pe 64 de biți ale versiunii programului. Cu toate acestea, deoarece dezvoltatorii au făcut toată munca și au lansat versiuni pe 64 de biți ale tuturor programelor și utilitarelor desktop mici pe care le utilizați pe Windows, nu veți putea face diferența pentru majoritatea dintre ele.

Când a apărut Windows pe 64 de biți, puterea a scârțâit. Suport pentru programe pe 32 de biți, drivere și tot ce este acceptat de arhitectura x86. Instalarea și particularitățile programelor vikoristannya. Au introdus limite pentru programele pe 32 de biți. Sprijin pentru vechile regimuri și multe altele. Tot prețul nu putea fi pierdut pe o parte. Chiar și stratul de degradare pe 32 de biți este prea mare, iar în mediul de mijloc pe 64 de biți există puține lucruri care pot fi înlocuite, cel puțin dintr-o dată.

Acest articol analizează subsistemul Windows pe Windows 64 (WOW64) și metodele care permit Windows să accepte programe pe 32 de biți pe un sistem pe 64 de biți.

Notă: Prima încercare de a introduce sisteme pe 64 de biți a fost un eșec și au existat semne de succes real. În acel moment, era dificil să găsești drivere pentru sistemele pe 64 de biți. Fără să vorbim măcar despre programe, ar fi o diferență notabilă. Upgrade la 3 GB RAM, La nebunie, astăzi avantajul este puternic, dar în acel moment era mai degrabă un slogan strident.

Dispozitive care acceptă programe pe 32 de biți pe Windows pe 64 de biți

De la Windows 32 la Windows 64 (WOW64)

WOW64 acceptă Windows pe 32 de biți

În Windows 64, programele pe 32 de biți sunt instalate într-un sistem de operare emulat pe 32 de biți, numit Windows 32 pe Windows 64 sau, pe scurt, WOW64. Sarcinile principale ale WOW64 sunt reorganizarea și procesarea tuturor clicurilor de sistem din programele pe 32 de biți.

Pentru procesarea sistemului multifuncțional, WOW64 creează un răspuns de sistem pe 64 de biți, transformând structurile de date de 32 de biți în structuri externe de 64 de biți. Apoi, clicul de sistem pe 64 de biți este transmis nucleului sistemului de operare pentru procesare. Toate datele de ieșire dintr-un clic pe 64 de biți vor fi procesate și transmise în formatul pentru care programul este licențiat. Cu alte cuvinte, puteți de fapt să porniți nucleul de sistem pentru a fi pe 64 de biți. Subsistemul WOW64 acționează doar ca un intermediar, deghizând datele în formate externe.

La fel ca programele pe 32 de biți, WOW64 este numit după numele de utilizator, astfel încât beneficiile care pot fi primite în timpul reorganizării clicurilor de sistem vor fi primite la același nivel cu utilizatorul. Și nu vă încurcați cu nucleul sistemului de operare pe 64 de biți.

Faptul că WOW64, ca program pe 32 de biți, este instalat în modul client, explică motivul lipsei suportului pentru driverele pe 32 de biți. Cu alte cuvinte, pentru a rula corect, driverele necesită modul kernel, pe care WOW64 nu îl poate oferi. Deoarece aveți Windows pe 64 de biți, toate driverele trebuie să fie pe 64 de biți.

Emulatorul WOW64 este construit pe cele mai recente biblioteci pe 64 de biți:

Notă: Acestea sunt singurele biblioteci pe 64 de biți care sunt incluse în procesul pe 32 de biți

  • Wow64.dll este infrastructura de bază a sistemului de emulare. Conectează apelurile către punctele de intrare Ntoskrnl.exe
  • Wow64Win.dll - trimite clicuri către punctele de intrare Win32k.sys
  • Wow64Cpu.dll - comută procesorul între modurile pe 32 de biți și pe 64 de biți
  • Ntdll.dll – versiunea pe 64 de biți a lui Wow64.

Wow64.dll descarcă versiunea pe 32 de biți (x86) a lui Ntdll.dll și toate bibliotecile necesare pe 32 de biți, care au dispărut în mare parte fără modificări. Cu toate acestea, unele dintre aceste biblioteci pe 32 de biți au fost încă modificate pentru a se potrivi corect în WOW64. De regulă, astfel de modificări au fost făcute prin intermediul celor care interferează cu RAM-ul componentelor sistemului pe 64 de biți.

Efectuarea fișierelor și ajustarea registrului în WOW64

Pe lângă funcția de reluare și procesare a apelurilor de sistem, interfața WOW64 asigură, de asemenea, că fișierele și setările de registry pentru programele pe 32 de biți sunt salvate împreună cu fișierele și cheile de registry pentru programele pe 64 de biți. Pentru a atinge acest obiectiv, WOW64 folosește două mecanisme. Redirecționarea fișierelor către registry, precum și duplicarea cheilor de registry. Redirecționarea încurajează o prezentare logică a datelor și le afișează ca și cum programul ar rula pe Windows pe 32 de biți. Duplicarea cheilor de registry asigură că modificările unui număr de parametri, care nu depind de capacitate, vor fi disponibile atât pentru suplimentele pe 32 de biți, cât și pe 64 de biți.

Redirecționare fișier

Redirecționarea fișierelor asigură că fișierele și directoarele programelor pe 32 și 64 de biți sunt păstrate separate și nu sunt afectate unele de altele.

Fișierele programelor pe 32 de biți sunt instalate în:

  • C:\Fișiere de program (x86)

Fișierele de sistem pe 32 de biți sunt instalate în:

  • C:\WINDOWS\SysWOW64

Pentru programele pe 64 de biți, fișierele sunt instalate în:

  • C:\Fișiere de program
  • C:WINDOWSSYSTEM32

Mecanismul de redirecționare WOW64 asigură că suplimentele pe 32 de biți pentru directoarele „C:Program Files” și „C:WINDOWS\SYSTEM32” vor fi redirecționate către directoarele adecvate pentru versiunile pe 32 de biți.

Cu toate acestea, există o problemă cu redirecționările fișierelor. Anchetatorii și anchetatorii trebuie să fie conștienți de această particularitate.

Multe programe pe 64 de biți folosesc încă modul și procedurile pe 32 de biți. І nu vă asigurați dacă este folosit instalatorul. Pentru a vă asigura că programul este instalat corect. tobto. În „C: Program Files”, instalatorul trebuie să facă o solicitare de sistem către sistemul de operare, astfel încât sistemul să suprime mecanismul de redirecționare a fișierelor Wow64. Și după instalare, creați un alt clic de sistem pentru a activa din nou redirecționarea. Dacă instalați fără redirecționare, programul va fi instalat în „C:\Program Files (x86)”. Cul clasic Această descărcare este o versiune pe 64 de biți a FireFox 3.5 cu numele de cod „Shiretoko”, care este instalată în „C: Program Files (x86) Shiretoko”. Desigur, Firefox va funcționa normal ca înainte. Singurul lucru pe care nu îl puteți câștiga este doar să schimbați pictograma programului.

Notă: Este posibil ca Shiretoko să fi corectat deja această problemă. Prote în versiunile timpurii era așa.

Redirecționarea registrului

Cheile de registry specifice suplimentelor pe 32 de biți vor fi redirecționate de la:

  • HKEY_LOCAL_MACHINE\Software
  • HKEY_LOCAL_MACHINE\Software\WOW6432Node

Deci, uneori puteți crea o intrare de registry într-un alt fișier (deși nu neapărat):

  • HKEY_CURRENT_USER\Software\WOW6432Node

Această abordare permite suplimentelor pe 32 și 64 de biți să citească în mod normal, fără probleme cu suprascrierea, configurarea reciprocă.

Registrul duplicat

Orice redirecționare a cheilor și a valorilor de registry trebuie să fie duplicată. Aceasta înseamnă că, dacă un program pe 32 de biți face modificări într-o secțiune redirecționată a registrului, aceste modificări trebuie făcute și pentru suplimentele pe 64 de biți. În acest caz, se aplică principiul „cine este stânga are dreptate”. De exemplu, dacă instalați trei suplimente care vă leagă de aceeași extensie de fișier, atunci asocierea cu fișierul extins este de vină pentru suplimentul rămas.

  1. Instalați un program pe 32 de biți care se asociază cu extensiile XYZ
  2. Instalați versiunea pe 64 de biți a programului, care este asociată cu fișierul extins XYZ
  3. Instalați un alt program pe 32 de biți care este asociat cu extensia XYZ

Ca urmare a acestor acțiuni, făcând clic pe fișierul cu extensia XYZ, Windows Explorer poate deschide programul care a fost instalat la pasul 3. Aje însuși s-a asociat cu expansiunea.

Toate acestea sunt posibile pentru suplimentele pe 32 de biți din Wow64, care descarcă automat fișierul și dublează parametrii necesari și cheile de registry. Cu alte cuvinte, programele pe 32 de biți pot fi convertite în versiunea standard, făcând modificările necesare pentru ele folosind Wow64.

Limita inferioară a subsistemului WOW64

Unele, dar nu toate, funcțiile pe 64 de biți sunt disponibile pentru programele pe 32 de biți

Wow64 permite aplicațiilor pe 32 de biți să profite de funcționalitatea și capacitățile sistemelor pe 64 de biți. De exemplu, când reglat corespunzător, astfel de programe pot folosi până la 4 GB de RAM. Acces la alte funcții de interconectare prin caracteristicile dispozitivului sistemelor pe 64 de biți. De exemplu, Windows pe 64 de biți acceptă operații logice pe 64 de biți. Nu mai puțin, programele pe 32 de biți nu le pot accesa, pot interfera cu operațiunile logice pe 32 de biți.

Notă: Motivul principal al discrepanței este diferența de transmitere a datelor între suplimentele pe 32 și 64 de biți. Un add-on pe 32 de biți pur și simplu nu acoperă tipurile de date pe 64 de biți.

Nu este posibil să amestecați codul (Code Injection) al suplimentelor pe 32 de biți și pe 64 de biți

Pe un sistem de operare Windows pe 64 de biți, nu puteți rula cod pe 32 de biți pe un proces pe 64 de biți, la fel cum nu puteți rula cod pe 64 de biți pe un proces pe 32 de biți. Programele care folosesc Code Injection pentru a adăuga funcționalități altor programe vor avea de obicei erori.

Acest fapt explică de ce majoritatea extensiilor de shell Windows pe 32 de biți nu rulează sub Windows pe 64 de biți. Majoritatea acestor extensii folosesc Code Injection pentru instalare în Windows Explorer.

WOW64 nu acceptă programe de instalare pe 16 biți

WOW64 va oferi suport pentru instalatorii Microsoft pe 16 biți prin înlocuirea programului de instalare cu o versiune completă pe 32 de biți. Acest suport nu se aplică altor produse. Deci, dacă trebuie să revizuiți un program vechi, atunci, cel mai bine, va trebui să găsiți un emulator sau o versiune portabilă.


Opțiuni suplimentare pentru rularea programelor pe 32 de biți pe Windows 64

Windows Virtual PC

Windows Virtual PC este un software gratuit care vă permite să rulați mai multe sisteme de operare pe un singur computer. Virtual PC oferă un middleware special care acceptă software vechi care nu este instalat sau lansat în Windows 7. Toate sistemele de operare care rulează sub Virtual PC sunt instalate în mașina virtuală. Aceasta înseamnă că sistemele de operare care rulează nu știu despre cele care rulează pe alt sistem.

Capacitățile și funcționalitățile sistemului variază foarte mult între versiunile de Virtual PC și versiunile de Windows. Deci, înainte de a începe să utilizați Virtual PC, trebuie să vă asigurați că programul acceptă atât sistemul dvs. de operare, cât și sistemul de operare care va rula pe acesta. De exemplu, una dintre versiunile rămase nu mai acceptă versiuni de Windows mai mici decât Windows XP SP3.

Modul Windows XP (XPM)

Modul Windows XP nu limitează în mod specific implementarea Windows Virtual PC, care vine cu preinstalat o copie de Windows XP Professional SP3. Acest mod de acces nu este disponibil în versiunile Enterprise, Ultimate și Professional ale Windows 7 pe 64 de biți.

Indiferent de posibilitățile de care s-ar putea face vinovat acest regim, oricine a câștigat XPM este hotărât să vikorizeze acest regim doar ca firesc. În comparație cu alte produse de virtualizare, productivitatea este impresionantă, iar configurația standard necesită o serie de surse de alimentare.

Notă: Până în urmă cu foarte mult timp, ajustările la modul de nebunie pot fi inversate. Informații mai detaliate pot fi găsite în recenzia Cum să rulați programe vechi pe Windows 7 / Vista? (Div. Microsoft Application Compatibility Toolkit).

Ferestre Multi-Vantage

Puteți instala mai multe versiuni de Windows pe un computer utilizând un program de descărcare multiplă. De exemplu, trebuie să instalați versiunile de Windows pe 32 și 64 de biți una câte una. Sistemul de operare skin este instalat pe partiția de disc adiacentă, iar managerul de venituri este instalat pe partiția standard. Managerul de instalare vă permite să selectați și să lansați imediat sistemul de operare pe care doriți să îl utilizați.

Deși nu puteți utiliza mai mult de un sistem de operare în același timp, această funcționalitate este plictisitoare. În comparație cu mașinile virtuale, această metodă nu provoacă problemele obișnuite din cauza inconsecvenței, iar astfel de sisteme sunt mult mai ușor de configurat și întreținut. În plus, instalând versiunea pe 32 de biți a programului din versiunea pe 64 de biți, veți salva posibilitatea de a rula programe pe 16 biți.

Sunt multe de spus despre suportul pe 32 de biți pe Windows pe 64 de biți

Majoritatea programelor pe 32 de biți vor funcționa foarte bine în Windows 64. Principalele probleme vor fi:

  1. Drivere de dispozitiv pe 32 de biți
  2. Programele care nu pot funcționa fără drivere de dispozitiv pe 32 de biți sunt vikorist. Exemple bune includ antivirus și alte programe de securitate.
  3. Extensii precum injectarea de cod. De exemplu, wrapper-uri pentru Windows Explorer

Orice program poate fi lansat cu restricții. Există, de asemenea, programe de dezinstalare, curățători de registry și programe de reglare, astfel încât aceștia pot accesa doar acea parte a registrului pe care o afișează Wow64.

Dacă nu puteți rula un program pe 32 de biți, atunci uitați-vă la opțiunea de virtualizare sau multiplayer a mai multor sisteme de operare.

Ce programe sunt disponibile pentru 32 de biți sau 64 de biți?

Această mâncare trebuie auzită des. Ale, nu e nimic regula zagal Există un factor de multiplicare, astfel încât părțile rămase rămân în setările și funcțiile procesorului.

Dacă comparați programe pe 32 și 64 de biți din sistemele dumneavoastră native, suplimentul pe 32 de biți are de obicei mai puțină memorie decât suplimentul echivalent pe 64 de biți. Acest lucru se datorează faptului că versiunile pe 64 de biți ale vikorist au structuri de date pe 64 de biți, care ocupă mai mult spațiu. Dimensiunea suplimentară se adaugă imediat la ora de pornire și închidere a programelor, precum și la alte tipuri de operațiuni legate de accesul la unitățile de disc. Aceasta înseamnă că programele pe 32 de biți vor fi tipărite mai rapid. Timp nu mai puțin, utilizarea programelor pe 64 de biți prin caracteristicile unui procesor pe 64 de biți permite potențial ca programele să fie reduse cu 25% mai puțin decât programele pe 32 de biți.

În plus, este necesar să ne amintim că rularea unui program pe 32 de biți pe Windows pe 64 de biți înseamnă rularea Wow64, deci poate fi inclusă analiza performanței pe un procesor pe 32 de biți. Rularea Wow64 înseamnă nu doar să cheltuiești bani pentru conversia clicurilor, ci și o serie de mecanisme de redirecționare și duplicare, care necesită nu numai ore de procesor, ci și RAM. Prin urmare, este posibil ca un add-on pe 32 de biți să coste mai puțin decât unul pe 64 de biți, dar cu siguranță va costa mai mult decât atunci când rulează echivalent pe un procesor pe 32 de biți.

Evaluare 5.00 (2 voturi)



Începeți să stăpâniți sisteme pe 64 de biți urmând întrebarea „Trebuie să ne reselegem proiectul pentru un sistem pe 64 de biți?” În acest moment, trebuie să fii sigur de cunoștințele tale, mai degrabă decât să te grăbești și să te gândești. Pe de o parte, vă puteți evidenția față de concurenți fără a promova vreodată soluții pe 64 de biți. În caz contrar, puteți pierde o oră gratuit cu un add-on pe 64 de biți, care nu vă va oferi avantajele competitive necesare.
Vom trece în revistă principalii factori care vă vor ajuta să faceți o alegere.

2.1. Trivialitatea ciclului de viață al adăugărilor

Nu deschideți versiunea pe 64 de biți a programului cu un scurt ciclu de viață. Pentru toate subsistemele WOW64, programele mai vechi pe 32 de biți pot funcționa bine pe cele pe 64 de biți sisteme WindowsȘi apoi trebuie să lucrezi cu un program pe 64 de biți, pentru că după 2 zile nu vei mai urmări, fără îndoială. Mai mult, practica a arătat că trecerea la versiunile pe 64 de biți de Windows va dura mult timp și, poate, majoritatea clienților tăi vor alege, pe termen scurt, versiunea pe 32 de biți a soluției tale software.
Pe măsură ce intenționăm să facem o dezvoltare extinsă și asistență pentru produsul software, începem să lucrăm la versiunea pe 64 de biți a soluției dumneavoastră. Puteți lucra încet, dar aveți grijă că, cu cât nu aveți mai mult timp o versiune completă pe 64 de biți, cu atât este mai dificil să recurgeți la utilizarea programelor suplimentare care sunt instalate pe versiunile de Windows pe 64 de biți.

2.2. Intensitatea resurselor programelor

Recopilarea programelor pentru un sistem pe 64 de biți le va permite să utilizeze mai multă memorie RAM și, de asemenea, să accelereze viteza de lucru cu 5-15%. Se va obține o accelerație de 5-10% pentru calculul capacităților arhitecturale ale unui procesor pe 64 de biți, de exemplu cantitate mare registre O altă creștere cu 1%-5% a vitezei se datorează utilizării WOW64, care transmite clicuri API între aplicațiile pe 32 de biți și un sistem de operare pe 64 de biți.
Dacă programul dvs. nu funcționează cu cantități mari de date (mai mult de 2 GB) și viteza de lucru nu este critică, atunci trecerea la un sistem pe 64 de biți în viitorul apropiat nu este foarte relevantă.
Înainte de a vorbi, programele simple pe 32 de biți pot beneficia de rularea lor într-un mediu pe 64 de biți. Știți că un program instalat cu tasta /LARGEADDRESSAWARE:YES poate vedea până la 3 gigaocteți de memorie, deoarece sistemul de operare Windows pe 32 de biți este lansat cu cheia /3gb. Acesta este un program pe 32 de biți care rulează pe un sistem pe 64 de biți, puteți vedea cel puțin 4 GB de memorie (în practică, aproape de 3,5 GB).

2.3. Dezvoltarea bibliotecilor

Dacă dezvoltați biblioteci, componente sau alte elemente folosind furnizori de software terți pentru a-și crea propriul software, trebuie să vă asigurați eficiența atunci când creați o versiune pe 64 de biți a produselor lor. În caz contrar, clienții tăi care sunt blocați cu versiuni pe 64 de biți vor ezita să caute soluții alternative. De exemplu, dezvoltatorii de protecție software și hardware au fost surprinși de marea întârziere a apariției programelor pe 64 de biți, ceea ce a făcut dificil pentru mulți clienți să folosească alte instrumente pentru a-și proteja programele.
Un avantaj suplimentar cu lansarea unei versiuni pe 64 de biți a bibliotecii este că o puteți vinde ca produs separat. Prin urmare, clienții dvs. care doresc să ruleze atât programe pe 32 de biți, cât și pe 64 de biți vor trebui să achiziționeze 2 licențe diferite. De exemplu, această politică este adoptată de Spatial Corporation pentru vânzarea bibliotecii Spatial ACIS.

2.4. Relevanța produsului dvs. pentru bibliotecile terțe părți

Înainte de a planifica să lucrați la versiunea pe 64 de biți a produsului dvs., vă rugăm să clarificați ce versiuni pe 64 de biți ale bibliotecilor și componentelor sunt examinate. Aflați, de asemenea, care este politica de preț pentru versiunea pe 64 de biți a bibliotecii. Puteți afla totul accesând site-ul bibliotecii. Pe măsură ce susțineți această zi, căutați soluții alternative care acceptă sisteme pe 64 de biți.

2.5. Disponibilitatea programelor pe 16 biți

Dacă soluțiile dvs. au încă module pe 16 biți, atunci timpul lor va fi trezit. Programele pe 16 biți nu sunt acceptate pe versiunile Windows pe 64 de biți.
Aici ar trebui să clarificăm un punct legat de utilizarea programelor de instalare pe 16 biți. Încă trebuie să utilizați wiki-uri pentru a instala anumite programe pe 32 de biți. A fost creat un mecanism special care înlocuiește cei mai populari instalatori pe 16 biți pe noua versiune. S-ar putea să vă înșelați când credeți că programele pe 16 biți încă rulează pe un middleware pe 64 de biți. Amintiți-vă ce este în neregulă.

2.6. Disponibilitatea codului de asamblare

Nu uitați că utilizarea multor cod de asamblare poate îmbunătăți considerabil disponibilitatea unei versiuni pe 64 de biți a programului.
Luând în considerare toate faptele enumerate, toate avantajele și dezavantajele, lăudăm decizia că intenționați să vă portați proiectul pe sisteme pe 64 de biți. Și dacă acesta este cazul, atunci să mergem mai departe.

3. Krok al treilea. Trusa de instrumente

Dacă ați decis să dezvoltați o versiune pe 64 de biți a produsului și sunteți dispus să petreceți o oră, acest lucru nu garantează succesul. Adevărul este că ești responsabil pentru toate instrumentele necesare și pot exista incidente inacceptabile.
Cel mai simplu, sau chiar incontestabil, poate exista o problemă cu disponibilitatea unui compilator pe 64 de biți. Acest articol a fost scris în 2009, dar nu mai există un compilator C++ Builder pe 64 de biți de la Codegear. Lansarea sa nu va fi disponibilă până la sfârșitul zilei. Nu există nicio cale de a evita o astfel de problemă decât dacă trebuie să rescrieți întregul proiect, de exemplu, în Visual Studio. Deși totul a devenit mai clar datorită disponibilității unui compilator pe 64 de biți, alte probleme similare pot apărea mai subtile și apar deja în faza de lucru după transferul proiectului la o nouă arhitectură. Aș dori să vă mulțumesc să efectuați investigații suplimentare, ceea ce este clar componentele necesare, ce va fi necesar pentru implementarea versiunii pe 64 de biți a produsului dvs. S-ar putea să ai câteva surprize neplăcute.
Desigur, este imposibil să parcurgeți tot ce ar putea fi necesar pentru un proiect, dar vă voi oferi totuși o listă care vă va ajuta să vă orientați și să vă ajute să vă dați seama de alte lucruri care sunt necesare pentru implementarea pe 64 de biți. proiect:

3.1. Disponibilitatea unui compilator pe 64 de biți

Este dificil de spus despre importanța disponibilității unui compilator pe 64 de biți. Doare doar.
Intenționați să dezvoltați programe pe 64 de biți din wiki? versiunea rămasă(la momentul scrierii) Visual Studio 2008, tabelul N2 este disponibil pentru a vă ajuta să determinați ce ediție a Visual Studio aveți nevoie.



Tabelul nr. 2. Posibilitatea diferitelor ediții ale Visual Studio 2008

3.2. Disponibilitatea computerelor pe 64 de biți care rulează sisteme de operare pe 64 de biți

Poți fi mai întâi vikorist mașini virtuale pentru a rula suplimente pe 64 de biți pe hardware pe 32 de biți, dar este extrem de greoaie și nu oferă nivelul necesar de testare. Este important ca mașinile să aibă cel puțin 4-8 gigaocteți de memorie RAM instalată.

3.3. Disponibilitatea versiunilor pe 64 de biți ale tuturor bibliotecilor

Deoarece bibliotecile sunt prezentate în codurile de ieșire, proiectul poate avea o configurație pe 64 de biți. Actualizarea bibliotecii pe cont propriu pentru instalare pe un sistem pe 64 de biți poate fi frustrantă și dificilă, iar rezultatul poate fi nesigur și riscant. De asemenea, puteți distruge proprietatea autorizată. Dacă vizualizați bibliotecile ca module binare, trebuie să știți și că există module pe 64 de biți. Nu puteți deturna DLL-uri pe 32 de biți în mijlocul unei aplicații pe 64 de biți. Puteți crea o legare specială prin COM, dar o vom încununa cu o sarcină grozavă, pliabilă. De asemenea, rețineți că adăugarea unei versiuni pe 64 de biți a bibliotecii vă poate costa bani în plus.

3.4. Numărul de cod de asamblare generat

Visual C++ nu acceptă asamblatorul pe 64 de biți. Trebuie să utilizați fie asamblatorul curent pe 64 de biți (de exemplu, MASM), fie să implementați aceeași funcționalitate ca C/C++.

3.5. Modernizarea metodologiei de testare

Reelaborarea temeinică a metodologiei de testare, modernizarea testelor unitare, introducerea de noi caracteristici instrumentale. Raportul despre aceasta va fi discutat mai jos, dar nu uitați să îl includeți în etapa de estimare a timpului petrecut cu migrarea programelor către sistem nou.

3.6. Date noi pentru testare

Dacă distribuiți suplimente care consumă mult resurse care contribuie la utilizarea maximă a RAM, trebuie să actualizați baza de date cu datele de intrare de testare. La navantazhuvalny testuvanny Se așteaptă ca suplimentele pe 64 de biți să depășească cei 4 gigaocteți de memorie care sunt salvați. S-ar putea să existe o mulțime de iertare pentru astfel de minți.

3.7. Disponibilitatea sistemelor pe 64 de biți

Sistemul de securitate care este învingător este responsabil pentru suportarea sistemelor pe 64 de biți în orice mod de care aveți nevoie. De exemplu, compania Aladdin a lansat rapid drivere pe 64 de biți pentru a suporta cheile hardware Hasp. De multă vreme există un sistem de protecție automată a fișierelor binare pe 64 de biți (programul Hasp Envelop). În acest fel, mecanismul de protecție trebuia implementat independent la mijloc. codul programului Au existat sarcini suplimentare de pliere care ar necesita calificări și timp. Nu uitați de astfel de momente legate de securitatea sistemului și a sistemului de actualizare.

3.8. Instalator

Este necesar să aveți un nou program de instalare care să poată instala complet programe pe 64 de biți. Aș dori să menționez imediat aici despre o binecuvântare tradițională. Crearea de programe de instalare pe 64 de biți pentru instalarea produselor software pe 32/64 de biți. Când pregătesc o versiune pe 64 de biți a unui program, dezvoltatorii doresc adesea să aducă „64 de biți” la un nivel absolut. Și creează un program de instalare pe 64 de biți, uitând că cei cu un sistem de operare pe 32 de biți pur și simplu nu pot rula un astfel de pachet de instalare. Îmi pare rău să spun că nu add-on-ul pe 32 de biți al distribuției nu reușește să pornească în comparație cu cel pe 64 de biți, ci programul de instalare în sine. Chiar dacă distribuția este un add-on pe 64 de biți, atunci va fi imposibil de rulat pe un sistem de operare pe 32 de biți. Cel mai important lucru este că koristuvach-ul nu va putea niciodată să ghicească ce se întâmplă. Puteți descărca pur și simplu pachetul de instalare pe care nu îl puteți rula.

4. Sferturi de croc. Configurarea proiectului în Visual Studio 2005/2008

Crearea unei configurații pe 64 de biți pentru un proiect Visual Studio 2005/2008 pare destul de simplă. Folderele vor fi acolo pentru a vă urmări pe măsură ce creați o nouă configurație și căutați orice probleme în ea. Pentru a crea o configurație pe 64 de biți, trebuie să introduceți doar 4 chei:
Lansăm managerul de configurare, așa cum se arată în mica N1:



Figura 1. Lansarea managerului de configurare

În managerul de configurare, selectați suportul pentru noua platformă (Figura N2):



Malyunok 2. Crearea unei noi configurații

Selectăm o platformă pe 64 de biți (x64), iar ca bază selectăm o versiune pe 32 de biți (Figura N3). Acei parametri care afectează modul de colectare sunt configurați chiar de Visual Studio.



Figura 3. Selectăm x64 ca platformă și luăm ca bază configurația Win32

Adăugarea unei noi configurații este finalizată și putem selecta opțiunea de configurare pe 64 de biți și să trecem la compilarea suplimentului pe 64 de biți. Selectați o configurație pe 64 de biți pentru a adăuga citiri la bebelușul N4.



Figura 4. Configurațiile pe 32 și 64 de biți sunt acum disponibile

Pentru a fi amabil cu dvs., nu va fi nevoie să remediați în continuare proiectul pe 64 de biți. Cu toate acestea, există o mare întârziere în proiect, complexitatea acestuia și numărul de biblioteci care sunt învingătoare. Singurul lucru pe care îl puteți schimba imediat este dimensiunea stivei. Dacă proiectul dvs. are o dimensiune a stivei de 1 megaoctet, atunci ar trebui să o setați să fie de 2 megaocteți pentru versiunea pe 64 de biți. Nu este prea complicat, dar este mai bine să vă asigurați în avans. Dacă aveți o dimensiune a stivei care este diferită de dimensiunea stivei, ceea ce înseamnă că crearea acesteia pentru versiunea pe 64 de biți este de 2 ori mai mare. În acest scop, în setările proiectului, găsiți și modificați parametrii Stack Reserve Size și Stack Commit Size.

5. Escroci de cincimi. Compilarea programului

Aici ar fi bine să știți despre problemele tipice care apar în etapa de compilare a unei configurații pe 64 de biți. Uitați-vă la ce probleme sunt cauzate de bibliotecile terțe, aflați că compilatorul pentru codul legat de funcțiile WInAPI nu va mai permite plasarea indicatorului în tipul LONG și va trebui să vă actualizați codul și să schimbați LONG_PTG tip. Și multe alte lucruri. Păcat că există atât de multe și atât de variate amendamente încât nu există nicio posibilitate de publicare în cadrul unui articol și poate unei cărți. Veți avea ocazia să vă uitați singur la toate modificările, cum ar fi compilatorul și noile progrese, care nu existau înainte, și veți putea înțelege cum să modernizați codul.
Pentru a vă ușura viața, puteți trimite o colecție de resurse dedicate dezvoltării de programe pe 64 de biți: http://www.viva64.com/links/64-bit-development/. Colecția este în continuă creștere și autoarea va fi foarte recunoscătoare cititorilor dacă vă pot trimite mesaje pentru resurse care, în opinia ei, merită respect.
Ne concentrăm aici în principal pe tipurile care pot deveni de interes pentru dezvoltatori în timpul migrării suplimentelor. Aceste tipuri sunt prezentate în Tabelul N3. Majoritatea daunelor de compilare sunt asociate cu aceleași tipuri de erori.
Tip Dimensiune tip pe platformă x32 / x64 Notă
int 32 / 32 Tip de bază. Pe sistemele pe 64 de biți, le vei pierde pe cele pe 32 de biți.
lung 32 / 32 Tip de bază. Pe sistemele Windows pe 64 de biți, îl vei pierde pe cel pe 32 de biți. La naiba ce au cele pe 64 de biți sisteme Linux Acest tip a fost extins la 64 de biți. Nu uitați că descompuneți codul care trebuie compilat pentru sistemele Windows și Linux.
dimensiune_t 32 / 64 Tip de bază nesemnat. Dimensiunea tipului este selectată astfel încât să poată fi înregistrat dimensiune maximă teoretic masiv mozhlivy. Tipul size_t poate fi folosit pentru a plasa în siguranță indicatorii (pentru a plasa indicatorii pe funcția claselor, dar nu într-un mod special).
ptrdiff_t 32 / 64 Similar cu tipul size_t, cu excepția semnată. Rezultatul este similar cu cel al tipului ptrdiff_t.
Pokazchik 32 / 64 Dimensiunea afișajului depinde de capacitatea platformei. Aveți grijă când convertiți pointerii în alte tipuri.
__int64 64 / 64 Tip semnătură pe 64 de biți.
DWORD 32 / 32 Tip nesemnat pe 32 de biți. WinDef.h yak:typedef DWORD lung nesemnat;
DWORDLONG 64 / 64 Tip nesemnat pe 64 de biți. Implicit în WinNT.h ca: typedef ULONGLONG DWORDLONG;
DWORD_PTR 32 / 64 Un tip nesemnat care poate fi plasat într-un indicator. Voided BaseTsd.h yak:typedef ULONG_PTR DWORD_PTR;
DWORD32 32 / 32 Tip nesemnat pe 32 de biți. Voided BaseTsd.h yak:typedef unsigned int DWORD32;
DWORD64 64 / 64 Tip nesemnat pe 64 de biți. Voided BaseTsd.h yak:typedef unsigned __int64 DWORD64;
HALF_PTR 16 / 32 Jumătate vagabond. Basetsd.h yak:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif
INT_PTR 32 / 64 Un tip simbolic care poate fi plasat ca semn. BaseTsd.h este uluit ca:#if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR;#endif
LUNG 32 / 32 Tip de semn, care a pierdut 32 de biți. Prin urmare, în multe cazuri, ar trebui să vikorizați LONG_PTR. WinNT.h yak:typedef long LONG;
LONG_PTR 32 / 64 Un tip simbolic care poate fi plasat ca semn. BaseTsd.h este uluit ca:#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif
LPARAM 32 / 64 Parametru pentru notificarea depășitoare. Implicit în WinNT.h ca: typedef LONG_PTR LPARAM;
SIZE_T 32 / 64 Analog cu tipul size_t. Voided BaseTsd.h yak:typedef ULONG_PTR SIZE_T;
SSIZE_T 32 / 64 Analog cu tipul ptrdiff_t. Voided BaseTsd.h yak:typedef LONG_PTR SSIZE_T;
ULONG_PTR 32 / 64 Un tip nesemnat care poate fi plasat într-un indicator. BaseTsd.h este golit ca:#if defined(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif
CUVÂNT 16 / 16 Tip nesemnat pe 16 biți. Implicit în WinDef.h ca: typedef unsigned short WORD;
WPARAM 32 / 64 Parametru pentru notificarea depășitoare. WinDef.h yak:typedef UINT_PTR WPARAM;

Tabelul nr. 3. Aceste tipuri sunt de interes atunci când se transferă programe pe 32 de biți către sisteme Windows pe 64 de biți.

6. Diagnosticul grațierilor primite

Dacă credeți că, după corectarea tuturor erorilor de compilare, programul pe 64 de biți cu citire lungă va fi eliminat, atunci veți fi dezamăgiți. Cel mai pliabil este în față. În etapa de compilare, veți corecta erorile explicite pe care compilatorul le poate detecta, care se datorează în principal incapacității de casting implicit de tip. Ale este vârful aisbergului. Majoritatea grațierilor au fost colectate. Din exteriorul limbajului abstract al C++, aceste expresii par sigure și deghizate prin reduceri evidente de tip. Există de multe ori mai multe astfel de beneficii, mai puține decât numărul de beneficii identificate în etapa de compilare.
Nu există nicio urmă de speranță pe cheia /Wp64. Această cheie este adesea prezentată ca un miracol în căutarea remedierii pe 64 de biți. De fapt, tasta /Wp64 nu vă mai permite să eliminați pași din față atunci când compilați codul pe 32 de biți, dar în modul pe 64 de biți acei pași din cod nu vor fi corecti. La compilarea codului pe 64 de biți, acestea vor fi văzute în avans de către compilator în orice caz. Mai mult, la compilarea unui program pe 64 de biți, cheia /Wp64 este ignorată. Și această cheie nu va mai ajuta în căutarea grațierilor.
Să aruncăm o privire asupra pumnului de grațieri primite.

6.1. Tipuri date explicit

Cea mai simplă, dar deloc ușor de identificat, clasă de conexiuni cu tipuri explicite, în care este necesară circumcizia. biți semnificativi.
Cea mai avansată aplicație este să afișeze indicatori de până la 32 de biți atunci când îi transmiteți unei funcții precum SendMessage:
MyObj* pObj = ... ::SendMessage(hwnd, msg, (WORD)x, (DWORD)pObj);

Aici, reducerea tipului este utilizată în mod clar pentru a converti indicatorul într-un tip numeric. Pentru o arhitectură pe 32 de biți, țintirea este corectă, deoarece parametrul rămas al funcției SendMessage este de tip LPARAM, care pe o arhitectură pe 32 de biți este evitat ca DWORD. Pentru o arhitectură pe 64 de biți, variabila DWORD este silentioasă și poate fi înlocuită cu LPARAM. Tipul LPARAM este potrivit pentru arhitecturi cu dimensiuni cuprinse între 32 și 64 de biți.
Aceasta este o greșeală simplă, dar adesea tipărirea pare mai evidentă și este imposibil să dezvăluiți avansurile compilatorului sau este imposibil să căutați textul programului. Castingul de tip explicit este utilizat pentru diagnosticarea compilatorului, rezultate și indicații pentru a-i spune compilatorului că tipul casting este corect și programul își asumă responsabilitatea pentru siguranța codului. Nici o căutare evidentă nu va ajuta. Este posibil ca tipurile să nu aibă nume standard (setate de programator prin typedef) și există multe modalități de a crea tipări explicite. Pentru diagnosticarea fiabilă a unor astfel de defecte, este necesar să folosiți instrumente speciale, cum ar fi analizoarele Viva64 sau PC-Lint.

6.2. Inducția de tip implicit

Următorul pas este asociat cu un tip de turnare implicit, care implică și pierderea de biți semnificativi. Codul funcției fread funcționează atunci când citiți un fișier, dar este incorect când încercați să citiți mai mult de 2 gigaocteți de date pe un sistem pe 64 de biți.
size_t __fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp); size_t fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp) ( int ret; FLOCKFILE(fp); ret = __fread(buf, size, count, fp); FUNLOCKFILE(fp); return (ret) ;)

Funcția __fread inversează tipul size_t și, în loc să salveze numărul de octeți citiți, tipul int este inversat. Ca rezultat, în circumstanțe extreme, funcția poate roti numărul greșit de octeți care vor fi de fapt citiți.
Puteți spune că acesta este cod analfabet de la început, astfel încât compilatorul este informat despre astfel de inducție de tip și apoi un astfel de cod este ușor de recunoscut și corectat. Acest lucru este teoretic. Și practic în viata reala h proiecte grozave totul ar putea fi diferit. Acest exemplu este preluat din codul de ieșire FreeBSD. Grațierea a fost corectată în 2008! Acest lucru se întâmplă în ciuda faptului că prima versiune (experimentală) pe 64 de biți a FreeBSD a fost lansată în 2003.
Codul de ieșire al axei înainte de corectare:
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fread.c?rev=1.14
Iar axa de corecție este o opțiune (piept 2008) pentru Roku:
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fread.c?rev=1.15

6.3. Robot cu bucăți, distrus

Este ușor să faci o greșeală în codul care funcționează cu biți fix. Tipul ofensiv de muls este asociat cu operațiunile ZSUVU. Să aruncăm o privire la fund:
ptrdiff_t SetBitN (valoare ptrdiff_t, număr de bit fără semn) ( masca ptrdiff_t = 1<< bitNum; return value | mask; }

Codul de indicare este potrivit pentru arhitectura pe 32 de biți și permite ca biții numerotați de la 0 la 31 să fie plasați ca unul singur. După transferul de programe pe o platformă pe 64 de biți, nu este nevoie să setați biții numerotați de la 0 la 63. În caz contrar, codul nu va seta biții numerotați 32-63. Vă rugăm să rețineți că „1” este de tip int și dacă a 32-a poziție este distrusă, va fi înlocuită, așa cum se arată în mic 5. Rezultatul rezultat este 0 (Figura 5-B) sau 1 (Figura 5-C), care este datorită implementării compilatorului.



Malyunok 5. A - Instalarea corectă a celui de-al 31-lea bit într-un cod de 32 de biți; B, C - Remedierea instalării celui de-al 32-lea bit pe un sistem pe 64 de biți (două opțiuni de comportament)

Pentru a corecta codul, trebuie să creați o constantă „1” de același tip ca și masca:

ptrdiff_t mask = ptrdiff_t(1)<< bitNum;

Vă rugăm să rețineți, de asemenea, că dacă codul nu este corectat, va provoca încă o eșec. Când 31 de biți sunt setați pe un sistem pe 64 de biți, rezultatul funcției robotice va fi valoarea 0xffffffff80000000 (div. Figura 6). Rezultatul este virusul 1<< 31 является отрицательное число -2147483648. Это число представляется в 64-битной целой переменной как 0xffffffff80000000.



Malyunok 6. Remedierea instalării celui de-al treizeci și unu de bit pe un sistem pe 64 de biți

6.4. Numere magice

Multe inconsecvențe pot fi create prin setarea unor constante magice, cum ar fi numere, care ajută și la determinarea dimensiunii unui anumit tip. Soluția corectă este să folosiți operatorii sizeof() în astfel de scopuri, altfel programul mare poate pierde complet vechiul bit de cod, unde s-a stabilit ferm că dimensiunea indicatorului este de 4 octeți, iar tipul size_t este întotdeauna 32 biți. Numiți aceste favoruri pentru a arăta astfel:
size_t ArraySize = N * 4; size_t *Array = (size_t *)malloc(ArraySize);

Principalele numere care ar trebui plasate cu grijă în timpul tranziției la o platformă pe 64 de biți pot fi găsite în tabelul N4.



Tabelul nr. 4. Valori magice de bază care nu sunt sigure atunci când se transferă suplimente de pe o platformă pe 32 de biți pe o platformă pe 64 de biți

6.5. Completarea variabilelor pe 32 de biți ca indici

Programele care colectează volume mari de date pot întâmpina probleme asociate cu indexarea unor volume mari sau pot experimenta cicluri eterne. Fundul care atacă va lua două răzbunare simultan:
const size_t size = ...; char *array = ...; char * end = matrice + dimensiune; pentru (unsigned i = 0; i != size; ++i) (const int unu = 1; final[-i - one] = 0; )

Prima problemă este că, dacă dimensiunea datelor depășește 4 gigaocteți (0xFFFFFFFF), atunci este posibil ca ciclul etern să fie declanșat, deoarece modificarea „i” este de tipul „unsigned” și nu va atinge niciodată valoarea 0xFFFFFFFF . Scriu în mod special că vinovăția este posibilă, ca nu cumva să devină prea dureroasă. Aceasta depinde de codul produs de compilator. De exemplu, în modul de depanare bucla eternă va fi prezentă, dar în codul de lansare va exista o buclă, așa că compilatorul a decis să optimizeze codul, permițând ca un registru de 64 de biți și bucla să fie corectă. Toate acestea se adaugă la confuzie, iar codul la care ați lucrat va înceta inevitabil să funcționeze în ziua următoare.
O altă tăietură este asociată cu trecerea masivului de la capăt la cob, pentru care se determină valori negative ale indicelui. Codul este destinat să funcționeze în modul pe 32 de biți, dar dacă este rulat pe o mașină pe 64 de biți la prima iterație a ciclului, accesul dincolo de matrice va fi permis și programul se va bloca. Să ne uităm la motivul acestui comportament.

Prin urmare, conform regulii limbajului C++ pe un sistem pe 32 de biți, tipul „-i - one” este calculat ca următorul rang (la primul pas i = 0):

  1. Tipul „-i” este nesemnat și valoarea este 0x00000000u.
  2. Valoarea „one” va fi extinsă de la tipul „int” la tipul unsigned și actualizat 0x00000001u. Notă: Tipul int este extins (prin standardul C++) la tipul „nesemnat” deoarece ia parte la o operație în care celălalt argument este de tip nesemnat.
  3. Se efectuează următoarea operație, care implică două valori de tip nesemnat și rezultatul operației finale este 0x00000000u - 0x00000001u = 0xFFFFFFFFu. Vă rugăm să rețineți că rezultatul este un tip nesemnat.
  4. Pe un sistem pe 32 de biți, scalarea până la matricea din spatele indexului 0xFFFFFFFFu este echivalentă cu indicele vicoristic -1. Atunci sfârşitul este analog cu sfârşitul[-1]. Ca rezultat, elementul de matrice este format corect.
Pe un sistem pe 64 de biți, imaginea va fi complet diferită. Tipul nesemnat va fi extins la ptrdiff_t semnat și indexul matricei va fi 0x00000000FFFFFFFFi64. Ca rezultat, veți depăși limitele matricei.
Pentru a corecta codul, trebuie să modificați tipuri precum ptrdiff_t și size_t.

6.6. Uzura legată de modificări ale tipurilor de funcții victorioase

Sunt grațieri, în care, în ciuda tuturor, nimeni nu este vinovat, dar nu încetează să fie iertări. Este clar că cu mult timp în urmă într-o galaxie îndepărtată (în Visual Studio 6.0) un proiect a fost împărțit într-unul din clasa actuală CSampleApp, care este un descendent al CWinApp. Clasa de bază are o funcție virtuală numită WinHelp. Instrumentul blochează această funcție și elimină acțiunile necesare. Vizual, acesta este reprezentat de bebelușul 7.



Figura 7. Cod original corect creat de Visual Studio 6.0

Apoi proiectul este transferat în Visual Studio 2005, unde prototipul funcției WinHelp s-a schimbat, dar nimeni nu îl menționează, deoarece în modul pe 32 de biți tipurile DWORD și DWORD_PTR sunt evitate și programul continuă să proceseze corect (Fig. nok 8).



Malyunok 8. Nu este corect, dar codul original pe 32 de biți

Programul verifică pentru a arăta că pe un sistem pe 64 de biți, dimensiunea tipurilor DWORD și DWORD_PTR este diferită (Figura 9). Se pare că în modul pe 64 de biți există două funcții diferite ale WinHelp, ceea ce este în mod natural incorect. Vă rugăm să rețineți că pastele similare pot fi găsite nu numai în MFC, dar unele funcții au schimbat tipurile de argumente, dar și în codul programelor dvs. și al bibliotecilor terțe.



Malyunok 9. Iertarea apare în cod pe 64 de biți

6.7. Diagnosticul grațierilor primite

Pot fi aplicate și aplicate programe similare pe 64 de biți. Tim, care este pasionat de astfel de supărări și ar dori să afle mai multe despre ele, va cita articolul „20 de paste de cod C++ portat pe platforma pe 64 de biți”.
După cum vedeți, etapa de căutare a favorurilor primite și a sarcinilor nebanale, cele mai multe dintre ele vor apărea neregulat sau doar pe marile obligații de intrare ale acestora. Pentru a diagnostica astfel de defecte, analizoarele de cod static sunt cele mai potrivite, deoarece pot verifica tot codul programului, indiferent de datele de intrare și de frecvența executării acestuia în mințile reale. Este util să folosiți analiza statică atât în ​​etapa de transfer al add-on-ului pe platforme pe 64 de biți pentru a găsi mai multe beneficii în etapa inițială, cât și în dezvoltarea ulterioară a soluțiilor pe 64 de biți. Înainte de analiza statică, programul poate începe să înțeleagă mai bine particularitățile problemelor asociate cu arhitectura pe 64 de biți și să scrie cod mai eficient. Autorul acestui articol este dezvoltatorul unuia dintre aceste analizoare de cod specializate, numite Viva64. Puteți afla mai multe despre instrument în detaliu și puteți descărca o versiune demonstrativă de pe site-ul companiei LLC „Software Verification Systems”.
Este corect să spunem că astfel de analizoare de cod precum Gimpel PC-Lint și Parasoft C++Test au seturi de reguli pentru diagnosticarea defectelor pe 64 de biți. În primul rând, deși analizoarele sunt de importanță juridică, iar regulile de diagnosticare a erorilor pe 64 de biți sunt slab reprezentate. Pe de altă parte, ele sunt mai orientate către modelul de date LP64, care este utilizat în familia de sisteme de operare Linux, ceea ce le reduce costul pentru programele Windows care utilizează modelul de date LLP64.

7. Krok somiy. Modernizarea procesului de testare

Descrierile din secțiunea anterioară a căutării modificărilor în codul programului sunt necesare, dar nu suficiente. Aceeași metodă, inclusiv analiza statică a codului, nu oferă o garanție completă a identificării tuturor erorilor și cel mai bun rezultat poate fi obținut numai prin combinarea diferitelor tehnici.
Dacă programul dvs. pe 64 de biți procesează mai multe date decât versiunea pe 32 de biți, va trebui să vă extindeți testele pentru a include procesarea a mai mult de 4 gigaocteți de date. Aceasta este limita dincolo de care încep să-și arate o mulțime de beneficii pe 64 de biți. Uneori, astfel de teste pot dura mult mai mult și le pregătim până când sunt necesare mai târziu. Instruiți testele să fie scrise astfel încât să colecteze un număr mic de elemente din testul cutanat și astfel să permită trecerea tuturor testelor interne de unitate, de exemplu? pentru câteva minute și teste automate (de exemplu, cu ajutorul AutomatedQA TestComplete) pentru câțiva ani. Funcția de sortare pe un sistem pe 32 de biți, care sortează 100 de elemente, este garantată să funcționeze corect pe 100.000 de elemente. Cu toate acestea, funcția în sine pe un sistem pe 64 de biți poate eșua să proceseze 5 miliarde de elemente atunci când este încercată. Performanța unui test unitar ar putea fi redusă de milioane de ori. Nu uitați să verificați testele de adaptare pentru ora de stăpânire a sistemelor pe 64 de biți. Una dintre soluții este de a rula teste unitare pe dispozitive suedeze (care funcționează cu o cantitate mică de memorie) și altele mai mari care colectează gigaocteți și sunt lansate, de exemplu, dimineața. Testarea automată a programelor pe 64 de biți consumatoare de resurse poate fi efectuată pe baza calculelor divizionare.

Etichete:

Adaugă etichete
Distribuie prietenilor sau economisește pentru tine:

Vantat...