- GNU/Linux: AMD64 или i386 — что выбрать?
- В чём преимущества архитектуры AMD64 над i386?
- Ожидать ли прироста производительности от перехода на AMD64?
- Какие ещё плюсы есть у AMD64?
- Каких проблем можно ожидать при использовании 64-битного дистрибутива?
- Какие проблемы были раньше, но уже решены?
- I386 linux gnu что это
- 2.1.1. Поддерживаемые архитектуры
- 2.1.2. Поддерживаемые процессоры, материнские платы и видеокарты
- 2.1.2.1. Центральный процессор
- Примечание
- 2.1.2.2. Шина ввода-вывода (I/O)
- 2.1.3. Ноутбуки
- 2.1.4. Несколько процессоров
- 2.1.5. Поддержка видеокарт
- 2.1.6. Аппаратура для подключения к сети
- 2.1.6.1. Карты для беспроводных сетей
- 2.1.7. Дисплеи Брайля
- 2.1.8. Устройства речевого синтеза
- 2.1.9. Периферия и другое оборудование
- Что такое вызывающие соглашения для системных вызовов UNIX и Linux на i386 и x86-64
- ОТВЕТЫ
- Ответ 1
- Интерфейс ядра
- Соглашение о системных вызовах Linux x86-64:
- Пользовательский интерфейс: вызов функции
- x86-64 System V user-space Соглашение о вызове функций:
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
GNU/Linux: AMD64 или i386 — что выбрать?
Впервые опубликовано 2008-01-12.
Если в вашем компьютере установлен современный процессор от AMD или Intel 1) , вероятнее всего он является 64-битным, т.е. поддерживает обе эти архитектуры.
В выборе, какую из версий дистрибутива GNU/Linux устанавливать — под AMD64 (64-битную) или под i386 (32-битную), однозначно рекомендую предпочесть первый вариант.
В чём преимущества архитектуры AMD64 над i386?
Основные особенности архитектуры, имеющие значение даже для тех, кому не нужны преимущества в управлении большими объёмами ОЗУ, состоят в следующем:
Ожидать ли прироста производительности от перехода на AMD64?
Да. Дело в том, что современные компиляторы с C/C++ и других высокоуровневых языков обладают достаточным “интеллектом”, чтобы путём простой перекомпиляции под новую архитектуру, ускорить даже не оптимизированные специально под неё программы. Прежде всего – задействованием дополнительных регистров общего назначения, а также использованием инструкций SSE и SSE2 там, где раньше приходилось прибегать к более медленным инструкциям математического сопроцессора (FPU).
В результате всего этого, после простой перекомпиляции под AMD64, программы начинают работать от 20 до 100% быстрее, даже без каких-либо изменений в исходном коде. Подробности представлены в этом тестировании (другие форматы: ODT, PDF) 2) .
Кроме того, в конце 2009-го года Phoronix провёл собственное сравнение производительности 32- и 64-битного ПО, подтвердив вышеприведённые результаты, а в следующем сравнении от апреля-2011 преимущество 64-битного ПО был не просто подтверждёно ещё раз и во множестве тестов, но также высказано недоумение, почему некоторые дистрибутивы GNU/Linux до сих пор предлагают устаревшую 32-битную версию в качестве основной.
На замену полностью 64-битной amd64 в 2012-м году была предложена смешанная архитектура x32, однако было продемонстрировано, что она не имеет заметных преимуществ над полной 64-битностью, поэтому amd64 по-прежнему остаётся предпочтительным выбором.
Какие ещё плюсы есть у AMD64?
Поскольку 64-битная арифметика на 64-битной архитектуре выполняется гораздо быстрее, чем на 32-битной, некоторые программы могут под AMD64 задействовать её там, где под i386 не использовали, т.к. было слишком медленно.
К примеру, счётчик переданных и полученных данных в сетевом коде ядра Linux на 32-битных архитектурах является 32-битным числом, и соответственно, обнуляется каждые 4 гигабайта. Именно поэтому, на 32-битных архитектурах невозможно увидеть более 4 ГБ в строчке “RX bytes/TX bytes” вывода команды ifconfig . Как пишут в одном списке рассылки,
На 64-битной же архитектуре, с этим нет никаких проблем:
Каких проблем можно ожидать при использовании 64-битного дистрибутива?
Какие проблемы были раньше, но уже решены?
Здесь в качестве примера приводится дистрибутив Debian Lenny для amd64.
Источник
I386 linux gnu что это
Для Debian не требуется от оборудования сверх того, что требуют ядро Linux или kFreeBSD и утилиты GNU. Таким образом, любая архитектура или платформа, на которую были перенесены ядро Linux или kFreeBSD, libc, gcc и т.д. и на которую перенесён Debian, может работать под Debian. Сверьтесь со страницами переносов http://www.debian.org/ports/i386/, какие системы на архитектуре 32-bit PC были протестированы с Debian GNU/Linux.
Вместо того, чтобы пытаться описать всё разнообразие аппаратных конфигураций, которое существует на 32-bit PC , эта глава содержит общую информацию и указания, где можно найти дополнительную информацию.
2.1.1. Поддерживаемые архитектуры
Debian GNU/Linux 7.0 поддерживает одиннадцать основных архитектур и несколько вариаций каждой архитектуры, известных как « варианты (flavors) » .
Архитектура | Обозначение в Debian | Субархитектура | Вариант |
---|---|---|---|
основанные на Intel x86 | i386 | ||
AMD64 & Intel 64 | amd64 | ||
ARM | armel | Intel IOP32x | iop32x |
Intel IXP4xx | ixp4xx | ||
Marvell Kirkwood | kirkwood | ||
Marvell Orion | orion5x | ||
Versatile | versatile | ||
ARM с аппаратным FPU | armhf | Freescale | mx5 |
Intel IA-64 | ia64 | ||
MIPS (с прямым порядком байтов) | mips | SGI IP22 (Indy/Indigo 2) | r4k-ip22 |
SGI IP32 (O2) | r5k-ip32 | ||
MIPS Malta (32-битная) | 4kc-malta | ||
MIPS Malta (64-битная) | 5kc-malta | ||
MIPS (с обратным порядком байтов) | mipsel | Cobalt | cobalt |
MIPS Malta (32-битная) | 4kc-malta | ||
MIPS Malta (64-битная) | 5kc-malta | ||
IBM/Motorola PowerPC | powerpc | PowerMac | pmac |
PReP | prep | ||
Sun SPARC | sparc | sun4u | sparc64 |
sun4v | |||
IBM S/390 | s390 | IPL с VM-reader и DASD | generic |
64-битный IBM S/390 | s390x | IPL с VM-reader и DASD | generic |
Debian GNU/kFreeBSD 7.0 поддерживает две архитектуры.
Архитектура | Обозначение в Debian |
---|---|
основанные на Intel x86 | kfreebsd-i386 |
AMD64 & Intel 64 | kfreebsd-amd64 |
Этот документ содержит описание установки на архитектуру 32-bit PC . Если вы ищете информацию по любой другой архитектуре, поддерживаемой Debian, посмотрите на странице переносов Debian.
2.1.2. Поддерживаемые процессоры, материнские платы и видеокарты
Полную информацию о поддерживаемом периферийном оборудовании можно найти в Linux Hardware Compatibility HOWTO. Этот раздел содержит только базовые сведения.
2.1.2.1. Центральный процессор
Поддерживаются почти все x86-совместимые (IA-32) процессоры, используемые в персональных компьютерах, включая все серии Intel «Pentium». Сюда входят 32-битные процессоры AMD и VIA (ранее Cyrix), а также процессоры типа Athlon XP и Intel P4 Xeon.
Однако, Debian GNU/Linux wheezy не работает на процессорах 386 и более ранних. Несмотря на то, что название архитектуры «i386», в Debian Sarge (r3.1) была выключена поддержка для процессоров 80386 (и их клонов) [2] . (Ни одна версия Linux не поддерживала процессор 286 и более ранние в этой серии.) Все процессоры i486 и более поздние поддерживаются [3] .
Примечание
Если в вашей системе установлен 64-битный процессор из семейств AMD64 или Intel 64, то, вероятно, вам лучше использовать программу установки для архитектуры amd64 вместо программы установки для (32-битной) архитектуры i386.
2.1.2.2. Шина ввода-вывода (I/O)
Системная шина — это часть материнской платы, которая позволяет процессору взаимодействовать с периферией, например, с устройствами хранения. Ваш компьютер должен использовать ISA, EISA, PCI, PCIe, PCI-X или VESA Local Bus (VLB, иногда называемая VL шиной). В сущности, все персональные компьютеры, продаваемые в последние годы, имеют одну из них.
2.1.3. Ноутбуки
С технической точки зрения ноутбуки — это обычны ПК, поэтому вся информация о ПК применима и к ноутбукам. Установка на ноутбуки сегодня это обычная установка где всё начинает сразу работать, включая автоматическое засыпание системы при закрытии крышки и специальные кнопки на корпусе ноутбука, например для выключения интерфейса wifi ( « режим самолёта » ). Тем не менее, иногда для некоторых специальных возможностей ноутбуков производители используют специализированное или проприетарное оборудование, которое может не поддерживаться. На странице Linux на ноутбуках можно посмотреть, будет ли работать GNU/Linux на вашем ноутбуке.
2.1.4. Несколько процессоров
На этой архитектуре поддерживается нескольких процессоров — так называемая « симметричная многопроцессорная обработка (symmetric multi-processing) » или SMP. Стандартное ядро Debian 7.0 собрано с поддержкой SMP-alternatives. Это означает, что ядро определит число процессоров (или процессорных ядер) и автоматически выключит SMP в однопроцессорных системах.
Раньше, несколько процессоров имелось только в высокопроизводительных серверных системах, но в настоящее время даже в обычные ПК и ноутбуки встраивают так называемые « многоядерные » процессоры. В них содержится один ЦП с двумя и более вычислительными блоками, называемыми « ядрами » .
Вариант 486 пакетов образа ядра Debian для 32-bit PC собран без поддержки SMP.
2.1.5. Поддержка видеокарт
Поддержка графического интерфейса в Debian полностью зависит от поддержки этого интерфейса системой X.Org X11. Графические карты современных ПК, обычно, работают без дополнительной настройки. Поддержка аппаратного ускорения 3D-графики или проигрывания видео зависит от самой карты, установленной в системе, и, иногда, требует установки дополнительных образов « микропрограмм » (см. Раздел 2.2, «Устройства, которым требуются микропрограммы»). Были единичные сообщения об ошибках по картам о том, что установка дополнительных микропрограмм требовалась даже для поддержки основных графических функций, но это скорее исключение.
Список поддерживаемых графических шин, карт, мониторов и устройств ввода можно найти на http://xorg.freedesktop.org/. Debian 7.0 поставляется с X.Org версии 7.7.
2.1.6. Аппаратура для подключения к сети
Почти любая сетевая плата (NIC), поддерживаемая ядром Linux, должна поддерживаться системой установки; драйверы модулей должны загрузиться автоматически. Это относится к почти всем картам PCI/PCI-Express и PCMCIA/Express Cards на ноутбуках. Также поддерживается много старых карт ISA.
ISDN поддерживается, но не во время установки.
2.1.6.1. Карты для беспроводных сетей
Беспроводные сети, в основном, поддерживаются, как и растёт число поддерживаемых беспроводных адаптеров в официальном ядре Linux, хотя для работы многих из них требуется загрузка микропрограммы.
Если нужна микропрограмма, то программа установки предложит её загрузить. В Раздел 6.4, «Загрузка отсутствующих микропрограмм» есть подробное описание о том, как загрузить микропрограмму во время установки.
Беспроводные адаптеры, не поддерживаемые официальным ядром Linux, обычно, можно заставить работать в Debian GNU/Linux, но это не поддерживается во время установки.
Если есть проблемы с беспроводной сетью и других сетевых устройств нет, которые можно использовать во время установки, то всё ещё возможно установить Debian GNU/Linux с полного образа CD-ROM или DVD. Добавьте параметр для выключения настройки сети и установите только пакеты с CD/DVD. После завершения установки (после перезагрузки) вы сможете установить драйвер и микропрограмму, которые требуются, и настроить сеть вручную.
Иногда, нужный драйвер недоступен в виде пакета Debian. В этом случае вам придётся поискать исходный код в интернете и собрать драйвер самостоятельно. Это не описано в данном руководстве. Если драйвер под Linux недоступен, в последнюю очередь можно использовать пакет ndiswrapper , который позволяет использовать драйвер от Windows.
2.1.7. Дисплеи Брайля
Поддержка дисплеев Брайля обеспечивается программой brltty . С её помощью работает большинство дисплеев, подключаемых к последовательному порту, USB или bluetooth. Список поддерживаемых устройств можно найти на сайте brltty . В Debian GNU/Linux 7.0 включена brltty версии 4.4.
2.1.8. Устройства речевого синтеза
Поддержка устройств речевого синтеза обеспечивается программой speakup . speakup поддерживает только встраиваемые платы и внешние устройства, подключаемые к последовательному порту (USB, PCI или serial-to-USB адаптеры не поддерживаются). Список поддерживаемых устройств можно найти на сайте speakup . В Debian GNU/Linux 7.0 включена speakup версии 3.1.6.
2.1.9. Периферия и другое оборудование
Linux поддерживает много разных устройств, таких как мыши, принтеры, сканеры, PCMCIA и USB устройства. Однако, большинство этих устройств не требуется для установки системы.
Устройства USB, в основном, работают нормально. На некоторых, очень старых ПК, для некоторых USB-клавиатур может потребоваться дополнительная настройка (смотрите Раздел 3.6.3, «Аппаратные проблемы, которых нужно остерегаться»). На современных ПК, клавиатуры и мыши USB работают без специальных настроек.
[2] Мы долго пытались избежать этого, но теперь это стало необходимо из-за серий проблем с компилятором и ядром, начиная с ошибки в C++ ABI, происходящей в GCC. Вы всё ещё можете запустить Debian GNU/Linux на настоящих процессорах 80386, если соберёте ядро самостоятельно и скомпилируете все пакеты из исходных текстов, но как это делать не описано в данном руководстве.
[3] В качестве положительного момента отказа от поддержки старых процессоров стоит отметить, что многие пакеты Debian будут работать немного быстрее на современных компьютерах. Процессор i486, выпущенный в 1989 году, имеет три команды (bswap, cmpxchg и xadd), которых нет в процессоре i386, выпущенном в 1986 году. Прежде, их нелегко было использовать в большинстве пакетов Debian; теперь это возможно.
Источник
Что такое вызывающие соглашения для системных вызовов UNIX и Linux на i386 и x86-64
Следующие ссылки объясняют условные обозначения системных вызовов x86-32 как для UNIX (BSD flavor), так и для Linux:
Но каковы условные обозначения системных вызовов x86-64 как на UNIX, так и на Linux?
ОТВЕТЫ
Ответ 1
Я проверил это с помощью GNU Assembler (gas) в Linux.
Интерфейс ядра
x86-32 aka i386 Linux Соглашение о системных вызовах:
В x86-32 параметры для системного вызова Linux передаются с использованием регистров. %eax для syscall_number. % ebx,% ecx,% edx,% esi,% edi,% ebp используются для передачи 6 параметров системным вызовам.
Возвращаемое значение в %eax . Все остальные регистры (включая EFLAGS) сохраняются через int $0x80 .
Я взял следующий фрагмент из Руководства по сборке Linux, но сомневаюсь в этом. Если кто-то может показать пример, было бы здорово.
Если существует более шести аргументов, %ebx должен содержать область памяти, где хранится список аргументов — но не беспокойтесь об этом, потому что маловероятно, что вы будете использовать системный вызов с более чем шестью аргументами.
Существует более быстрый способ совершать 32-битные системные вызовы: использовать sysenter . Ядро отображает страницу памяти в каждый процесс (vDSO) с пользовательской стороны танца sysenter , который должен взаимодействовать с ядром, чтобы он мог найти адрес возврата. Аргумент для регистрации отображения такой же, как для int $0x80 . Обычно вы должны звонить в vDSO вместо непосредственного использования sysenter . (См . Полное руководство по системным вызовам Linux для получения информации о подключении и вызове в vDSO, а также для получения дополнительной информации о sysenter и обо всем остальном, что касается системных вызовов.)
x86-32 [Free | Open | Net | DragonFly] BSD UNIX Системный вызов UNIX:
Параметры передаются в стек. Перенесите параметры (последний параметр вставлен первым) в стек. Затем добавьте дополнительные 32-битные фиктивные данные (это не фиктивные данные. Для получения дополнительной информации обратитесь к следующей ссылке), а затем дайте инструкцию системного вызова int $0x80
Соглашение о системных вызовах Linux x86-64:
Обратитесь к разделу: «A.2 Соглашения о ядре AMD64 Linux » двоичного интерфейса приложения System V, дополнения к процессору архитектуры AMD64. Последние версии psABI i386 и x86-64 System V можно найти на этой странице в репозитории сопровождающего ABI. (См. Также вики-тег x86 для получения последних ссылок на ABI и многих других полезных материалов о x86 asm.)
Вот фрагмент из этого раздела:
- Приложения уровня пользователя используют в качестве целочисленных регистров для передачи последовательности% rdi,% rsi,% rdx,% rcx,% r8 и% r9. Интерфейс ядра использует% rdi,% rsi,% rdx,% r10,% r8 и% r9.
- Системный вызов выполняется через инструкцию syscall . Это clobbers% rcx и% r11, а также возвращаемое значение% rax, но другие регистры сохраняются.
- Номер системного вызова должен быть передан в регистр% rax.
- Системные вызовы ограничены шестью аргументами, ни один аргумент не передается непосредственно в стек.
- Возвращаясь из системного вызова, регистр% rax содержит результат системного вызова. Значение в диапазоне между -4095 и -1 указывает на ошибку, это -errno .
- Только значения класса INTEGER или класса MEMORY передаются в ядро.
Помните, что это из специфичного для Linux приложения к ABI, и даже для Linux оно информативно, а не нормативно. (Но это на самом деле точно.)
Этот 32-битный int $0x80 ABI можно использовать в 64-битном коде (но настоятельно не рекомендуется). Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде? Он по-прежнему усекает свои входные данные до 32-разрядного, поэтому он не подходит для указателей и имеет нули r8-r11.
Пользовательский интерфейс: вызов функции
Соглашение о вызове функции x86-32:
В x86-32 параметры были переданы в стек. Последний параметр сначала помещался в стек, пока все параметры не были выполнены, а затем была выполнена инструкция call . Это используется для вызова функций библиотеки C (libc) в Linux из сборки.
Современные версии i386 System V ABI (используемые в Linux) требуют 16-байтового выравнивания %esp перед call , как всегда требовалось для x86-64 System V ABI. Вызывающим разрешено допускать, что это происходит, и использовать 16-байтовые загрузки/хранилища SSE, в которых произошел сбой при выравнивании. Но исторически в Linux требовалось только 4-байтовое выравнивание стека, поэтому потребовалась дополнительная работа, чтобы зарезервировать естественно выровненное пространство даже для 8-байтового double или чего-то еще.
Некоторые другие современные 32-разрядные системы все еще не требуют выравнивания стека более 4 байтов.
x86-64 System V user-space Соглашение о вызове функций:
x86-64 System V передает аргументы в регистрах, что является более эффективным, чем соглашение о стеке i386 System V. Это позволяет избежать задержек и дополнительных инструкций по сохранению аргументов в памяти (кеш), а затем снова загружать их в вызываемый объект. Это хорошо работает, потому что доступно больше регистров, и лучше для современных высокопроизводительных ЦП, где важны задержки и неупорядоченное выполнение. (I386 ABI очень старый).
В этом новом механизме: сначала параметры делятся на классы. Класс каждого параметра определяет способ, которым он передается вызываемой функции.
Для получения полной информации обратитесь к разделу «3.2 Последовательность вызова функций» Приложения к архитектуре AMD64 для двоичного интерфейса приложения System V, которое гласит:
После классификации аргументов регистры назначаются (в порядке слева направо) для передачи следующим образом:
- Если класс MEMORY, передайте аргумент в стек.
- Если класс INTEGER, используется следующий доступный регистр последовательности% rdi,% rsi,% rdx,% rcx,% r8 и% r9
Таким образом, %rdi, %rsi, %rdx, %rcx, %r8 and %r9 являются регистрами, используемыми для передачи параметров целочисленного значения/указателя (то есть класса INTEGER) в любую функцию libc из сборки. % rdi используется для первого параметра INTEGER. % rsi для 2-го,% rdx для 3-го и так далее. Затем следует дать инструкцию по call . Стек ( %rsp ) должен быть выровнен по 16B при выполнении call .
Если имеется более 6 параметров INTEGER, 7-й параметр INTEGER и более поздние передаются в стек. (Звонящий звонит, так же, как x86-32.)
Первые 8 аргументов с плавающей запятой передаются в% xmm0-7, а затем в стеке. Не существует сохраняемых при вызове векторных регистров. (Функция с сочетанием FP и целочисленных аргументов может иметь более 8 аргументов в регистре.)
Для функций Variadic (например, printf ) всегда требуется %al = количество аргументов регистра FP.
Существуют правила для того, когда упаковывать структуры в регистры ( rdx:rax по возвращении) и в память. Посмотрите ABI для деталей и проверьте выходные данные компилятора, чтобы убедиться, что ваш код согласен с компиляторами о том, как что-то должно быть передано/возвращено.
Обратите внимание, что соглашение о вызове функций в Windows x64 имеет несколько существенных отличий от x86-64 System V, таких как теневое пространство, которое должно быть зарезервировано вызывающей стороной (вместо красной зоны), и сохраняемый вызов xmm6-xmm15. И совсем другие правила, по которым arg идет в каком регистре.
Ответ 2
Возможно, вы ищете ABI x86_64?
Если это не совсем то, что вам нужно, используйте «x86_64 abi» в предпочитаемой вами поисковой системе, чтобы найти альтернативные ссылки.
Ответ 3
Соглашения о вызовах определяют, как параметры передаются в регистры при вызове или вызове другой программой. И лучший источник этих соглашений — в виде стандартов ABI, определенных для каждого из этих аппаратных средств. Для простоты компиляции тот же ABI также используется программой для пользователей и ядра. Linux/Freebsd поддерживают один и тот же ABI для x86-64 и другой набор для 32-разрядных. Но x86-64 ABI для Windows отличается от Linux/FreeBSD. И, как правило, ABI не отличает системный вызов от обычных «вызовов функций». То есть, здесь приведен конкретный пример соглашений о вызовах x86_64 и он одинаковый как для Linux-пространства Linux, так и для ядра: http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ (обратите внимание на последовательность a, b, c, d, e, f параметров):
Производительность является одной из причин для этих ABI (например, передача параметров через регистры вместо сохранения в пачки памяти)
Для ARM существует несколько ABI:
Для Linux на PowerPC:
А для встроенного есть PPC EABI:
Этот документ является хорошим обзором всех различных соглашений:
Ответ 4
В дополнение к ссылке, которую дает Джонатан Леффлер в своем ответе, также может быть полезен Agner Fog «Соглашения о вызовах» .
Ответ 5
Исходные комментарии ядра Linux 5.0
Я знал, что специфика x86 находится под arch/x86 , и что системные вызовы идут под arch/x86/entry . Итак, быстрый git grep rdi в этом каталоге приводит меня к arch/x86/entry/entry_64.S:
glibc 2.29 Реализация системного вызова Linux x86_64
Теперь позвольте читам взглянуть на основные реализации libc и посмотреть, что они делают.
Что может быть лучше, чем смотреть на glibc, который я использую сейчас, когда пишу этот ответ? 🙂
glibc 2.29 определяет системные sysdeps/unix/sysv/linux/x86_64/sysdep.h x86_64 в sysdeps/unix/sysv/linux/x86_64/sysdep.h и содержит интересный код, например:
который я чувствую, довольно очевиден. Обратите внимание, что, похоже, это было разработано для точного соответствия соглашению о вызовах обычных функций ABI AMD64 в System V: https://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions
Быстрое напоминание о сгустках:
- cc означает флаговые регистры. Но Питер Кордес комментирует, что в этом нет необходимости.
- memory означает, что указатель может быть передан в сборку и использован для доступа к памяти
Для явного минимального запускаемого примера с нуля смотрите этот ответ: Как вызвать системный вызов через sysenter во встроенной сборке?
Сделайте несколько системных вызовов в сборке вручную
Источник