Архитектура ядра Darwin и OS X, 64-битные на 32-битном ядре, как это работает? - PullRequest
2 голосов
/ 31 марта 2012

ОС OS X Lion (10.7) работает в основном на 64-битных двоичных файлах, как сообщает Activity Monitor. Учитывая это, а также тот факт, что мой ноутбук работает с 32-битной версией EFI и, следовательно, также с 32-битным ядром, как вообще работает смешивание арок?

Darwin Kernel Version 11.3.0: Thu Jan 12 18:48:32 PST 2012; root:xnu-1699.24.23~1/RELEASE_I386

Обычно на x86_64 запускаются двоичные файлы 32b, но, наоборот, потребуется перевести процессор в режим 64b, что AFAIK не может быть отменено.

Надеюсь, этот вопрос достаточно ясен ..

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

Архитектура x86-64 довольно сложна; он не только имеет 64-битный режим и 32-битный режим, он имеет два основных режима (длительный и устаревший), каждый из которых имеет несколько подрежимов (см. статья Википедии ).

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

В длинном режиме процессор имеет 64-битные возможности, но также может работать в 32- и 16-битных режимах «совместимости». Переключение режимов контролируется флагами L и D в дескрипторе сегмента кода (см. «Расширение x86 для 64-битного мира» в , этот PDF ) - по сути, различные разделы памяти могут быть помечены как содержащий 64-, 32- или 16-битный код, и процессор переключается в соответствующий режим для сегмента кода, который в данный момент выполняется. Сегменты кода ядра могут быть помечены как 64- или 32-битные независимо от сегментов кода для запуска приложений.

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

Кстати, OS X также могла запускать 64-битные процессы под 32-битным ядром на процессорах PowerPC G5, начиная с версии 10.3. Процессоры PPC имеют совершенно другую архитектуру, и я понятия не имею, как там работает переключение режимов.

1 голос
/ 31 марта 2012

EFI и ядро ​​- это две разные вещи ...
Вы можете иметь 32-битный EFI с 64-битным ядром. Не в этом суть ...

Ядро Lions обычно работает в режиме 64 бита по умолчанию, если вы не заставляете его работать в режиме 32 бита.

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

Запуск 64-битного кода в 32-битном режиме невозможен.
Но формат Apple Mach-O решает эту проблему, поскольку вы можете создавать двоичные файлы, которые обеспечивают 32-битный и 64-битный код.

EDIT

Очевидно, что Mac OS X не имеет общего 32/64-битного режима ЦП.
Я действительно не знаю, как это возможно, и как это управляет вещами внутри, с процессором.

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

Попробую поискать дальше ...:)

...