Uruchom aplikację 32-bitową w systemie 64-bitowym. Istnieje szereg ograniczeń podsystemu WOW64

Jak uruchomić grę na systemie 32-bitowym, jeśli wymaga systemu 64-bitowego, instrukcja.

Prawdopodobnie chcesz wiedzieć, jak konsekwentnie zarabiać w Internecie od 500 rubli dziennie?
Pobierz moją bezpłatną książkę
=>>

Do korzystania z wielu nowoczesnych programów, w tym gier, wymagany jest system 64-bitowy. Dlatego właściciele komputerów z systemem 32-bitowym podczas próby uruchomienia niektórych programów mogą napotkać błąd typu „Wersja tego pliku jest niezgodna z wersją systemu Windows, której używasz…”.

Taki błąd wskazuje, że gra, którą próbujesz zainstalować na swoim komputerze, jest przeznaczona dla systemu 64-bitowego, a nie 32-bitowego. Faktem jest, że w przeciwieństwie do systemu 64-bitowego, na systemie 32-bitowym można uruchamiać programy opracowane tylko dla niego.

Dlatego jeśli masz wątpliwości lub nie znasz bitowości swojego systemu operacyjnego, możesz dowiedzieć się w następujący sposób:

  • Poprzez „Start” przejdź do „Panelu sterowania”.
  • Wybierz sekcję „System i zabezpieczenia” i kliknij „System”.
  • Naprzeciwko wiersza z nazwą „Typ systemu” pojawi się jego pojemność bitowa.

Jak uruchomić grę na systemie 32-bitowym, jeśli wymaga on systemu 64-bitowego

Jeśli okaże się, że system operacyjny jest 32-bitowy i musisz zainstalować 64-bitowy, ponowna instalacja systemu Windows nie jest konieczna. Dokładnie to, jak rozwiązać taki problem, zostanie omówione bardziej szczegółowo w tym artykule.

Różnice pomiędzy systemami 64-bitowymi i 32-bitowymi

Przede wszystkim warto zrozumieć, że całkowita ilość pamięci RAM na komputerze zależy od używanego systemu. Ponadto ilość miejsca, jaką można przeznaczyć na konkretną aplikację, zależy od wydajności systemu.

Zatem przy korzystaniu z systemu 64-bitowego maksymalna ilość pamięci RAM (pamięć o dostępie swobodnym) wynosi 16 GB. Jednocześnie w systemie Windows Professional liczba ta może osiągnąć 192 GB. Z kolei na dowolne konkretne narzędzie przydzielane jest do 4 GB pamięci RAM.

Jeśli weźmiemy pod uwagę x32, pamięć RAM w tym przypadku jest znacznie mniejsza. Maksymalna ilość pamięci RAM wynosi 4 GB. Jeśli chodzi o poszczególne aplikacje, można na nie przeznaczyć maksymalnie 2 GB.

Szybkość przetwarzania danych zależy również od pojemności bitowej procesora. Oznacza to, że w przypadku x64 obciążenie rozkłada się równomiernie na wszystkie rdzenie komputera. A w x32 drugi rdzeń uruchamia się dopiero po pełnym obciążeniu pierwszego.

Ponadto jest jeszcze jeden dość ważny punkt - system 64-bitowy nie jest odpowiedni dla słabych komputerów. Dlatego przy zakupie komputera lepiej od razu kupić x64, ponieważ ta opcja może uruchamiać dowolne aplikacje. Nawet te przeznaczone dla systemów 32-bitowych.

Jeśli jednak nie chcesz tego robić lub po prostu nie ma takiej możliwości, możesz skorzystać z programu innej firmy lub serwerów zdalnych.

Programy do tworzenia systemu gościa

Istnieją narzędzia, które pozwalają emulować działanie systemów zawierających określone oprogramowanie i sprzęt. Jednak w tym przypadku zaleca się korzystanie wyłącznie z licencjonowanych wersji programów do wizualizacji.

Działanie takich narzędzi opiera się na tworzeniu tzw. wersji gościa systemu operacyjnego. Ponadto do jego utworzenia potrzebny będzie dysk lub jego obraz z wymaganym systemem operacyjnym.

Wśród programów umożliwiających utworzenie systemu operacyjnego gościa znajdują się:

  • Oracle VirtualBox.
  • Stacja robocza VMware.
  • Wirtualny komputer z systemem Windows itp.

Zdalne serwery

Ta opcja korzystania ze zdalnych serwerów do uruchamiania gier wymagających 64-bitowego systemu operacyjnego jest również całkiem wygodna, podobnie jak specjalne narzędzia. Tylko w przypadku korzystania ze zdalnego serwera wszystkie obliczenia i informacje będą przetwarzane wyłącznie na nim.

Istotą tej opcji jest to, że nie będą Ci przeszkadzać ograniczenia, które możesz napotkać w systemie operacyjnym x32. Ponieważ gry i inne programy będą działać na wymaganych przez nie systemach.

Na przykład program taki jak Microsoft Azure umożliwia utworzenie kilku systemów operacyjnych jednocześnie. Dla tych, którzy kochają gry, możesz użyć NVIDIA GRID. Za jego pomocą karta graficzna jest wirtualizowana.

Pamiętaj tylko, że te usługi działają ze zdalnymi serwerami. W związku z tym do normalnego funkcjonowania wymagane jest dobre połączenie z Internetem.

Streszczenie

W obliczu pytania, jak uruchomić grę w systemie 32-bitowym, jeśli wymaga ona systemu 64-bitowego, rozwiązanie tego problemu jest całkiem możliwe. Tylko w tym celu, jak widać, będziesz musiał pracować ze specjalistycznymi programami lub zdalnymi serwerami. A to jest dość trudne.

Nie zapominaj także o ryzyku zainfekowania komputera złośliwym oprogramowaniem. Dlatego jeśli Twój komputer na to pozwala, lepiej zainstalować 64-bitowy system operacyjny. W takim przypadku nie będziesz mieć problemów z uruchamianiem programów i gier.

Pamiętaj jednak, że wybór zawsze należy do Ciebie. Ale nie na wszystkich komputerach można uruchomić 64-bitowy system operacyjny.

Przydatne artykuły:

P.S. Załączam zrzut ekranu moich zarobków w programach partnerskich. A przypominam, że w ten sposób zarobić może każdy, nawet początkujący! Najważniejsze jest, aby zrobić to poprawnie, co oznacza uczenie się od tych, którzy już zarabiają, czyli od profesjonalistów z branży internetowej.


Zdobądź listę sprawdzonych, zwłaszcza aktualnych, Programów Partnerskich w 2018 roku, które płacą!


Pobierz listę kontrolną i cenne bonusy za darmo
=>> „Najlepsze programy partnerskie 2018”

Większość nowoczesnych gier, takich jak Overwatch, Hurtworld czy Subnautica, działa tylko w 64-bitowych systemach operacyjnych. Twórcom tych programów po prostu nie opłaca się tworzyć różnych wersji aplikacji dla wersji 32- i 64-bitowej. Chociaż obie wersje są dość powszechne. Oczywiście przejście na x64 jest dość łatwe. Ale co, jeśli nie zamierzasz zmieniać systemu operacyjnego i nadal chcesz obejrzeć popularną grę? Dowiedz się, jak uruchomić Subnautica i inne programy 64-bitowe w systemie 32-bitowym.

Aby było to możliwe komputer musi spełniać wymagania niezbędne do normalnej pracy aplikacji. Procesor musi początkowo mieć architekturę x64.

Jaka jest różnica między systemem 32-bitowym a 64-bitowym?

Dlaczego programy zaprojektowane dla wersji 64-bitowej nie mogą otwierać się na wersji 32-bitowej? Dlaczego te wersje są tak różne, skoro nie obsługują tych samych aplikacji? A jeśli w Overwatch można grać na x64, dlaczego nie można w to grać na tym samym komputerze, ale na x32?

To zależy od systemu, ile pamięci RAM można zainstalować na komputerze i ile może przydzielić dla każdej konkretnej aplikacji. W x64 maksymalna ilość pamięci RAM wynosi 16 GB (w Windows 7 Professional - do 192 GB). W takim przypadku każde narzędzie ma do 4 GB. W wersji x32 wskazane liczby są znacznie mniejsze – maksymalnie 4 GB i 2 GB na osobny program.

Wydajność procesora określa sposób przetwarzania informacji. Wpływa to znacząco na wydajność - w wersji 64-bitowej jest znacznie lepiej. Istnieje większy rejestr do przechowywania danych, a obciążenie jest rozłożone na wszystkie rdzenie jednocześnie. W 32-bitowym systemie operacyjnym drugi rdzeń jest aktywowany, gdy pierwszy jest w pełni zajęty.

Na „słabych” maszynach zainstaluj x32. Jeśli Twój komputer nie ma dużo pamięci RAM i nie ma najlepszego procesora, po prostu nie ma sensu uruchamiać systemu 64-bitowego. To jedynie „przeciąży” komputer elektroniczny, nie zwiększając jego produktywności. Ale mocny komputer x64 będzie w sam raz.

