I386 linux gnu что это

Содержание
  1. GNU/Linux: AMD64 или i386 — что выбрать?
  2. В чём преимущества архитектуры AMD64 над i386?
  3. Ожидать ли прироста производительности от перехода на AMD64?
  4. Какие ещё плюсы есть у AMD64?
  5. Каких проблем можно ожидать при использовании 64-битного дистрибутива?
  6. Какие проблемы были раньше, но уже решены?
  7. I386 linux gnu что это
  8. 2.1.1. Поддерживаемые архитектуры
  9. 2.1.2. Поддерживаемые процессоры, материнские платы и видеокарты
  10. 2.1.2.1. Центральный процессор
  11. Примечание
  12. 2.1.2.2. Шина ввода-вывода (I/O)
  13. 2.1.3. Ноутбуки
  14. 2.1.4. Несколько процессоров
  15. 2.1.5. Поддержка видеокарт
  16. 2.1.6. Аппаратура для подключения к сети
  17. 2.1.6.1. Карты для беспроводных сетей
  18. 2.1.7. Дисплеи Брайля
  19. 2.1.8. Устройства речевого синтеза
  20. 2.1.9. Периферия и другое оборудование
  21. Что такое вызывающие соглашения для системных вызовов UNIX и Linux на i386 и x86-64
  22. ОТВЕТЫ
  23. Ответ 1
  24. Интерфейс ядра
  25. Соглашение о системных вызовах Linux x86-64:
  26. Пользовательский интерфейс: вызов функции
  27. x86-64 System V user-space Соглашение о вызове функций:
  28. Ответ 2
  29. Ответ 3
  30. Ответ 4
  31. Ответ 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.)

Вот фрагмент из этого раздела:

  1. Приложения уровня пользователя используют в качестве целочисленных регистров для передачи последовательности% rdi,% rsi,% rdx,% rcx,% r8 и% r9. Интерфейс ядра использует% rdi,% rsi,% rdx,% r10,% r8 и% r9.
  2. Системный вызов выполняется через инструкцию syscall . Это clobbers% rcx и% r11, а также возвращаемое значение% rax, но другие регистры сохраняются.
  3. Номер системного вызова должен быть передан в регистр% rax.
  4. Системные вызовы ограничены шестью аргументами, ни один аргумент не передается непосредственно в стек.
  5. Возвращаясь из системного вызова, регистр% rax содержит результат системного вызова. Значение в диапазоне между -4095 и -1 указывает на ошибку, это -errno .
  6. Только значения класса 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, которое гласит:

После классификации аргументов регистры назначаются (в порядке слева направо) для передачи следующим образом:

  1. Если класс MEMORY, передайте аргумент в стек.
  2. Если класс 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 во встроенной сборке?

Сделайте несколько системных вызовов в сборке вручную

Источник

Читайте также:  Windows games c usb
Оцените статью