вторник, 20 апреля 2010 г.

Переход от 32 к 64 битным приложениям

В середине 90x миграция из 16-битных систем на 32-битные шла своим чередом: с одной стороны преимущества явно видны, с другой портирование сводило с ума многих разработчиков, так как требовало изучения новой модели памяти, нового API и измененной арифметики указателей.

В наше время ситуация повторяется, но уже при переходе от 32-битных приложений к 64-битным. К счастью, изменения намного умереннее и для большинства приложений придется сделать совсем немного для успешного запуска 32-битного приложения на 64-битной системе. Благодаря технологиям виртуализации и особенностям CLR, .NET приложение может стать 64-битным автоматически.

Однако, преодоление 2Гб лимита (Ru) (PAE) может стать затруднительным при использовании неуправляемого кода или несовместимых компонентов.

Для неуправляемых приложений все относительно просто, в случае, если они скомпилированы как 32-битное приложение, то они будут работать под управлением Windows-on-Windows (WoW64), предоставляющей совместимую среду для “прозрачного” выполнения 32-битных приложений на всех 64-битных версиях Windows.

В случае же управляемого приложения может показаться странным наличие каких-то проблем при переходе от 32-битной ОС к 64-битной, так как технически управляемый код является независимым от битности ОС и процессора (на самом деле там есть небольшая заглушка, но она не используется так как во всех современных ОС, включая последние 64-битные, загрузчик ОС непосредственно знает об управляемом коде). Однако несмотря на это есть некоторые подводные камни.

Для управляемых приложений можно указать как оно должно работать в 64-битной операционной системе: либо как native application(x64), либо под управлением WoW64 (x86).

Существует несколько целевых платформ, на которые разработчик может ориентироваться при разработке: AnyCPU , x86, x64, и Itanium

  • при компиляции в x86 сборка будет запущена в 32-битной, x86-совместимой CLR;
  • выбор Itanium приводит к компиляции для работы под управлением 64-битной CLR на компьютерах с процессором Itanium. Планируется прекращение поддержки данной платформы;
  • компиляция в x64 ограничивает возможность работы 64-битной CLR на компьютерах, с процессорами, поддерживающими набор инструкций AMD64 или EM64T;
  • AnyCPU задает компиляцию сборки с возможностью работы на любой платформе.

Такое разделение появилось в связи с необходимостью поддержки устаревшего кода, несмотря на то, что .NET приложения сами по себе не зависят от битности ОС, многие из них зависят от неуправляемого кода, например, от дополнительных компонентов, которые по тем или иным причинам было решено использовать в процессе разработки приложения. Зачастую эти дополнительные компоненты/библиотеки и становятся тем камнем, что тянет управляемое приложение, не давая воспользоваться преимуществами независимой архитектуры.

В 64-битной ОС:

  • сборки, скомпилированные как x86 будут выполняться под управлением 32-битной CLR под управлением WoW64;
  • исполняемые файлы AnyCPU  будут выполняться 64-битной CLR;
  • библиотеки DLL AnyCPU будут выполняться под управлением той же CLR, что и процесс, который их загрузил.

Для наглядности эта информация ниже приведена в табличном виде. В столбцах информация о моделях исполняемых файлах, в строках – динамических библиотек. В ячейках возможность загрузки соответствующей DLL.

32-битная ОС:

 

AnyCPU.exe

32-битный процесс

x86.exe

32-битный процесс

x64.exe

BadImageFormatException

AnyCPU.dll

успешная загрузка

успешная загрузка

-

x86.dll

успешная загрузка

успешная загрузка

-

x64.dll

BadImageFormatException

BadImageFormatException

-

64-битная ОС:

 

AnyCPU.exe

64-битный процесс

x86.exe

32-битный процесс

x64.exe

64-битный процесс

AnyCPU.dll

успешная загрузка

успешная загрузка

успешная загрузка

x86.dll

BadImageFormatException

успешная загрузка

BadImageFormatException

x64.dll

успешная загрузка

BadImageFormatException

успешная загрузка

Чтобы определить на какую платформу рассчитана сборка можно воспользоваться CorFlags Conversion Tool или программно с помощью метода System.Reflection.Module.GetPEKind.