Choć systemy te są do siebie z pozoru podobne, to jednak bardzo różnią się na poziomie oprogramowania. Mają inny zestaw sterowników, więc Subnautica, Overwatch, Hurtworld i inne podobne nie będą działać na 32-bitowym systemie operacyjnym, nawet jeśli komputer ma niezbędne cechy.

W przypadku nowoczesnych gier, aplikacji, programów do edycji grafiki czy wideo 2 GB, które przydziela im x32, nie wystarczą. Kompozytorzy nowych gier tworzą swoje produkty specjalnie dla x64.

Jak sprawdzić, czy procesor obsługuje x64?

Możesz zobaczyć, jaki system operacyjny zainstalowałeś w ten sposób:

  1. Na pulpicie kliknij prawym przyciskiem myszy ikonę „Mój komputer”.
  2. Pozycja „Właściwości”. Można go również znaleźć w sekcji Panel sterowania.
  3. Linia „Typ” wskaże liczbę bitów w wersji systemu operacyjnego.

Najpierw musisz zrozumieć, na jakim systemie pracujesz.

Zanim uruchomisz Overwatch na systemie 32-bitowym, sprawdź, czy Twój komputer poradzi sobie z grą. Sprawdź, czy procesor obsługuje instrukcje 64-bitowe. Można to zrobić za pomocą specjalnych programów testowych. Na przykład odpowiednie jest bezpłatne narzędzie „SecurAble”. Nie trzeba go instalować. W związku z tym nie ma potrzeby usuwania go po użyciu. Po prostu uruchom plik wykonywalny. Wyświetlone zostaną informacje o procesorze: nazwa, częstotliwość taktowania, głębia bitowa, czy obsługuje D.E.P (jest to zabezpieczenie urządzenia przed przepełnieniem bufora) oraz wizualizacja sprzętu. Możesz kliknąć dowolny wynik, a pojawi się jego opis.

Sprawdzanie obsługi procesora dla poleceń 64-bitowych

Jeśli program zwróci werdykt „Maksymalnie 32 bity”, oznacza to, że aplikacje zaprojektowane dla x64 prawdopodobnie nie będą działać. Aby zagrać w Overwatch lub Hurtword, będziesz musiał zmienić procesor lub pozbyć się zdalnych serwerów.

Jak zamienić system 32-bitowy na 64-bitowy?

Istnieje kilka narzędzi do tak zwanej wirtualizacji. Emulują działanie platformy z określonym oprogramowaniem i sprzętem. Jeśli chcesz dowiedzieć się, jak uruchomić Hurtworld w systemie 32-bitowym, użyj jednego z tych narzędzi.

Programy te tworzą rodzaj „gościa” systemu operacyjnego. Ale i tak musisz go zainstalować i kupić wersję licencjonowaną, jeśli jest płatna. Aby to zrobić, musisz mieć dysk (lub obraz dysku) z potrzebnym systemem operacyjnym.

Oracle VirtualBox

Uniwersalny program do podobnych zadań.

  1. Zainstaluj go i uruchom. Po lewej stronie pojawi się lista zainstalowanych systemów operacyjnych oraz pasek narzędzi. Po prawej stronie znajduje się informacja o wybranym systemie.
  2. Kliknij przycisk „Utwórz”. Pojawi się okno informacyjne. Kliknij Następny".
  3. Wybierz typ i wersję systemu operacyjnego. Opcji do wyboru jest wiele: nie tylko Microsoft Windows, ale także Linux.
  4. Następnie musisz zdecydować, ile pamięci RAM przydzielić systemowi „gościa”.
  5. Następnie musisz utworzyć dysk wirtualny (na którym zostaną zapisane pliki systemu operacyjnego). Możesz wybrać istniejący lub stworzyć nowy. I zaznacz pole obok opcji „Dysk rozruchowy”.
  6. W kolejnym oknie wybierz, czy pojemność dysku będzie stała, czy dynamiczna (zmienna). Do każdego elementu znajdują się szczegółowe wyjaśnienia. Lepiej naprawić boot. Później możesz dodać więcej dysków.
  7. Skonfiguruj rozmiar pamięci wirtualnej. Zwykle wystarczy 10 GB. Lepiej jest utworzyć go w osobnym miejscu, a nie w tym samym miejscu, w którym zainstalowany jest główny system.
  8. Poczekaj na zakończenie procesu. Na liście dostępnych pojawi się nowy.

Jednym ze sposobów jest użycie narzędzi do wirtualizacji

Następnie możesz skonfigurować sprzęt:

  1. Wybierz system gościa i kliknij Właściwości.
  2. W sekcji Ogólne - Zaawansowane zmień folder do zapisywania zdjęć na dogodny dla Ciebie.
  3. Ustaw tam schowek. Określa sposób przesyłania informacji pomiędzy różnymi systemami operacyjnymi.
  4. W zakładce „System” możesz wybrać charakterystykę wirtualnej płyty głównej i procesora.
  5. Pozycja „Sieć” jest potrzebna do skonfigurowania dostępu do sieci WWW. Możesz pozostawić ustawienia domyślne.
  6. W sekcji „Media” wskaż, skąd chcesz pobrać system operacyjny. Jeśli instalator znajduje się na płycie CD, włóż ją do napędu. Aby pobrać z .ISO, kliknij przycisk „Otwórz” obok listy „Napęd”. Wygląda jak żółty folder.
  7. Możesz tam także dodać inne obrazy, aby szybko przełączać się między nimi: bazy danych, aplikacje, gry.

Po zakończeniu ustawień kliknij „OK”. Aby uruchomić system gościa, kliknij go i przycisk „Start”. Instalacja będzie kontynuowana. Możesz także przełączać się między systemami: graj w wersji 64-bitowej i pracuj w wersji 32-bitowej.

Inne maszyny wirtualne

Istnieją również narzędzia do pracy z maszynami wirtualnymi:

  • VMware Workstation. Poważny profesjonalny program do skomplikowanych zadań. Dystrybucja jest płatna.
  • Proste narzędzie do emulacji sprzętu. Jest to oprogramowanie typu open source.
  • Wirtualny komputer z systemem Windows. Działa tylko z systemami Windows. Możesz skonfigurować priorytet procesów - w ten sposób zasoby będą automatycznie przydzielane maszynie online, jeśli wykona ona określone zadanie.
  • Virt-Manager. Zapewnia szerokie możliwości dostosowywania komponentu sprzętowego - sprzęt wirtualny jest dostępny na każdy gust.

Przetwarzanie w chmurze (serwery zdalne)

Jeśli wydajność nadal nie jest wystarczająca do uruchomienia gry, możesz to zrobić na zdalnym serwerze. Wszystkie obliczenia, wszystkie informacje będą na nim przetwarzane. W ten sposób nie będą Ci przeszkadzać żadne ograniczenia związane z x32. W końcu aplikacje „otwierają się” na odpowiednich systemach. Tylko nie na twoim komputerze.

Nadaje się do tego program Microsoft Azure. Za jego pomocą możesz stworzyć kilka systemów operacyjnych do różnych celów. Miłośnikom gier przydatna będzie także wyspecjalizowana usługa wirtualizacji kart graficznych NVIDIA GRID. Narzędzia te wymagają szybkiego Internetu.

Najnowocześniejsze usługi chmurowe poszerzają nasze możliwości

Praca z aplikacjami 64-bitowymi w systemie 32-bitowym jest całkiem możliwa. Ale musisz zainstalować dodatkowe oprogramowanie lub ogólnie przejść na serwer zdalny. Jest to dość trudne. Jeśli chcesz w pełni grać w Overwatch, Hurtword i inne popularne gry, lepiej zainstalować system operacyjny x64. Dzięki temu nie będzie problemów z kompatybilnością. I nie będziesz musiał niczego konfigurować.

NastroyVse.ru

Windows x64 — Dlaczego wciąż jest tak wiele programów 32-bitowych?

Najprawdopodobniej na Twoim komputerze działa 64-bitowa wersja systemu Windows. Ale jeśli otworzysz Menedżera zadań, zobaczysz, że większość programów w twoim systemie jest nadal 32-bitowa. Czy to naprawdę problem? Istnieje wiele różnic między 64-bitowymi i 32-bitowymi wersjami systemu Windows. W 64-bitowych wersjach systemu Windows można uruchomić oprogramowanie 32-bitowe, ale w 32-bitowych wersjach systemu Windows nie można uruchomić oprogramowania 64-bitowego.

Jak sprawdzić głębię bitową programu?

