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

StackOverflow https://stackoverflow.com/questions/49934

  •  09-06-2019
  •  | 
  •  

Вопрос

В моей операционной системе 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
Это было полезно?

Решение

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

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

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

Другие советы

Двоичный файл запускается не ядром.Это процессор.

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

Но это не то, о чем вам стоило бы беспокоиться.

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

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

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

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

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

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

-Адам

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top