64-битное ядро, но все 32-разрядные исполняемые процессы ELF, как это?

Выход из uname :

 root@debian:~ # uname -a Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux 

Однако исполняемый файл /sbin/init отображается как 32-разрядный:

 root@debian:~ # file /sbin/init /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 

Другие аспекты системы, похоже, тоже противоречат:

 root@debian:~ # echo $HOSTTYPE i486 root@debian:~ # getconf LONG_BIT 32 

  • Измените цвет вывода tcsh для любой команды
  • Как использовать цветной вывод в команде tmux run-shell?
  • dircolors on zsh: непризнанные ключевые слова: MULTIHARDLINK, RESET & CAPABILITY
  • Сортировка строк с помощью escape-кодов ANSI
  • Какие методы я могу использовать для создания красочных сообщений MOTD при входе в систему?
  • Строковые артефакты из истории в командной строке
  • Цветной текст, созданный с помощью PS1, и цветной вывод из команд путают друг друга
  • Как я могу просто настроить температуру монитора в X?
  • 2 Solutions collect form web for “64-битное ядро, но все 32-разрядные исполняемые процессы ELF, как это?”

    64-битное ядро ​​может быть установлено на Debian 32bit. Вы можете видеть, что ядро ​​amd64 доступно для 32-битного Debian на странице пакета . Это можно использовать в качестве альтернативы использованию ядра с поддержкой PAE для поддержки более 4 ГБ общей оперативной памяти. Обратите внимание, что 32-битные двоичные файлы по-прежнему не могут получить доступ к более чем примерно 3 ГБ оперативной памяти за процесс.

    Все процессоры, которые поддерживают набор инструкций x64 (также известный как x86_64 или amd64), также поддерживают набор инструкций x86 (также известный как i386 или i686, которые строго соответствуют конкретным версиям x86). То же самое относится к ARM A64 (новый 64-битный набор команд, появляющийся в ARMv8) и A32 (имя для 32-разрядного набора команд «классический») для SPARC64 и SPARC , и я считаю, что для MIPS64 и MIPS . Таким образом, во всех этих семействах архитектуры, если процессор может выполнять 64-битный код, он также может запускать 32-разрядный код.

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

    Это выбор дизайна в Linux, вызванный желанием запуска существующих 32-битных двоичных файлов в 64-разрядных установках. Другие варианты Unix сделали разные варианты: Solaris может запускать 64-битные программы на 32-битном ядре, а также наоборот, в то время как OpenBSD не может запускать 32-разрядные программы на 64-битном ядре.

    Вы можете получить информацию о процессоре в /proc/cpuinfo . Если ваш x86-процессор имеет флаг lm , это 64-разрядный процессор.

    По умолчанию uname -m или arch показывает архитектуру, для которой было скомпилировано ядро. Linux может установить «личность» системного вызова процесса (с personality ). Вы можете запустить подпроцесс в другой личности с setarch команды setarch ; setarch i686 someprogram или linux32 someprogram запускает указанную программу в среде, где uname -m возвращает i686 то время как setarch amd64 someprogram или linux64 someprogram запускает указанную программу в среде, где uname -m возвращает amd64 .

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

    $HOSTYPE – переменная bash и сообщает вам, для какой архитектуры была скомпилирована программа bash .

    getconf LONG_BIT позволяет узнать, установлен ли компилятор C по умолчанию для компиляции 32-разрядных или 64-разрядных программ. Более точный тест состоит в том, чтобы скомпилировать a и запустить программу, которая печатает sizeof(void*) или sizeof(size_t) – вызов getconf может дать только информацию о том, что getconf считает компилятором по умолчанию.

    Linux и Unix - лучшая ОС в мире.