Użyjmy Menedżera zadań, aby zobaczyć, które programy są 64-bitowe, a które 32-bitowe. Kliknij prawym przyciskiem myszy pasek zadań i wybierz Menedżera zadań lub naciśnij Ctrl + Shift + Esc, aby go otworzyć. Spójrz na kolumnę z nazwami procesów. Jeśli używasz 64-bitowej wersji systemu Windows 8.1 lub 8, po każdej 32-bitowej wersji nazwy programu zobaczysz słowo „(32-bit)”. Jeśli używasz 64-bitowej wersji systemu Windows 7, zamiast tego zobaczysz „*32”. Programy 32-bitowe są zwykle instalowane w folderze C:\Program Files (x86)\ w 64-bitowych wersjach systemu Windows, natomiast programy 64-bitowe są zwykle instalowane w folderze C:\Program Files\. To tylko zasada. Ale nikt nie mówi, że nie ma innej zasady zabraniającej instalowania programów 64-bitowych w folderze C:\Program Files (x86)\. Na przykład Steam jest programem 32-bitowym, więc domyślnie instaluje się w „C:\Program Files (x86)”. Gry, które instalujesz na Steamie, są domyślnie instalowane w folderze C:\Program Files (x86)\Steam, łącznie z. nawet 64-bitowe wersje gier. Jeśli porównasz dwa różne foldery Program Files, odkryjesz, że większość programów jest najprawdopodobniej zainstalowana w folderze C:\Program Files (x86). Programy te są przeważnie 32-bitowe.

Uruchamianie oprogramowania 32-bitowego w 64-bitowym systemie operacyjnym

Na pierwszy rzut oka wydaje się okropne, że większość programów Windows nie korzysta z 64-bitowej architektury systemu operacyjnego. Można by pomyśleć, że uruchamianie 32-bitowych programów w 64-bitowym systemie operacyjnym powoduje spadek wydajności, ale tak nie jest. Windows uruchamia programy 32-bitowe na poziomie zgodności WoW64 w 64-bitowych wersjach systemu Windows. Jednakże 64-bitowe procesory Intel i AMD są kompatybilne wstecz i mogą bezpośrednio uruchamiać oprogramowanie 32-bitowe. Wszystkie programy w 32-bitowym systemie Windows będą działać tak samo, jak w 32-bitowej wersji systemu Windows. Zatem nie ma przeszkód, aby uruchamiać te programy w 64-bitowym systemie operacyjnym. Nawet jeśli każdy program, którego używasz, jest nadal 32-bitowy, odniesiesz korzyść, ponieważ sam system operacyjny będzie działał w trybie 64-bitowym. Ponadto 64-bitowa wersja systemu Windows jest bezpieczniejsza.

Programy 64-bitowe i programy 32-bitowe: co jest lepsze?

Programy 32-bitowe działają bez problemów w 64-bitowych wersjach systemów operacyjnych Windows. Ale czy byłoby lepiej, gdyby wszystkie programy były 64-bitowe? Programy 64-bitowe mają zdecydowanie zalety. Programy 32-bitowe mogą wykorzystywać tylko 2 GB pamięci, podczas gdy programy 64-bitowe mogą wykorzystywać znacznie więcej. Jeśli istnieje prawdopodobieństwo, że program zostanie zaatakowany, pomocne mogą okazać się dodatkowe funkcje zabezpieczeń zastosowane w programach 64-bitowych. Google Chrome jest obecnie aplikacją 32-bitową nawet na 64-bitowych wersjach systemu operacyjnego Windows, ale pojawiła się już 64-bitowa wersja beta tego programu. Google obiecuje, że 64-bitowa wersja przeglądarki Chrome będzie szybsza, bezpieczniejsza i stabilniejsza. Niektóre programy oferują wersje 64-bitowe. Na przykład: Photoshop, iTunes, Microsoft Office i niektóre z najpopularniejszych programów dla systemu Windows, wszystkie dostępne w wersji 64-bitowej. Najnowsze gry są również często 64-bitowe, więc mogą wykorzystywać więcej niż 2 GB pamięci. Wiele programów nie przeszło na wersję 64-bitową i większość nigdy tego nie zrobi. Większość 32-bitowych programów systemu Windows nadal można uruchamiać w 64-bitowej wersji systemu Windows, nawet te, które zostały wydane dziesięć lat temu, nawet jeśli ich twórcy już je zaktualizowali. Programista, który chce udostępnić 64-bitową wersję swojego programu, musi wykonać dużo dodatkowej pracy. Musi zadbać o to, aby istniejący kod skompilował się i działał poprawnie jako oprogramowanie 64-bitowe. Musi zapewniać i obsługiwać dwie oddzielne wersje programu, ponieważ użytkownicy korzystający z 32-bitowej wersji systemu Windows nie mogą korzystać z wersji 64-bitowej. Weźmy jako przykład Evernote na komputery z systemem Windows. Nawet gdyby wypuścili 64-bitową wersję Evernote, użytkownicy prawdopodobnie w ogóle nie zauważyliby różnicy. Program 32-bitowy może działać dobrze w 64-bitowej wersji systemu Windows, a jeśli nie ma zauważalnych korzyści, posiadanie wersji 64-bitowej nie ma sensu.

Gdzie znaleźć aplikacje 64-bitowe

Generalnie nie będzie możliwości wyboru pomiędzy 32-bitową a 64-bitową wersją oprogramowania. Na przykład podczas instalowania programu iTunes dla systemu Windows witryna firmy Apple automatycznie przekieruje Cię do 32-bitowej lub 64-bitowej wersji instalatora, w zależności od wersji systemu Windows. Podczas instalowania programu Photoshop dla systemu Windows zwykle instalowane są zarówno 32-bitowe, jak i 64-bitowe pliki wykonywalne. Photoshop automatycznie je wybiera. Czasami możesz zobaczyć osobne łącza do pobierania 32-bitowych i 64-bitowych wersji programów, ale nie jest to zbyt częste. Ważne jest, aby nie szukać aplikacji 64-bitowych, ale znaleźć aplikacje, które będą dla Ciebie odpowiednie. W przypadku większości aplikacji nie ma znaczenia, czy wersja jest 64-bitowa, czy 32-bitowa.

Po otwarciu menedżera zadań łatwo jest się zastanawiać, dlaczego tak wiele aplikacji jest nadal 32-bitowych. Ale nie jest to bardzo duży problem i oto dlaczego. Ponieważ większość aplikacji nic nie zyskuje po przejściu na 64-bitowe edycje programów. Nawet gdyby programiści wykonali całą pracę i wypuścili 64-bitowe wersje wszystkich małych aplikacji komputerowych i narzędzi używanych w systemie Windows, w przypadku większości z nich nie byłby w stanie dostrzec różnicy.

itchief.ru

7 kroków do przeniesienia programu do systemu 64-bitowego

W artykule omówiono główne kroki zapewniające poprawny transfer 32-bitowych aplikacji Windows do 64-bitowych systemów Windows. Choć artykuł skierowany jest do programistów korzystających z języka C/C++ w Visual Studio 2005/2008, przyda się także innym programistom planującym portowanie swoich aplikacji na systemy 64-bitowe. W artykule opisano główne problemy, z jakimi borykają się programiści planujący migrację programów 32-bitowych do systemów 64-bitowych. Oczywiście lista poruszanych zagadnień nie jest kompletna, jednak mam nadzieję, że z czasem pojawi się rozszerzona wersja tego artykułu. Autor będzie wdzięczny za opinie, komentarze i pytania, które pozwolą ulepszyć zawartość informacyjną tego artykułu. W architekturze obliczeniowej termin „64-bitowy” odnosi się do 64-bitowych liczb całkowitych i innych typów danych o rozmiarze 64 bitów. Systemy „64-bitowe” mogą oznaczać 64-bitowe architektury mikroprocesorów (na przykład EM64T, IA-64) lub 64-bitowe systemy operacyjne (na przykład Windows XP Professional x64 Edition). AMD64 (aka x86-64, Intel 64, EM64T, x64) to 64-bitowa architektura mikroprocesora i odpowiadający jej zestaw instrukcji opracowany przez firmę AMD. Ten zestaw instrukcji został objęty licencją firmy Intel pod nazwą EM64T (Intel64). Architektura AMD64 jest rozwinięciem architektury x86 z pełną kompatybilnością wsteczną. Architektura ta stała się powszechna jako podstawa dla komputerów osobistych i stacji roboczych. IA-64 to 64-bitowa architektura mikroprocesora opracowana wspólnie przez firmy Intel i Hewlett Packard. Zaimplementowane w mikroprocesorach Itanium i Itanium 2. Architektura stosowana jest głównie w serwerach wieloprocesorowych i systemach klastrowych. AMD64 i IA-64 to dwie różne architektury 64-bitowe, które nie są ze sobą kompatybilne. Dlatego programiści powinni natychmiast podjąć decyzję, czy muszą obsługiwać obie te architektury, czy tylko jedną. W większości przypadków, jeśli nie tworzysz wysoce specjalistycznego oprogramowania dla systemów klastrowych lub nie wdrażasz własnego, wysokowydajnego systemu DBMS, najprawdopodobniej wystarczy wdrożyć obsługę architektury AMD64, która jest znacznie bardziej rozpowszechniona niż IA-64. Szczególnie tyczy się to oprogramowania dla rynku komputerów osobistych, który niemal w 100 proc. jest zajęty przez architekturę AMD64. W dalszej części artykułu omówimy tylko architekturę AMD64 (EM64T, x64), ponieważ jej użycie jest obecnie najbardziej istotne dla twórców oprogramowania aplikacyjnego.