Для неуправляемых приложений информация о платформе сохраняется в PE заголовке, поэтому для просмотра потребуется дампер. Можно воспользоваться стандартными средствами: dumpbin /HEADERS, сейчас этот функционал встроен в  link.exe /dump /HEADERS Основное, на что надо обратить внимание в дампе – целевая машина: 8664 machine (x64), 14C machine (x86). В качестве альтернативы, можно попробовать воспользоваться PEDump от Matt Pietrek, но у него несколько проблем: декодировать x64 значение придется вручную (8664), x86 названо как (i386) и он падает при анализе 64-бит DLL на 64-бит Windows 7, впрочем успевая вывести заголовок. При желании можете подкорректировать исходные тексты, чтобы этого избежать, если по каким-либо причинам использование link.exe /dump вас не устраивает.

 

Стоит ли переходить на 64 бит?

Как обычно в любом вопросе так или иначе связанном с производительностью - ответ зависит от конкретной ситуации. Так или иначе, ниже список плюсов и минусов, которые стоит принимать в расчет.

Плюсы:

  • важнейшим преимуществом 64-битных процессов является увеличенное адресное пространство;
  • оптимизированная 64-битная математика;
  • 64-битной ядро ОС использует больший доступный объем памяти для улучшения многих аспектов работы.

Минусы:

  • на многое требуется больше памяти (указатели занимают больше, а особенно в управляемом коде, где повсюду ссылки);
  • эффективная часть процессорного кэша меньше (если сравнивать 32-битный и 64-битный режимы работы) по той же причине;
  • увеличивается так же и размер кода, за счет дополнительных префиксов и инструкций, содержащих 8-ми байтовые операнды, вместо 4х байтных.

Это ведет к тому, что код, отлично работающий на 32-битах, не содержащий никакой 64-битной арифметики (т.е ни каким другим способом не использующий новые возможности 64-битного процессора), не испытывающий потребности в превышении 2Гб доступной памяти, от работы в 64 битной ОС получит только недостатки: больший потребляемый объем в памяти и некоторое замедление работы.

Однако, если приложение или набор приложений может получить какие-то преимущества по сравнению с указанными минусами, то это может стать решающим фактором. Например, многие приложения упираются в ограничения по памяти. Кроме того для некоторых приложений переход на 64-битную математику дает существенный прирост производительности. Например, приложениям для работы с графикой, кодированием видео и пр.

Проблемы использования платформы AnyCPU:

  • разработка под два различных режима (32-бит и 64-бит) увеличивает сложность продукта и стоимость тестирования. Очень часто неочевидно, что в случае зависимости приложения от неуправляемого кода необходимо удостовериться, что доступны версии этих компонентов в обоих вариантах и самое главное, что нужный из них автоматически выбирается. Большей частью это решается относительно просто за счет функций перенаправления ОС, однако может иногда приводить к проблемам.
  • некоторые из возможностей недоступны в 64-битном исполнении: отладка x64 кода была добавлена только в CLR v4, до этого отладка была доступна только в смешанном режиме (x86). Функция “Исправить-и-продолжить (edit-and-continue)” до сих пор не поддерживается в x64, та же самая участь постигла возможность исторической отладки (Historical Debugging, IntelliTrace™) в VS 2010. Это следствие различной базы исходных кодов (например, полностью раздельные JIT компиляторы для 32-бит и 64-бит), приводящее к необходимости компромисса и невозможности реализации некоторого функционала из-за огромных временных затрат.

Причины, по которым до сих пор нет Visual Studio 64-бит:

  • с точки зрения производительности - указатели становятся больше по размеру, соответственно увеличивается размер структур данных, а кэш процессора остается неизменным (уменьшается его эффективная часть) - в основном это приводит к чистой потере производительности. Другими словами, начиная в яме, вы пытаетесь из нее выбраться, используя дополнительную память больше 4Гб как вспомогательное средство для этого. Да, для некоторых огромных проектов это, возможно, и помогло бы, но предпочтительнее прооптимизировать размер используемых структур в первую очередь, что даст возможность обрабатывать больше на том же объеме.
  • с точки зрения затрат, возможно, самый экономичный способ портировать Visual Studio на 64 бит – это переписать большую его часть на управляемый код, а затем дописать и все остальное. Стоимость такого портирования очень высока, кроме того она приведет к тому, что все известные расширения перестанут работать и придется создавать новую 64-битную экосистему подобно тому, как это делалось для драйверов. Несомненно существуют люди, которые бы могли воспользоваться преимуществами 64-битной версии, но лучше все же эти деньги потратить на уменьшение потребляемой памяти IDE, чем на портирование.

 

Проблемы при переходе

Как и в случае 32-битной ОС, существует 2Гб ограничение на размер одного объекта, который можно создать при работе 64-битного управляемого приложения на 64-битной ОС.

