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

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

cristi: ~ сказал $ file ./a.out
./a.out: 64-разрядный исполняемый файл Mach-O x86_64
christian: ~ сказал $ file / mach_kernel
/ mach_kernel: универсальный двоичный файл Mach-O с двумя архитектурами
/ mach_kernel (для архитектуры i386): исполняемый файл Mach-O i386
/ mach_kernel (для архитектуры ppc): исполняемый файл Mach-O ppc
christi: ~ сказал $ ./a.out
christi: ~ сказал $ echo $?
1

c,macos,64bit,32-bit,

24

Ответов: 6


43 принят

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

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

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


6

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

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

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


6

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


2

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

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

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

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

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

-Адам


1

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

с, MacOS, 64-битной, 32-бит,
Похожие вопросы
Яндекс.Метрика