Mówiąc o różnych architekturach, warto wspomnieć o pojęciu „modelu danych”. Model danych należy rozumieć jako relację pomiędzy wymiarami typów akceptowanych w środowisku programistycznym. W przypadku jednego systemu operacyjnego może istnieć kilka narzędzi programistycznych obsługujących różne modele danych. Zwykle jednak dominuje tylko jeden model, ten, który najlepiej pasuje do środowiska sprzętowego i programowego. Przykładem jest 64-bitowy system operacyjny Windows, w którym natywnym modelem danych jest LLP64. Jednak ze względu na kompatybilność 64-bitowy system Windows obsługuje wykonywanie 32-bitowych programów działających w trybie modelu danych ILP32LL. Tabela N1 zawiera informacje o głównych modelach danych.


Tabela N1. Modele danych

Zastosowany model danych wpływa na proces tworzenia aplikacji 64-bitowych, ponieważ kod programu musi uwzględniać głębię bitową wykorzystywanych danych.

Opanowanie systemów 64-bitowych powinieneś rozpocząć od pytania „Czy musimy przebudować nasz projekt na system 64-bitowy?” Na to pytanie należy odpowiedzieć, ale nie w pośpiechu, po namyśle. Z jednej strony możesz zostać w tyle za konkurencją, nie oferując na czas rozwiązań 64-bitowych. Z drugiej strony możesz tracić czas na aplikację 64-bitową, która nie zapewni żadnej przewagi konkurencyjnej. Podajemy główne czynniki, które pomogą Ci dokonać wyboru. Nie należy tworzyć 64-bitowej wersji aplikacji o krótkim cyklu życia. Dzięki podsystemowi WOW64 stare aplikacje 32-bitowe działają całkiem dobrze na 64-bitowych systemach Windows i dlatego nie ma sensu tworzyć programu 64-bitowego, który za 2 lata nie będzie już wspierany. Co więcej, praktyka pokazała, że ​​przejście na 64-bitowe wersje systemu Windows opóźniło się i być może większość Twoich użytkowników w najbliższej przyszłości będzie korzystać wyłącznie z 32-bitowej wersji Twojego oprogramowania. Jeśli planujesz długoterminowy rozwój i długoterminowe wsparcie oprogramowania, powinieneś rozpocząć pracę nad 64-bitową wersją swojego rozwiązania. Można to robić powoli, jednak należy pamiętać, że im dłużej nie dysponuje się pełnoprawną wersją 64-bitową, tym większe mogą pojawić się trudności z obsługą takiej aplikacji zainstalowanej na 64-bitowych wersjach systemu Windows. Rekompilacja programu dla systemu 64-bitowego pozwoli mu wykorzystać ogromne ilości pamięci RAM, a także przyspieszy jego działanie o 5-15%. Przyspieszenie o 5-10% nastąpi w wyniku wykorzystania możliwości architektury 64-bitowego procesora, na przykład większej liczby rejestrów. Kolejny wzrost szybkości o 1–5% wynika z braku warstwy WOW64, która tłumaczy wywołania API pomiędzy aplikacjami 32-bitowymi a 64-bitowym systemem operacyjnym. Jeśli Twój program nie obsługuje dużych ilości danych (ponad 2 GB), a jego prędkość nie jest krytyczna, to przejście na system 64-bitowy w najbliższej przyszłości nie jest aż tak istotne. Nawiasem mówiąc, nawet proste aplikacje 32-bitowe mogą odnieść korzyści, uruchamiając je w środowisku 64-bitowym. Prawdopodobnie wiesz, że program skompilowany za pomocą klawisza /LARGEADDRESSAWARE:YES może przydzielić do 3 gigabajtów pamięci, jeśli 32-bitowy system operacyjny Windows zostanie uruchomiony za pomocą klawisza /3gb. Ten sam 32-bitowy program działający na systemie 64-bitowym może przydzielić prawie 4 GB pamięci (w praktyce około 3,5 GB). Jeśli tworzysz biblioteki, komponenty lub inne elementy, których zewnętrzni programiści używają do tworzenia swojego oprogramowania, musisz aktywnie tworzyć 64-bitową wersję swojego produktu. W przeciwnym razie Twoi klienci zainteresowani wydaniem wersji 64-bitowych będą zmuszeni szukać alternatywnych rozwiązań. Na przykład niektórzy twórcy ochrony oprogramowania i sprzętu zareagowali z dużym opóźnieniem na pojawienie się programów 64-bitowych, co zmusiło wielu klientów do poszukiwania innych narzędzi do ochrony swoich programów. Dodatkową korzyścią wynikającą z wydania 64-bitowej wersji biblioteki jest możliwość sprzedaży jej jako osobnego produktu. Tym samym Twoi klienci chcący tworzyć aplikacje zarówno 32-bitowe, jak i 64-bitowe będą zmuszeni zakupić 2 różne licencje. Na przykład zasady te są stosowane przez firmę Spatial Corporation przy sprzedaży biblioteki Spatial ACIS. Zanim zaplanujesz utworzenie 64-bitowej wersji produktu, dowiedz się, czy istnieją 64-bitowe wersje bibliotek i komponentów, z których korzysta. Dowiedz się także, jaka jest polityka cenowa dla 64-bitowej wersji biblioteki. Wszystko to można dowiedzieć się odwiedzając stronę internetową twórcy biblioteki. Jeśli wsparcie nie jest dostępne, poszukaj z wyprzedzeniem alternatywnych rozwiązań obsługujących systemy 64-bitowe. Jeśli Twoje rozwiązania nadal zawierają moduły 16-bitowe, czas się ich pozbyć. Uruchamianie aplikacji 16-bitowych w 64-bitowych wersjach systemu Windows nie jest obsługiwane. W tym miejscu powinniśmy wyjaśnić jedną kwestię związaną z użyciem 16-bitowych instalatorów. Nadal są używane do instalowania niektórych aplikacji 32-bitowych. Stworzono specjalny mechanizm, który na bieżąco zastępuje szereg najpopularniejszych 16-bitowych instalatorów nowszymi wersjami. Może to powodować błędne przekonanie, że programy 16-bitowe nadal działają w środowisku 64-bitowym. Pamiętaj, że to nieprawda. Nie zapominaj, że użycie dużej ilości kodu asemblera może znacznie zwiększyć koszt stworzenia 64-bitowej wersji aplikacji. Po rozważeniu wszystkich wymienionych faktów, wszystkich za i przeciw, zdecyduj, czy powinieneś przenieść swój projekt na systemy 64-bitowe. A jeśli tak jest, przejdźmy dalej. To, że zdecydowałeś się opracować 64-bitową wersję swojego produktu i chcesz poświęcić na to czas, nie gwarantuje sukcesu. Faktem jest, że trzeba mieć wszystkie niezbędne narzędzia i mogą tu zdarzyć się nieprzyjemne zdarzenia.

Najprostszym, ale i najbardziej nie do pokonania problemem może być brak 64-bitowego kompilatora. Artykuł napisano w 2009 roku, ale nadal nie ma 64-bitowego kompilatora C++ Builder firmy Codegear. Jej premiera spodziewana jest dopiero pod koniec tego roku. Nie da się obejść podobnego problemu, chyba że oczywiście przepiszesz cały projekt, na przykład za pomocą Visual Studio. Jeśli jednak przy braku 64-bitowego kompilatora wszystko będzie jasne, to inne podobne problemy mogą okazać się bardziej ukryte i ujawnić się już na etapie prac nad przeniesieniem projektu na nową architekturę. Dlatego też radzę Państwu wcześniej przeprowadzić badania w celu ustalenia, czy istnieją wszystkie niezbędne komponenty, które będą wymagane do wdrożenia 64-bitowej wersji Państwa produktu. Mogą Cię czekać niemiłe niespodzianki.

Oczywiście nie da się tutaj wymienić wszystkiego, co może być potrzebne do projektu, ale nadal oferuję listę, która pomoże ci się zorientować i być może zapamiętać inne punkty, które są niezbędne do wdrożenia twojego 64-bitowego projektu: Trudno powiedzieć cokolwiek innego na temat znaczenia posiadania 64-bitowego kompilatora. Tak po prostu musi być. Jeśli planujesz tworzyć aplikacje 64-bitowe przy użyciu najnowszej wersji (w momencie pisania tego tekstu) programu Visual Studio 2008, poniższa tabela N2 pomoże określić, której edycji programu Visual Studio potrzebujesz.