Во многих случаях сборки работают одинаково на 32-битной и 64-битной версии CLR. Основные причины, по которым исполнение в 64-битной среде CLR может отличаться, следующие:

  • изменение размеров структур, состоящих из членов, имеющих зависимый от платформы размер, например, указателей;
  • арифметика с указателями, включающая операции с указанием константных размеров;
  • некорректное определение P/Invoke или COM-объекта, задающее Int32 для хэндлов вместо IntPtr;
  • преобразование IntPtr в Int32 при маршалинге.

 

Охватить весь доступный материал практически невозможно в одной статье, так что рекомендую продолжить чтение по ссылкам ниже.

 

Рекомендуемые статьи / сайты

Migrating 32-bit Managed Code to 64-bit

Find out what is involved in migrating 32-bit managed applications to 64-bit, issues that can impact migration, and the tools that are available to assist you.

64 бита для программистов 

Сайт для C/C++ разработчиков 64-битных и параллельных приложений.

Start 64! - Start on 64

Великолепный ресурс, посвященный всему 64 битному миру. Не пропустите технологические статьи.

Zizman.coM

Cайт посвящен x64 тематике. У нас вы сможете скачать последние новинки x64 софта (пока мы выкладываем только бесплатный софт для Windows x64), прочитать интересные статьи о 64-битных программах и системах.

Extended64 - The 64-Bit Windows Community

Extended64 is a website dedicated to the 64-bit Windows platform. Our goal is to help users of all kinds, from the most experienced IT Professionals and Application Developers, to the home user who is just starting with 64-bit. Lead by highly experienced technology experts, Extended64 is a collaborative community where our members get to write their own tips and guides, ask questions, and answer other people's questions.

x(perts)64 - The unofficial x64 FAQ

64bits.net

The mission of 64bits.net is to explore all aspects of the 64 bit generation of computing systems from the gory technicial details to the issues that drive the business need for these systems.

Введение в 64 бита для начинающих, или где же 64-битный мир?

Довольно давно появились 64-битные процессоры, операционные системы, отдельные программы. Однако полностью на 64 бита перешли еще далеко не все пользователи. В статье рассматриваются причины этого.

64 bits. What does it offer, and what does it not?

Good question. And here is the answer in a single sentence: We have everything and still, we have nothing. Of course, this sounds cynical and highly biased. The truth lies somewhere in the middle. It will probably be best for us to take a look around. A detailed analysis.

Windows x64 – All the Same Yet Very Different, Part 1: Virtual Memory, Part 2: Kernel Memory, /3GB, PTEs, (Non-) Paged Pool, Part 3: CPUs, AMD64, Intel 64, EM64T, Itanium, Part 4: Code Trees, Drivers, Part 5: NTVDM, Services, WoW64, Part 6: COM, DLLs and Processes, Part 7: File System and Registry Redirection, Registry Reflection , x64? My Terminal Servers Run Just Fine With 32 Bits and 8/12/16 GB RAM!, x64 Divided by Two is NOT x32!

Серия статей, посвященных Windows x64, произошедшим изменениях, ключевым ограничениям x86-32 платформы, особенностям процессов и разработки на 64 битных платформах. 

7 шагов по переносу программы на 64-битную систему

В статье рассмотрены основные шаги, обеспечивающие корректный перенос 32-битных Windows приложений на 64-битные Windows системы. Хотя статья ориентирована на разработчиков, использующих язык Си/Си++ в среде Visual Studio 2005/2008, она будет полезна и другим разработчикам, планирующим перенос своих приложений под 64-битные системы.

64-Bit .NET Framework Development (MSDN Forum)

Need help making your .net applications (any language) work on 64-bit? Ask your questions here!

Visual Studio Development Environment 64-Bit Support

Information on features in the Visual Studio development environment that help you create 64-bit applications.

Архитектура AMD64 (EM64T)

В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.

x86-64

x86-64 (также x64/AMD64/Intel64/EM64T) — 64-битная аппаратная платформа: архитектура микропроцессора и соответствующий набор инструкций и чипсет, разработанные компанией AMD. Это расширение архитектуры x86 с полной обратной совместимостью. Корпорации Microsoft и Sun Microsystems используют для обозначения этого набора инструкций термин "x64", однако каталог с файлами для архитектуры в дистрибутивах Microsoft называется "amd64" (ср. "i386" для архитектуры x86).

The history of calling conventions, part 1, part 2, part 3, part 4: ia64, part 5: amd64

Обзор проблем совместимости для 32-разрядных программ в 64-разрядных версиях Windows Server 2003 и Windows XP

