Почему 32-битное ядро ​​может работать с 64-битным бинарным? - PullRequest
24 голосов
/ 08 сентября 2008

На моем компьютере с OS X ядро ​​является 32-разрядным двоичным файлом, и все же оно может работать с 64-разрядным двоичным файлом. Как это работает?

cristi:~ diciu$ file ./a.out
./a.out: Mach-O 64-bit executable x86_64
cristi:~ diciu$ file /mach_kernel
/mach_kernel: Mach-O universal binary with 2 architectures
/mach_kernel (for architecture i386):   Mach-O executable i386
/mach_kernel (for architecture ppc):    Mach-O executable ppc
cristi:~ diciu$ ./a.out
cristi:~ diciu$ echo $?
1

Ответы [ 6 ]

43 голосов
/ 08 сентября 2008

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

Ядро MacOS X не извлекает напрямую указатели из пользовательского приложения, так как оно находится в своем отдельном адресном пространстве. Например, указатель пространства пользователя в вызове ioctl должен сначала быть преобразован в его физический адрес, а затем новый виртуальный адрес, созданный в адресном пространстве ядра. Не имеет значения, был ли этот указатель в ioctl 64-битным или 32-битным, ядро ​​не разыменовывает его напрямую в любом случае.

Таким образом, смешивание 32-битного ядра и 64-битных двоичных файлов может работать, и наоборот. Вы не можете смешивать 32-битные библиотеки с 64-битным приложением, так как указатели, передаваемые между ними, будут усечены. MacOS X предоставляет больше своих платформ в 32- и 64-битных версиях в каждом выпуске.

6 голосов
/ 10 сентября 2008

Обратите внимание, что не все 32-разрядные ядра способны выполнять 64-разрядные процессы. У Windows, конечно, нет этого свойства, и я никогда не видел, чтобы это было сделано в Linux.

6 голосов
/ 08 сентября 2008

Это не ядро, которое запускает бинарный файл. Это процессор.

Двоичный файл вызывает библиотечные функции, и они должны быть 64-битными. И если им нужно сделать системный вызов, они обязаны справиться с тем фактом, что они сами 64-битные, а ядро ​​только 32.

Но тебе не о чем беспокоиться.

2 голосов
/ 08 сентября 2008

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

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

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

Но само по себе ядро, вероятно, не будет переключать задачи быстрее и т. Д., Если оно будет 64-разрядным.

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

-Adam

1 голос
/ 17 июня 2009

Файл ELF32 может содержать 64-битные инструкции и работать в 64-битном режиме. Единственное, что у него есть, это то, что организация заголовка и символов в 32-битном формате. Смещение таблицы символов составляет 32 бита. Записи таблицы символов имеют ширину 32 бита и т. Д. Файл, содержащий как 64-битный код, так и 32-битный код, может быть представлен как 32-битный файл ELF, где он использует 64-битные регистраторы для своих внутренних вычислений. mach_kernel - один из таких исполняемых файлов. Преимущество в том, что к нему могут быть привязаны 32-битные ELF-драйверы. Если он позаботится о передаче указателей, расположенных ниже 4 ГБ, в другие связанные двоичные файлы ELF, он будет работать нормально.

0 голосов
/ 08 сентября 2008

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

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