Tabela N2. Możliwości różnych wydań Visual Studio 2008 Można oczywiście używać maszyn wirtualnych do uruchamiania aplikacji 64-bitowych na sprzęcie 32-bitowym, ale jest to niezwykle niewygodne i nie zapewni wymaganego poziomu testów. Wskazane jest, aby komputery miały zainstalowane co najmniej 4-8 gigabajtów pamięci RAM. Jeśli biblioteki są dostarczane w kodzie źródłowym, musi istnieć 64-bitowa konfiguracja projektu. Samodzielna aktualizacja biblioteki w celu zbudowania jej dla systemu 64-bitowego może być niewdzięcznym i trudnym zadaniem, a wynik może być zawodny i podatny na błędy. W ten sposób możesz także naruszyć umowy licencyjne. Jeśli używasz bibliotek jako modułów binarnych, powinieneś również dowiedzieć się, czy istnieją moduły 64-bitowe. Nie będzie można używać 32-bitowych bibliotek DLL w aplikacji 64-bitowej. Możesz utworzyć specjalną wiązkę poprzez COM, ale będzie to osobne, duże i złożone zadanie. Należy również pamiętać, że zakup 64-bitowej wersji biblioteki może kosztować dodatkowe pieniądze. Visual C++ nie obsługuje 64-bitowego asemblera wbudowanego. Musisz użyć zewnętrznego 64-bitowego asemblera (na przykład MASM) lub mieć implementację C/C++ o tej samej funkcjonalności. Istotna rewizja metodyki testowania, unowocześnienie testów jednostkowych, zastosowanie nowych narzędzi. Zostanie to omówione bardziej szczegółowo poniżej, ale nie zapomnij wziąć tego pod uwagę przy szacowaniu czasu poświęconego na migrację aplikacji do nowego systemu. Jeśli tworzysz aplikacje wymagające dużych zasobów, które zużywają dużą ilość pamięci RAM, musisz zadbać o uzupełnienie bazy danych wejściowych testów. Podczas testowania obciążenia aplikacji 64-bitowych zaleca się wykorzystanie pamięci przekraczającej 4 gigabajty. Wiele błędów może pojawić się tylko w takich warunkach. Zastosowany system ochrony musi obsługiwać systemy 64-bitowe w pełnym wymaganym zakresie. Na przykład Aladyn szybko wypuścił 64-bitowe sterowniki obsługujące klucze sprzętowe Hasp. Jednak przez bardzo długi czas nie było systemu automatycznej ochrony 64-bitowych plików binarnych (program Hasp Envelop). Mechanizm zabezpieczający musiał być zatem zaimplementowany samodzielnie w kodzie programu, co było dodatkowym, skomplikowanym zadaniem wymagającym kwalifikacji i czasu. Nie zapomnij o podobnych kwestiach związanych z bezpieczeństwem, systemem aktualizacji i tak dalej. Potrzebujesz nowego instalatora, który będzie w stanie w pełni zainstalować aplikacje 64-bitowe. Pragnę od razu przestrzec przed jednym tradycyjnym błędem. To jest tworzenie 64-bitowych instalatorów do instalowania 32/64-bitowego oprogramowania. Przygotowując 64-bitową wersję aplikacji, programiści często chcą, aby była ona całkowicie 64-bitowa. I tworzą 64-bitowy instalator, zapominając, że użytkownicy 32-bitowego systemu operacyjnego po prostu nie uruchomią takiego pakietu instalacyjnego. Należy pamiętać, że to nie aplikacja 32-bitowa zawarta w dystrybucji wraz z wersją 64-bitową nie uruchomi się, ale sam instalator. W końcu, jeśli dystrybucja jest aplikacją 64-bitową, to oczywiście nie będzie działać na 32-bitowym systemie operacyjnym. Najbardziej irytujące jest to, że użytkownik nie będzie w stanie odgadnąć, co się dzieje. Zobaczy po prostu pakiet instalacyjny, którego nie można uruchomić. Tworzenie 64-bitowej konfiguracji projektu w Visual Studio 2005/2008 wygląda dość prosto. Trudności będą czekać na Ciebie na etapie składania nowej konfiguracji i szukania w niej błędów. Aby utworzyć konfigurację 64-bitową, wykonaj następujące 4 kroki: Uruchom menedżera konfiguracji, jak pokazano na rysunku N1:

Rysunek 1. Uruchomienie menedżera konfiguracji W menedżerze konfiguracji wybierz obsługę nowej platformy (Rysunek N2): Rysunek 2. Tworzenie nowej konfiguracji Wybierz platformę 64-bitową (x64) i wybierz ustawienia z wersji 32-bitowej jako podstawa (Rysunek N3). Środowisko Visual Studio dostosuje ustawienia mające wpływ na sam tryb kompilacji.

Rysunek 3. Jako platformę wybierz x64 i jako podstawę wykorzystaj konfigurację Win32.Dodawanie nowej konfiguracji zostało zakończone, możemy wybrać opcję konfiguracji 64-bitowej i rozpocząć kompilację aplikacji 64-bitowej. Wybór konfiguracji 64-bitowej do montażu pokazano na rysunku N4. Rysunek 4. Dostępne są już konfiguracje 32-bitowe i 64-bitowe.Jeśli będziesz mieć szczęście, nie będzie potrzeby dodatkowej konfiguracji projektu 64-bitowego. Ale to w dużej mierze zależy od projektu, jego złożoności i liczby używanych bibliotek. Jedyne, co należy od razu zmienić, to rozmiar stosu. Jeśli Twój projekt używa domyślnego rozmiaru stosu, czyli 1 megabajta, sensowne jest ustawienie go na 2 megabajty dla wersji 64-bitowej. Nie jest to konieczne, ale lepiej wcześniej się zabezpieczyć. Jeśli używasz rozmiaru stosu innego niż domyślny, sensowne jest zwiększenie go 2 razy w przypadku wersji 64-bitowej. Aby to zrobić, w ustawieniach projektu znajdź i zmień parametry Stack Reserve Size i Stack Commit Size. W tym miejscu warto byłoby porozmawiać o typowych problemach pojawiających się na etapie kompilacji konfiguracji 64-bitowej. Zastanów się, jakie problemy pojawiają się w przypadku bibliotek zewnętrznych, powiedz, że kompilator w kodzie związanym z funkcjami WInAPI nie będzie już pozwalał na umieszczanie wskaźnika w typie LONG i konieczna będzie modernizacja kodu i użycie typu LONG_PTG. I wiele, wiele innych. Niestety jest tego tak dużo, a błędy są tak różnorodne, że nie da się tego przedstawić w jednym artykule, a może nawet w książce. Będziesz musiał przejrzeć wszystkie błędy, które wygeneruje kompilator i nowe ostrzeżenia, których wcześniej nie było, i w każdym indywidualnym przypadku dowiedzieć się, jak zmodernizować kod.

Zbiór linków do zasobów poświęconych tworzeniu aplikacji 64-bitowych może częściowo ułatwić życie: http://www.viva64.com/links/64-bit-development/. Zbiór jest stale aktualizowany, a autor będzie wdzięczny czytelnikom, jeśli prześlą mu linki do zasobów, które ich zdaniem zasługują na uwagę.

Skupimy się tutaj jedynie na typach, które mogą zainteresować programistów podczas migracji aplikacji. Typy te przedstawiono w tabeli N3. Większość błędów kompilacji będzie związana z użyciem tych typów.