В этой статье описаны некоторые проблемы совместимости для 32-разрядных программ в 64-разрядных версиях Windows Server 2003 и Windows XP. В ней сравниваются 32-разрядные и 64-разрядные версии Windows Server 2003, Windows XP или других 64-разрядных операционных систем. В данной статье предполагается, что читатель понимает различие между 32-разрядными и 64-разрядными двоичными кодами.

Все, что нужно знать, чтобы начать программировать для 64-разрядных версий Windows

В данной статье я поделюсь квинтэссенцией своих знаний в области Win64 и архитектуры x64 - тем минимумом, который необходим опытному Win32-программисту для перехода на платформу x64. При этом я исхожу из того, что вам известны базовые концепции Win32 и платформы x86 и вы понимаете, зачем ваш код должен работать в Win64. Это позволит мне не отвлекаться от основной тематики. В общем, считайте мою статью обзором, где рассматриваются лишь наиболее важные различия архитектур Win64/x64 и Win32/x86.

64-bit Applications on MSDN 

Beginning in Visual Studio 2005 you can compile your application and specify that it should run on a 64-bit operating system either as a native application or under WOW64. WOW64 is a compatibility environment provided by the operating system that allows a 32-bit application to run on a Windows 64-bit operating system.

Programming Guide for 64-bit Windows

Microsoft has released 64-bit versions of the Windows operating system, such as 64-bit Windows Vista, Windows XP Professional x64 Edition, and Windows Server 2003 R2 x64 Enterprise Edition. 64-bit Windows was designed with compatibility in mind. Developers can ensure that their existing 32-bit applications run well under 64-bit Windows or take advantage of the benefits of 64-bit Windows by migrating their applications.

Understanding .NET application options for 32 and 64-bit systems

In this article, you are going to learn the basics of moving your ,.NET & C# applications to 64-bit systems. Along the way, you are also going to learn a bit about memory management, code compatibility, and discover migration tips.

Physical Address Extension - PAE Memory and Windows

PAE is an Intel-provided memory address extension that enables support of greater than 4 GB of physical memory for most 32-bit (IA-32) Intel Pentium Pro and later platforms. This article provides information to help device driver developers implement Windows drivers that support PAE. Исключительно для ознакомления.

Visual C++ Developer Center 64-Bit Programming

The current version of 64-bit Windows supports the x64 and Intel Itanium Processor Family, and is built for the highest levels of scalability. It has support for up to 64 processors and 16-terabyte (TB) of memory (architectural limit). This page contains links to information for developers interested in creating 64-bit applications.

Everything You Need To Know To Start Programming 64-Bit Windows Systems by Matt Pietrek 

In this article I'll boil down my experiences with Win64 and the x64 architecture to the essentials that a hotshot Win32® programmer needs for the move to x64. I'll assume that you know basic Win32 concepts, basic x86 concepts, and why your code should run on Win64. This frees me to focus on the good stuff. Think of this overview as a look at just the important differences relative to your knowledge of Win32 and the x86 architecture.

Should I choose to take advantage of 64-bit?

Here's the guts of a response that I posted a while back to an internal mailing list re: tradeoffs of runing your managed code as 64-bit vs 32-bit. YMMV, and I'll remind you that every perf question has a thousand answers depending on the situation.

AnyCPU Exes are usually more trouble than they're worth

Over the past few months I've had some interesting debates with folks here (and some customers) about the cost/benefit trade-off of "AnyCPU" (architecture-neutral) managed EXEs.  I think we've converged on a consensus that most of the time they're not what you want and so shouldn't be the default in Visual Studio.  I suspect this topic may interest (and even shock) some folks, so I thought I'd share the rationale with you here.

Visual Studio: Why is there no 64 bit version? (yet)

From time to time customers or partners ask me about our plans to create a 64 bit version of Visual Studio. When is it coming? Why aren’t we making it a priority? Haven’t we noticed that 64 bit PC’s are very popular? Things like that. We just had an internal discussion about “the 64 bit issue” and so I thought I would elaborate a bit on that discussion for the blog-o-sphere.

2 коммент.

Andrey Karpov комментирует...

Очень хорошая статья! Предлагаю помочь с ее переводом и публикацией на сайте Intel и других сайтах.

--
С уважением, Андрей Карпов
к.ф.-м.н., Технический директор
ООО "Системы программной верификации"
Сайт: http://www.viva64.com/ru/main/
E-Mail: karpov@viva64.com
Тел.: +7 (4872) 38-59-95 (GMT + 03:00)

zed_0xff комментирует...

для дампов онлайн можно юзать pedump.me, также есть консольная версия, понимающая x64