почему 32-битные драйверы не работают на 64-битных - PullRequest
7 голосов
/ 10 июня 2011

Судя по прошлым прочтениям, большинство 32-битных драйверов не будут работать на 64-битных.

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

Я прочитал эту статью вики о x86-64, в которой говорится

Толчки и выталкивания в стеке всегда выполняются 8-байтовыми шагами, а указатели имеют ширину 8 байт.

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

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

Ответы [ 4 ]

7 голосов
/ 10 июня 2011

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

Драйверы часто связаны с перемещением данных между физическими устройствами (например, диском) иобъем памяти.Драйверу будет предложено перенести X дисковых секторов в память по адресу Y.

В 64-разрядной ОС Y будет 64-разрядным адресом, поэтому 32-разрядный драйвер не может справиться с этим.И, конечно, есть проблема в том, что размер переданного указателя в два раза больше ожидаемого, поэтому, если он ДЕЙСТВИТЕЛЬНО запустился, он, вероятно, пометит всю неправильную память ...

4 голосов
/ 10 июня 2011

Помните, что драйверы предназначены для связи с оборудованием. Что, если 32-битный код драйвера был загружен в область памяти, которая находится на расстоянии более 4 гигабайт от того места, где находятся аппаратные регистры отображения памяти ? Код драйвера будет записываться в памяти, которая не имеет ничего общего с самим собой или оборудованием, которое предполагается использовать.

2 голосов
/ 10 июня 2011

x86-64 процессоры не могут запускать 32-битный код в привилегированном режиме (ядро).Режим совместимости доступен только для пользовательского пространства.

1 голос
/ 22 мая 2017

Мои 2 цента стоят.Microsoft не рассказывает о беспорядке, который она вызывает при выпуске обновлений или исправлений.

Особенно о том, что аппаратное обеспечение Legacy совместимо с ОС x64 поколения.Я говорю здесь о бесчисленном количестве научного оборудования, которое имеет только 32-битные драйверы с таким оборудованием, которое больше недоступно и больше не поддерживается, в результате чего в Labs работает XP или, в лучшем случае, 7 x86.Аналогичным образом потребители покупают биометрические сканеры и различное медицинское оборудование.

Путь x64 должен быть рассчитан на использование устаревшего 32-битного оборудования.

...