Typ Typ wymiaru na platformie x32 / x64 Notatka
wew 32 / 32 Typ podstawowy. W systemach 64-bitowych pozostaje wersja 32-bitowa.
długi 32 / 32 Typ podstawowy. W 64-bitowych systemach Windows pozostaje 32-bitowy. Należy pamiętać, że w 64-bitowych systemach Linux ten typ został rozszerzony do wersji 64-bitowej. Nie zapomnij o tym, jeśli tworzysz kod, który powinien działać i kompilować się dla systemów Windows i Linux.
rozmiar_t 32 / 64 Podstawowy typ bez znaku. Rozmiar typu dobiera się tak, aby zmieścił się w nim maksymalny rozmiar teoretycznie możliwej tablicy. Wskaźnik można bezpiecznie umieścić w typie size_t (wyjątek stanowią wskaźniki do funkcji klasowych, ale jest to przypadek szczególny).
ptrdiff_t 32 / 64 Podobny do typu size_t, ale sygnowany. Wynik wyrażenia, w którym jeden wskaźnik jest odejmowany od drugiego (ptr1-ptr2), będzie typu ptrdiff_t.
Wskaźnik 32 / 64 Rozmiar wskaźnika zależy bezpośrednio od pojemności bitowej platformy. Zachowaj ostrożność podczas rzutowania wskaźników na inne typy.
__int64 64 / 64 Podpisany typ 64-bitowy.
DWORD 32 / 32 32-bitowy typ bez znaku. Zadeklarowane w WinDef.h jako: typedef unsigned long DWORD;
DWORDLONG 64 / 64 64-bitowy typ bez znaku. Zadeklarowane w WinNT.h jako: typedef ULONGLONG DWORDLONG;
DWORD_PTR 32 / 64 Typ bez znaku, który może przechowywać wskaźnik. Zadeklarowane w BaseTsd.h jako: typedef ULONG_PTR DWORD_PTR;
DWORD32 32 / 32 32-bitowy typ bez znaku. Zadeklarowane w BaseTsd.h jako: typedef unsigned int DWORD32;
DWORD64 64 / 64 64-bitowy typ bez znaku. Zadeklarowane w BaseTsd.h jako: typedef unsigned __int64 DWORD64;
HALF_PTR 16 / 32 Pół wskaźnika. Zadeklarowane w Basetd.h jako:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif
INT_PTR 32 / 64 Typ ze znakiem, w którym można umieścić wskaźnik. Zadeklarowane w BaseTsd.h jako:#if zdefiniowane(_WIN64) typedef __int64 INT_PTR; #else wpiszdef int INT_PTR;#endif
DŁUGI 32 / 32 Typ ze znakiem, który pozostaje 32-bitowy. Dlatego w wielu przypadkach należy teraz używać LONG_PTR. Zadeklarowane w WinNT.h jako: typedef long LONG;
LONG_PTR 32 / 64 Typ ze znakiem, w którym można umieścić wskaźnik. Zadeklarowane w BaseTsd.h jako:#if zdefiniowane(_WIN64) typedef __int64 LONG_PTR; #else wpiszdef long LONG_PTR;#endif
LPARAM 32 / 64 Parametr wysyłania wiadomości. Zadeklarowane w WinNT.h jako: typedef LONG_PTR LPARAM;
ROZMIAR_T 32 / 64 Analogicznie do typu size_t. Zadeklarowane w BaseTsd.h jako: typedef ULONG_PTR SIZE_T;
SSIZE_T 32 / 64 Analogicznie do typu ptrdiff_t. Zadeklarowane w BaseTsd.h jako: typedef LONG_PTR SSIZE_T;
ULONG_PTR 32 / 64 Typ bez znaku, który może przechowywać wskaźnik. Zadeklarowane w BaseTsd.h jako:#if zdefiniowane(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif
SŁOWO 16 / 16 Typ 16-bitowy bez znaku. Zadeklarowane w WinDef.h jako: typedef unsigned short WORD;
WPARAM 32 / 64 Parametr wysyłania wiadomości. Zadeklarowane w WinDef.h jako: typedef UINT_PTR WPARAM;
Tabela N3. Rodzaje zainteresowań podczas przenoszenia programów 32-bitowych do 64-bitowych systemów Windows. Jeśli myślisz, że po poprawieniu wszystkich błędów kompilacji otrzymasz długo oczekiwaną aplikację 64-bitową, to musisz się rozczarować. Najtrudniejsza część jeszcze przed nami. Na etapie kompilacji poprawisz najbardziej oczywiste błędy, jakie mógł wykryć kompilator, a które związane są głównie z niemożnością niejawnego rzutowania typów. Ale to wierzchołek góry lodowej. Większość błędów jest ukryta. Z punktu widzenia abstrakcyjnego języka C++ błędy te wyglądają na bezpieczne lub są zamaskowane przez jawne rzutowanie typów. Takich błędów jest kilkakrotnie więcej niż błędów zidentyfikowanych na etapie kompilacji.

Nie należy wiązać nadziei z kluczem /Wp64. Klucz ten jest często reklamowany jako cudowne narzędzie do wyszukiwania błędów 64-bitowych. W rzeczywistości przełącznik /Wp64 umożliwia jedynie podczas kompilacji kodu 32-bitowego otrzymanie ostrzeżeń, że niektóre sekcje kodu będą nieprawidłowe w trybie 64-bitowym. Podczas kompilacji kodu 64-bitowego kompilator i tak wygeneruje te ostrzeżenia. Dlatego podczas kompilowania aplikacji 64-bitowej klucz /Wp64 jest ignorowany. Co więcej, ten klucz nie pomoże w znalezieniu ukrytych błędów.

Przyjrzyjmy się kilku przykładom ukrytych błędów. Najprostsza, ale nie najłatwiejsza do wykrycia klasa błędów związana jest z rzutowaniem typu jawnego, podczas którego obcinane są znaczące bity. Typowym przykładem jest rzutowanie wskaźników na typy 32-bitowe podczas przekazywania ich do funkcji takich jak SendMessage:

MójObj* pObj = ... ::SendMessage(hwnd, msg, (WORD)x, (DWORD)pObj);
W tym przypadku do konwersji wskaźnika na typ numeryczny używana jest jawna rzutacja typu. Dla architektury 32-bitowej powyższy przykład jest poprawny, ponieważ ostatni parametr funkcji SendMessage jest typu LPARAM, co jest tym samym, co DWORD w architekturze 32-bitowej. W przypadku architektury 64-bitowej użycie DWORD jest błędne i należy je zastąpić LPARAM-em. Typ LPARAM ma rozmiar 32 lub 64 bitów, w zależności od architektury.

Jest to prosty przypadek, ale często rzutowanie typu wygląda na bardziej wyrafinowane i nie można go wykryć za pomocą ostrzeżeń kompilatora ani przeszukiwania tekstu programu. Jawne rzutowanie typów pomija diagnostykę kompilatora, ponieważ ich zadaniem jest poinformowanie kompilatora, że ​​rzutowanie typu jest poprawne, a programista przyjął odpowiedzialność za bezpieczeństwo kodu. Wyszukiwanie jawne również nie pomoże. Typy mogą nie mieć standardowych nazw (określanych przez programistę za pomocą typedef), istnieje też sporo sposobów na implementację jawnego rzutowania typów. Aby rzetelnie zdiagnozować tego typu błędy, wystarczy skorzystać wyłącznie ze specjalnych narzędzi, takich jak analizatory Viva64 lub PC-Lint.

Następny przykład dotyczy niejawnego rzutowania typu, co również powoduje utratę znaczących bitów. Kod funkcji fread odczytuje z pliku, ale jest niepoprawny przy próbie odczytania więcej niż 2 gigabajtów danych w systemie 64-bitowym.

size_t __fread(void * __ogranicz buf, rozmiar_t rozmiar, liczba size_t, PLIK * __ogranicz 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) ;)
Funkcja __fread zwraca typ size_t, ale typ int służy do przechowywania liczby odczytanych bajtów. W rezultacie przy odczytywaniu dużej ilości danych funkcja może zwrócić inną liczbę bajtów niż faktycznie zostanie odczytana. Można powiedzieć, że jest to nieświadomy kod dla początkujących, że kompilator zgłosi takie rzutowanie typu i że ogólnie taki kod jest łatwy do znalezienia i poprawienia. To jest teoretyczne. Ale w prawdziwym życiu, przy dużych projektach, wszystko może być inne. Ten przykład pochodzi z kodu źródłowego FreeBSD. Błąd został naprawiony dopiero w grudniu 2008 roku! Dzieje się tak pomimo faktu, że pierwsza (eksperymentalna) 64-bitowa wersja FreeBSD została wydana w czerwcu 2003 roku. Oto kod źródłowy przed poprawką:

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fread.c?rev=1.14

A oto poprawiona wersja (grudzień 2008):

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fread.c?rev=1.15

Łatwo jest popełnić błąd w kodzie, który działa z pojedynczymi bitami. Następny rodzaj błędów związany jest z operacjami zmianowymi. Spójrzmy na przykład:

