Выравнивание данных 64-битной Windows с точки зрения разработки драйверов - PullRequest
1 голос
/ 04 ноября 2010

Я обнаружил this на MSDN:

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

Я несколько напуган этим.Может кто-нибудь показать мне пример ошибки несоосности ?

РЕДАКТИРОВАТЬ: Я в основном знаю понятие выравнивания и его причины.Я просто хочу выяснить разницу между win32 и win64 с точки зрения «автоматического исправления» выравнивания и влияния на мой драйвер.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2010

Рассмотрим следующую структуру, где a и c являются 32-битными словами, а b является байтом.

|-----------a-----------|--b--|-----------c-----------|
|     :     :     :     :     :     :     :     |     :

Если вы разместите эту структуру на 64-битной границе, то a и b будут правильно выровнены, а c - нет, поскольку она пересекает 64-битную границу слова. Фактически, невозможно расположить эту структуру без толкания a или c за такую ​​границу.

На практике компиляторы обычно принимают такое определение:

struct {
    int a;
    char b;
    int c;
};

и расположите его так:

|-----------a-----------|--b--|     padding     |-----------c-----------|
|     :     :     :     :     :     :     :     |     :     :     :     :

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

1 голос
/ 04 ноября 2010

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

Машины WIntel очень терпимы к этим сбоям, но большинство других архитектур, таких как ARM, выдают исключения при всех проблемах выравнивания, поэтому все приведенные указатели рассматриваются с крайним подозрением. Быть осторожным, очень осторожным, это единственный путь вперед, и использование инструментов статического анализа, таких как Lint и Klocwork, очень помогает.

0 голосов
/ 05 ноября 2010

Цитировать этот документ, если у кого-то есть такая же проблема:

Если процессор пытается прочитать или написать неправильно выровненные данные, может возникнуть ошибка выравнивания. На х86 аппаратные средства, ошибки выравнивания невидимый для пользователя. Аппаратное обеспечение устраняет неисправность, как описано в предыдущий абзац. На оборудовании x64, ошибки выравнивания отключены по умолчанию и аппаратное обеспечение аналогично исправляет ошибку. На Intel Itanium архитектура, однако, если выравнивание ошибка возникает в 64-битном режиме ядра код работает, аппаратное обеспечение повышается исключение. (Для кода режима пользователя это настройка по умолчанию, что индивидуальное приложение может измениться, хотя отключение ошибок выравнивания на Itanium может сильно ухудшиться производительность.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...