ptrdiff_t SetBitN(wartość ptrdiff_t, bitNum bez znaku) ( maska ​​ptrdiff_t = 1
Powyższy kod działa na architekturze 32-bitowej i pozwala na ustawienie bitów o numerach od 0 do 31 na jeden. Po przeniesieniu programu na platformę 64-bitową konieczne będzie ustawienie bitów od 0 do 63. Jednak ten kod nigdy nie ustawi bitów o numerach 32-63. Należy pamiętać, że „1” jest typu int i po przesunięciu o 32 pozycje nastąpi przepełnienie, jak pokazano na rysunku 5. To, czy wynikiem będzie 0 (rysunek 5-B), czy 1 (rysunek 5-C) zależy od kompilatora realizacja.

Rysunek 5. A - Prawidłowa instalacja 31. bitu w kodzie 32-bitowym; B,C - Błąd ustawienia 32-go bitu w systemie 64-bitowym (dwie opcje zachowania) Aby poprawić kod, należy wprowadzić stałą „1” tego samego typu co zmienna maski:

maska ​​ptrdiff_t = ptrdiff_t(1)
Należy również pamiętać, że nieskorygowany kod doprowadzi do kolejnego interesującego błędu. Podczas ustawiania 31 bitów w systemie 64-bitowym wynikiem funkcji będzie wartość 0xffffffff80000000 (patrz rysunek 6). Wynik wyrażenia 1 size_tRozmiar tablicy = N * 4; size_t *Array = (size_t *)malloc(Rozmiar tablicy); Główne liczby, na które należy zachować ostrożność przy przejściu na platformę 64-bitową, podano w tabeli N4.

Tabela N4. Główne magiczne wartości, które są niebezpieczne podczas przenoszenia aplikacji z platformy 32-bitowej na 64-bitową. W programach przetwarzających duże ilości danych mogą wystąpić błędy związane z indeksowaniem dużych tablic lub mogą wystąpić wieczne pętle. Poniższy przykład zawiera 2 błędy na raz:

stała wielkość_t wielkość = ...; znak *tablica = ...; char *end = tablica + rozmiar; for (unsigned i = 0; i != rozmiar; ++i) ( const int one = 1; end[-i - one] = 0; )
Pierwszy błąd polega na tym, że jeśli rozmiar przetwarzanych danych przekroczy 4 gigabajty (0xFFFFFFFF), to może wystąpić wieczna pętla, gdyż zmienna „i” jest typu „unsigned” i nigdy nie osiągnie wartości 0xFFFFFFFF. Specjalnie piszę, że zdarzenie jest możliwe, ale niekoniecznie nastąpi. To zależy od tego, jaki kod buduje kompilator. Na przykład w trybie debugowania będzie obecna wieczna pętla, ale w kodzie wydania pętla zniknie, więc kompilator zdecyduje się zoptymalizować kod przy użyciu 64-bitowego rejestru dla licznika i pętla będzie poprawna. Wszystko to powoduje zamieszanie, a kod, który działał wczoraj, może nagle przestać działać następnego dnia. Drugi błąd związany jest z przejściem tablicy od końca do początku, dla którego stosowane są ujemne wartości indeksów. Powyższy kod działa w trybie 32-bitowym, ale gdy zostanie uruchomiony na maszynie 64-bitowej, już przy pierwszej iteracji pętli dostęp do tablicy będzie wykraczał poza granice i program ulegnie awarii. Rozważmy przyczynę takiego zachowania. Zgodnie z regułą języka C++ na systemie 32-bitowym wyrażenie „-i - one” zostanie ocenione w następujący sposób (w pierwszym kroku i = 0):
  1. Wyrażenie „-i” jest typu bez znaku i ma wartość 0x00000000u.
  2. Zmienna „one” zostanie rozwinięta z typu „int” do typu unsigned i będzie równa 0x00000001u. Uwaga: Typ int jest rozwijany (zgodnie ze standardem języka C++) do typu „unsigned”, jeśli uczestniczy w operacji, w której drugi argument jest typu unsigned.
  3. Następuje operacja odejmowania, która obejmuje dwie wartości typu unsigned, a wynikiem operacji jest 0x00000000u - 0x00000001u = 0xFFFFFFFFu. Należy pamiętać, że wynik jest typu bez znaku.
  4. W systemie 32-bitowym dostęp do tablicy o indeksie 0xFFFFFFFFu jest równoznaczny z użyciem indeksu -1. Oznacza to, że koniec jest analogiczny do końca[-1]. Dzięki temu element tablicy jest przetwarzany poprawnie.
W systemie 64-bitowym w ostatnim akapicie obraz będzie inny. Typ unsigned zostanie rozwinięty do podpisanego ptrdiff_t, a indeks tablicy będzie równy 0x00000000FFFFFFFFi64. W rezultacie tablica będzie poza zakresem. Aby naprawić kod, musisz użyć typów takich jak ptrdiff_t i size_t. Są błędy, za które w zasadzie nikt nie jest winny, ale to nie powstrzymuje ich od bycia błędami. Wyobraź sobie, że dawno temu w odległej galaktyce (w Visual Studio 6.0) powstał projekt zawierający klasę CSampleApp, będącą potomkiem CWinApp. Klasa bazowa ma funkcję wirtualną o nazwie WinHelp. Spadkobierca pomija tę funkcję i wykonuje niezbędne czynności. Wizualnie pokazano to na rysunku 7.

Rysunek 7. Działający poprawny kod, który został utworzony w Visual Studio 6.0 Następnie projekt zostaje przeniesiony do Visual Studio 2005, gdzie prototyp funkcji WinHelp uległ zmianie, ale nikt tego nie zauważa, ponieważ w trybie 32-bitowym typy DWORD i DWORD_PTR są takie same, a program nadal działa poprawnie (Rysunek 8).

Rysunek 8. Niepoprawny, ale wykonalny kod 32-bitowy. Błąd czeka na ujawnienie się w systemie 64-bitowym, gdzie wielkość typów DWORD i DWORD_PTR jest różna (Rysunek 9). Okazuje się, że w trybie 64-bitowym klasy zawierają dwie RÓŻNE funkcje WinHelp, co jest oczywiście błędne. Należy pamiętać, że takie pułapki można ukryć nie tylko w MFC, gdzie niektóre funkcje zmieniły typy swoich argumentów, ale także w kodzie aplikacji i bibliotekach stron trzecich.

Rysunek 9. Błąd objawia się w kodzie 64-bitowym Można podać przykłady podobnych błędów 64-bitowych. Zainteresowanych tego typu błędami i chcących dowiedzieć się o nich więcej zainteresuje artykuł „20 pułapek przenoszenia kodu C++ na platformę 64-bitową”. Jak widać etap wyszukiwania ukrytych błędów jest zadaniem nietrywialnym, zwłaszcza, że ​​wiele z nich będzie pojawiać się nieregularnie lub tylko na dużych wolumenach danych wejściowych. Do diagnozowania tego typu błędów doskonale nadają się statyczne analizatory kodu, gdyż potrafią sprawdzić cały kod aplikacji, niezależnie od danych wejściowych i częstotliwości wykonywania jej sekcji w warunkach rzeczywistych. Analizę statyczną warto stosować zarówno na etapie przenoszenia aplikacji na platformy 64-bitowe, aby już na początkowym etapie wykryć większość błędów, jak i w dalszym rozwoju rozwiązań 64-bitowych. Analiza statyczna ostrzeże i nauczy programistę lepszego zrozumienia cech błędów związanych z architekturą 64-bitową i napisania wydajniejszego kodu. Autor artykułu jest twórcą jednego z takich specjalistycznych analizatorów kodu o nazwie Viva64. Z narzędziem można zapoznać się bardziej szczegółowo oraz pobrać wersję demonstracyjną ze strony internetowej firmy Software Verification Systems LLC. Aby być uczciwym, należy powiedzieć, że analizatory kodu, takie jak Gimpel PC-Lint i Parasoft C++Test, mają zestawy reguł do diagnozowania błędów 64-bitowych. Ale po pierwsze są to analizatory ogólnego przeznaczenia i zasady diagnozowania błędów 64-bitowych są w nich słabo reprezentowane. Po drugie, skupiają się bardziej na modelu danych LP64 używanym w rodzinie systemów operacyjnych Linux, co zmniejsza ich użyteczność dla programów Windows korzystających z modelu danych LLP64. Krok znajdowania błędów w kodzie programu opisany w poprzedniej sekcji jest krokiem koniecznym, ale niewystarczającym. Żadna metoda, łącznie ze statyczną analizą kodu, nie daje całkowitej gwarancji wykrycia wszystkich błędów, a najlepszy wynik można osiągnąć jedynie łącząc różne techniki.

Jeśli Twój program 64-bitowy przetwarza więcej danych niż wersja 32-bitowa, to musisz rozszerzyć testy o przetwarzanie danych większych niż 4 gigabajty. Jest to granica, za którą zaczyna pojawiać się wiele błędów 64-bitowych. Takie testy mogą potrwać o rząd wielkości dłużej i należy się na to przygotować z wyprzedzeniem. Zazwyczaj testy są pisane w taki sposób, aby w każdym teście przetworzyć niewielką liczbę elementów i tym samym móc przejść wszystkie wewnętrzne testy jednostkowe, np.? w kilka minut, a testy automatyczne (np. przy użyciu AutomatedQA TestComplete) w kilka godzin. Jeśli funkcja sortująca w systemie 32-bitowym posortuje 100 elementów, prawie na pewno będzie działać poprawnie w przypadku 100 000 elementów. Jednak ta sama funkcja w systemie 64-bitowym może zawieść przy próbie przetworzenia 5 miliardów elementów. Szybkość wykonywania testu jednostkowego może spaść miliony razy. Nie zapomnij uwzględnić kosztów adaptacji testów podczas opanowywania systemów 64-bitowych. Jednym z rozwiązań jest podzielenie testów jednostkowych na szybkie (pracujące z małą ilością pamięci) i wolne, przetwarzające gigabajty i działające np. w nocy. Zautomatyzowane testowanie programów 64-bitowych wymagających dużych zasobów można zbudować w oparciu o przetwarzanie rozproszone.

Najprawdopodobniej na Twoim komputerze działa 64-bitowa wersja systemu Windows. Ale jeśli otworzysz Menedżera zadań, zobaczysz, że większość programów w twoim systemie jest nadal 32-bitowa. Czy to naprawdę problem?

Istnieje wiele różnic między 64-bitowymi i 32-bitowymi wersjami systemu Windows. W 64-bitowych wersjach systemu Windows można uruchomić oprogramowanie 32-bitowe, ale w 32-bitowych wersjach systemu Windows nie można uruchomić oprogramowania 64-bitowego.

Jak sprawdzić głębię bitową programu?

Użyjmy Menedżera zadań, aby zobaczyć, które programy są 64-bitowe, a które 32-bitowe. Kliknij prawym przyciskiem myszy pasek zadań i wybierz Menedżera zadań lub naciśnij Ctrl + Shift + Esc, aby go otworzyć.

Spójrz na kolumnę z nazwami procesów. Jeśli używasz 64-bitowej wersji systemu Windows 8.1 lub 8, po każdej 32-bitowej wersji nazwy programu zobaczysz słowo „(32-bit)”. Jeśli używasz 64-bitowej wersji systemu Windows 7, zamiast tego zobaczysz „*32”.

Programy 32-bitowe są zwykle instalowane w folderze C:\Program Files (x86)\ w 64-bitowych wersjach systemu Windows, natomiast programy 64-bitowe są zwykle instalowane w folderze C:\Program Files\.
To tylko zasada. Ale nikt nie mówi, że nie ma innej zasady zabraniającej instalowania programów 64-bitowych w folderze C:\Program Files (x86)\. Na przykład Steam jest programem 32-bitowym, więc domyślnie instaluje się w „C:\Program Files (x86)”. Gry, które instalujesz na Steamie, są domyślnie instalowane w folderze C:\Program Files (x86)\Steam, łącznie z. nawet 64-bitowe wersje gier.

Jeśli porównasz dwa różne foldery Program Files, odkryjesz, że większość programów jest najprawdopodobniej zainstalowana w folderze C:\Program Files (x86). Programy te są przeważnie 32-bitowe.

Uruchamianie oprogramowania 32-bitowego w 64-bitowym systemie operacyjnym

Na pierwszy rzut oka wydaje się okropne, że większość programów Windows nie korzysta z 64-bitowej architektury systemu operacyjnego. Można by pomyśleć, że uruchamianie 32-bitowych programów w 64-bitowym systemie operacyjnym powoduje spadek wydajności, ale tak nie jest.

System Windows uruchamia programy 32-bitowe na poziomie zgodności WoW64 w 64-bitowych wersjach systemu Windows. Jednakże 64-bitowe procesory Intel i AMD są kompatybilne wstecz i mogą bezpośrednio uruchamiać oprogramowanie 32-bitowe. Wszystkie programy w 32-bitowym systemie Windows będą działać tak samo, jak w 32-bitowej wersji systemu Windows. Zatem nie ma przeszkód, aby uruchamiać te programy w 64-bitowym systemie operacyjnym.

Nawet jeśli każdy program, którego używasz, jest nadal 32-bitowy, odniesiesz korzyść, ponieważ sam system operacyjny będzie działał w trybie 64-bitowym. Ponadto 64-bitowa wersja systemu Windows jest bezpieczniejsza.

Programy 64-bitowe i programy 32-bitowe: co jest lepsze?

Programy 32-bitowe działają bez problemów w 64-bitowych wersjach systemów operacyjnych Windows. Ale czy byłoby lepiej, gdyby wszystkie programy były 64-bitowe?

Programy 64-bitowe mają zdecydowanie zalety. Programy 32-bitowe mogą wykorzystywać tylko 2 GB pamięci, podczas gdy programy 64-bitowe mogą wykorzystywać znacznie więcej. Jeśli istnieje prawdopodobieństwo, że program zostanie zaatakowany, pomocne mogą okazać się dodatkowe funkcje zabezpieczeń zastosowane w programach 64-bitowych. Google Chrome jest obecnie aplikacją 32-bitową nawet na 64-bitowych wersjach systemu Windows, ale pojawiła się już 64-bitowa wersja beta tego programu. Google obiecuje, że 64-bitowa wersja przeglądarki Chrome będzie szybsza, bezpieczniejsza i stabilniejsza.

Niektóre programy oferują wersje 64-bitowe. Na przykład: Photoshop, iTunes, Microsoft Office i niektóre z najpopularniejszych programów Windows i wszystkie są dostępne w wersji 64-bitowej. Najnowsze gry są również często 64-bitowe, więc mogą wykorzystywać więcej niż 2 GB pamięci.

Wiele programów nie przeszło na wersję 64-bitową i większość nigdy tego nie zrobi. Większość 32-bitowych programów systemu Windows nadal można uruchamiać w 64-bitowej wersji systemu Windows, nawet te, które zostały wydane dziesięć lat temu, nawet jeśli ich twórcy już je zaktualizowali.

Programista, który chce udostępnić 64-bitową wersję swojego programu, musi wykonać dużo dodatkowej pracy. Musi zadbać o to, aby istniejący kod skompilował się i działał poprawnie jako oprogramowanie 64-bitowe. Musi zapewniać i obsługiwać dwie oddzielne wersje programu, ponieważ użytkownicy korzystający z 32-bitowej wersji systemu Windows nie mogą korzystać z wersji 64-bitowej.

Weźmy jako przykład Evernote na komputery z systemem Windows. Nawet gdyby wypuścili 64-bitową wersję Evernote, użytkownicy prawdopodobnie w ogóle nie zauważyliby różnicy. Program 32-bitowy może działać dobrze w 64-bitowej wersji systemu Windows, a jeśli nie ma zauważalnych korzyści, posiadanie wersji 64-bitowej nie ma sensu.

Gdzie znaleźć aplikacje 64-bitowe

Generalnie nie będzie możliwości wyboru pomiędzy 32-bitową a 64-bitową wersją oprogramowania. Na przykład podczas instalowania programu iTunes dla systemu Windows witryna firmy Apple automatycznie przekieruje Cię do 32-bitowej lub 64-bitowej wersji instalatora, w zależności od wersji systemu Windows. Podczas instalowania programu Photoshop dla systemu Windows zazwyczaj instalowane są zarówno 32-bitowe, jak i 64-bitowe pliki wykonywalne. Photoshop automatycznie je wybiera. Czasami możesz zobaczyć osobne łącza do pobierania 32-bitowych i 64-bitowych wersji programów, ale nie jest to zbyt częste.

Ważne jest, aby nie szukać aplikacji 64-bitowych, ale znaleźć aplikacje, które będą dla Ciebie odpowiednie. W przypadku większości aplikacji nie ma znaczenia, czy wersja jest 64-bitowa, czy 32-bitowa.

Po otwarciu menedżera zadań łatwo jest się zastanawiać, dlaczego tak wiele aplikacji jest nadal 32-bitowych. Ale nie jest to bardzo duży problem i oto dlaczego. Ponieważ większość aplikacji nic nie zyskuje po przejściu na 64-bitowe edycje programów. Nawet gdyby programiści wykonali całą pracę i wypuścili 64-bitowe wersje wszystkich małych aplikacji i narzędzi komputerowych używanych w systemie Windows, w przypadku większości z nich nie byłby w stanie dostrzec różnicy.

] Jednak 32-bitowe systemy operacyjne są nadal obecne na rynku w dość dużych ilościach. Wiele nowoczesnych narzędzi programowych zostało opracowanych wyłącznie do pracy w trybie 64-bitowym, ponieważ zapewnienie funkcjonalności programu zarówno w 32-bitowym, jak i 64-bitowym systemie operacyjnym wymaga dodatkowych kosztów pracy i odpowiednio wzrasta koszt rozwoju.

W przypadku użytkowników 32-bitowego systemu operacyjnego czasami zachodzi potrzeba użycia oprogramowania przeznaczonego tylko dla 64-bitowego systemu operacyjnego. Co zrobić, jeśli użytkownik nie jest gotowy zrezygnować z 32-bitowego systemu operacyjnego jako głównego działającego systemu?

Różne systemy operacyjne mają swoje własne cechy związane z uruchamianiem aplikacji 64-bitowych w środowisku 32-bitowym. Uruchamiając aplikację 64-bitową bezpośrednio w środowisku 32-bitowym, traci się przewagę związaną z możliwością wykorzystania większej ilości pamięci RAM. Aby obsługiwać aplikacje 64-bitowe, procesor musi mieć architekturę 64-bitową. Przyjrzyjmy się niektórym z najpopularniejszych systemów operacyjnych.

Mac OS X ma jądro hybrydowe. Dzięki temu każda aplikacja może działać tak samo, niezależnie od tego, czy jest 32-bitowa, czy 64-bitowa. Jedyną różnicą pomiędzy jądrem hybrydowym, a pełnym 64-bitowym jest brak możliwości wykorzystania w systemie więcej niż 32 GB pamięci RAM. Dlatego w tej chwili nie ma absolutnie żadnej różnicy między uruchamianiem w trybie 32-bitowym i 64-bitowym. Ale w przyszłości różnica z pewnością pojawi się wraz ze wzrostem wykorzystania pamięci RAM i pojawieniem się nowych technologii.

W przypadku systemów operacyjnych z rodziny Linux i 32-bitowych systemów operacyjnych z rodziny Windows uruchamianie aplikacji 64-bitowych w środowisku 32-bitowym odbywa się z wykorzystaniem technologii wirtualizacji. Istnieje wiele wyspecjalizowanych programów, które umożliwiają instalację 64-bitowego systemu operacyjnego wirtualnego gościa, w którym można zainstalować żądaną aplikację i ją uruchomić. Jednocześnie, jeśli zainstalowany system operacyjny jest płatny, będziesz zmuszony go kupić.

Wirtualizacja