Обеспечивает ли набор инструментов GNU для процессоров Arm поддержку классических процессоров, таких как ARM11?

#gcc #raspberry-pi #arm #gnu-toolchain #raspberry-pi-zero

#gcc #raspberry-pi #arm #gnu-toolchain #raspberry-pi-zero

Вопрос:

Недавно я заинтересовался изучением разработки «голого металла» для процессоров ARM с использованием собственной сборки. Я купил Raspberry Pi Zero, который оснащен процессором ARM11, и в настоящее время ищу набор инструментов для сборки и компоновки моего кода. На этой странице говорится, что набор инструментов GNU для процессоров Arm поддерживает только профили A, R и M, но я наткнулся на этот источник, который указывает, что GCC способен компилировать код для архитектур Arm вплоть до ARMv4 и действительно поддерживает процессор, для которого я хочу скомпилировать (ARM1176JZF-S). Есть ли что-то, чего мне здесь не хватает? Это конфликтующие источники, не так ли? И если набор инструментов GNU фактически не поддерживает процессор ARM11, какие еще варианты у меня есть?

Ответ №1:

Просто попробуйте

 .cpu arm7tdmi
.globl _start
_start:
    bl main
    b .

.globl bounce
bounce:
    bx lr

int bounce ( int x );
int main ( void )
{
    return(bounce(3));
}

arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

arm-none-eabi-as --version
GNU assembler (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-eabi'.

arm-none-eabi-as start.s -o start.o
arm-none-eabi-gcc -O2 -c -march=armv4t so.c -o so.o
arm-none-eabi-ld -Ttext=0x1000 start.o so.o -o so.elf
arm-none-eabi-objdump -d so.elf

Disassembly of section .text:

00001000 <main>:
    1000:   e92d4010    push    {r4, lr}
    1004:   e3a00003    mov r0, #3
    1008:   eb000003    bl  101c <bounce>
    100c:   e8bd4010    pop {r4, lr}
    1010:   e12fff1e    bx  lr

00001014 <_start>:
    1014:   ebfffff9    bl  1000 <main>
    1018:   eafffffe    b   1018 <_start 0x4>

0000101c <bounce>:
    101c:   e12fff1e    bx  lr
  

(нет, это не полноценная функциональная программа, просто демонстрация инструментов)

Помните, что gnu binutils (ассемблер, компоновщик и другие двоичные утилиты) и gnu gcc (компилятор c) — это два отдельных проекта, поэтому ожидается, что они не идеально синхронизированы, один может поддерживать то, чего нет у другого.

Я думаю, что они отказались от поддержки armv2 / 3, который является acorn, фактическим чипом в последних инструментах, возможно, gcc.

 arm-none-eabi-gcc -O2 -c -mcpu=arm2 so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -mcpu target: arm2
arm-none-eabi-gcc: note: valid arguments are: arm8 arm810 strongarm 

strongarm110 fa526 fa626 arm7tdmi arm7tdmi-s arm710t arm720t arm740t arm9 arm9tdmi arm920t arm920 arm922t arm940t ep9312 arm10tdmi arm1020t arm9e arm946e-s arm966e-s arm968e-s arm10e arm1020e arm1022e xscale iwmmxt iwmmxt2 fa606te fa626te fmp626 fa726te arm926ej-s arm1026ej-s arm1136j-s arm1136jf-s arm1176jz-s arm1176jzf-s mpcorenovfp mpcore arm1156t2-s arm1156t2f-s cortex-m1 cortex-m0 cortex-m0plus cortex-m1.small-multiply cortex-m0.small-multiply cortex-m0plus.small-multiply generic-armv7-a cortex-a5 cortex-a7 cortex-a8 cortex-a9 cortex-a12 cortex-a15 cortex-a17 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 cortex-m7 cortex-m4 cortex-m3 marvell-pj4 cortex-a15.cortex-a7 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a53 cortex-a57 cortex-a72 cortex-a73 exynos-m1 xgene1 cortex-a57.cortex-a53 cortex-a72.cortex-a53 cortex-a73.cortex-a35 cortex-a73.cortex-a53 cortex-a55 cortex-a75 cortex-a76 neoverse-n1 cortex-a75.cortex-a55 cortex-a76.cortex-a55 cortex-m23 cortex-m33 cortex-r52; did you mean ‘arm8’?

arm-none-eabi-gcc -O2 -c -march=armv2a so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -march target: armv2a
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8-m.base armv8-m.main armv8-r iwmmxt iwmmxt2; did you mean ‘armv4’?
  

Где более старые версии gcc были в порядке с этим.

 .cpu arm2
.globl _start
_start:
    bl main
    b .
  

Нет предупреждений / ошибок

     100c:   e8bd4010    pop {r4, lr}
    1010:   e12fff1e    bx  lr
  

это означает armv4t против:

 arm-none-eabi-gcc -O2 -c -march=armv5t so.c -o so.o
arm-none-eabi-objdump -D so.o

so.o:     file format elf32-littlearm


Disassembly of section .text.startup:

00000000 <main>:
   0:   e3a00003    mov r0, #3
   4:   eafffffe    b   0 <bounce>
  

хм, они зашли так далеко, что сделали это хвостовой оптимизацией, хорошо.

 int bounce ( int x );
int main ( void )
{
    return(bounce(3) 2);
}
00000000 <main>:
   0:   e92d4010    push    {r4, lr}
   4:   e3a00003    mov r0, #3
   8:   ebfffffe    bl  0 <bounce>
   c:   e2800002    add r0, r0, #2
  10:   e8bd8010    pop {r4, pc}
  

Разница между armv4t и armv5t в том, что вы можете использовать ПК, но вы не можете использовать его для взаимодействия arm / thumb, поэтому компилятор, если возможно, не указано иное, сгенерирует код, совместимый с interwork.

Так что да, даже с gcc 9.3.0 он поддерживается. Я использовал не тот компьютер, я думал, что у меня есть последняя версия на этом компьютере, отредактирую ответ с помощью 10.2.0

Редактировать

Да, я должен просто переписать это, может быть, я так и сделаю…

 arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

arm-none-eabi-as --version
GNU assembler (GNU Binutils) 2.35
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `arm-none-eabi'.


.cpu arm2
.globl _start
_start:
    bl main
    b .

.globl bounce
bounce:
@    bx lr
    mov pc,lr

arm-none-eabi-as start.s -o start.o
arm-none-eabi-objdump -d start.o

start.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:   ebfffffe    bl  0 <main>
   4:   eafffffe    b   4 <_start 0x4>

00000008 <bounce>:
   8:   e1a0f00e    mov pc, lr
  

Или попробуйте оригинальную программу

 arm-none-eabi-as start.s -o start.o
arm-none-eabi-gcc -O2 -c -march=armv4t so.c -o so.o
arm-none-eabi-ld -Ttext=0x1000 start.o so.o -o so.elf
arm-none-eabi-objdump -d so.elf
so.elf:     file format elf32-littlearm


Disassembly of section .text:

00001000 <main>:
    1000:   e92d4010    push    {r4, lr}
    1004:   e3a00003    mov r0, #3
    1008:   eb000003    bl  101c <bounce>
    100c:   e8bd4010    pop {r4, lr}
    1010:   e12fff1e    bx  lr

00001014 <_start>:
    1014:   ebfffff9    bl  1000 <main>
    1018:   eafffffe    b   1018 <_start 0x4>

0000101c <bounce>:
    101c:   e12fff1e    bx  lr
  

итак, 10.2.0 и 2.35 поддерживают это ядро / cpu.

 arm-none-eabi-gcc -O2 -c -march=arm2a so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -march target: arm2a
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8.6-a armv8-m.base armv8-m.main armv8-r armv8.1-m.main iwmmxt iwmmxt2
arm-none-eabi-gcc: error: missing argument to ‘-march=’

arm-none-eabi-gcc -O2 -c -mcpu=arm2 so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -mcpu target: arm2
arm-none-eabi-gcc: note: valid arguments are: arm8 arm810 strongarm strongarm110 fa526 fa626 arm7tdmi arm7tdmi-s arm710t arm720t arm740t arm9 arm9tdmi arm920t arm920 arm922t arm940t ep9312 arm10tdmi arm1020t arm9e arm946e-s arm966e-s arm968e-s arm10e arm1020e arm1022e xscale iwmmxt iwmmxt2 fa606te fa626te fmp626 fa726te arm926ej-s arm1026ej-s arm1136j-s arm1136jf-s arm1176jz-s arm1176jzf-s mpcorenovfp mpcore arm1156t2-s arm1156t2f-s cortex-m1 cortex-m0 cortex-m0plus cortex-m1.small-multiply cortex-m0.small-multiply cortex-m0plus.small-multiply generic-armv7-a cortex-a5 cortex-a7 cortex-a8 cortex-a9 cortex-a12 cortex-a15 cortex-a17 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 cortex-m7 cortex-m4 cortex-m3 marvell-pj4 cortex-a15.cortex-a7 cortex-a17.cortex-a7 cortex-a32 cortex-a35 cortex-a53 cortex-a57 cortex-a72 cortex-a73 exynos-m1 xgene1 cortex-a57.cortex-a53 cortex-a72.cortex-a53 cortex-a73.cortex-a35 cortex-a73.cortex-a53 cortex-a55 cortex-a75 cortex-a76 cortex-a76ae cortex-a77 neoverse-n1 cortex-a75.cortex-a55 cortex-a76.cortex-a55 cortex-m23 cortex-m33 cortex-m35p cortex-m55 cortex-r52; did you mean ‘arm8’?
arm-none-eabi-gcc: error: missing argument to ‘-march=’
  

Там вы можете увидеть версии arm1176jzf-s, одна из которых находится в raspberry pi zero.

arm-none-eabi- vs arm-linux-gnueabi-, arm-whatever-что угодно, если только это не настроено в сборке инструмента, все они будут поддерживать одни и те же цели для одной и той же версии gcc (или binutils).

РЕДАКТИРОВАТЬ ЗАМЕТКУ

 arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

arm-linux-gcc -mno-thumb-interwork -O2 -c -mcpu=arm2 -march=armv2a so.c -o so.o
  

Таким образом, это похоже на то, поддерживает ли gcc armxyz. Arm2 / 3 был недавно удален, но более старые версии поддерживают его (существует по крайней мере одно открытое ядро armv2 / 3, которое, я думаю, не имеет лицензии, поэтому, если вы хотите его использовать, вам понадобятся некоторые инструменты).

Но из приведенной выше демонстрации с текущими инструментами на момент написания этой статьи (10.2.0 и 2.35) armv4 / 4t до настоящего времени (armv7-a / r / m), похоже, поддерживается gcc и binutils.

Итак, поскольку в какой-то момент они очистили arm2 / 3, что, вероятно, было не слишком сложно, существует совпадение между arm2 / 3 и нынешним armv4 — armv7, что касается машинного кода, в arm2 / 3 есть некоторые инструкции, которые не прошли через переход acorn / advanced (чипы на ядра, разные компании), некоторые / многие перекрываются. Как и в случае с перекрытием от armv4 до armv7. Таким образом, технически они могут пожелать, например, удалить поддержку armv4 в какой-то момент, поскольку в нем есть некоторые вещи, как показано выше, которые имеют особый корпус. Но если вы потрудитесь покопаться в исходных текстах, вы обнаружите, что они, похоже, скреплены клейкой лентой и проволокой, поэтому я не могу представить, что возникнет сильное желание войти и вырвать материал, даже если вы просто искали armv4 или armv5 или armv6 или что-то еще, что указывает на переменное имя флага.

Они делали это раньше и могут повторить, поэтому будьте готовы, тестируйте каждую сборку инструментов при переключении на нее или, что еще лучше, будьте явны в своей сборке, чтобы, если / когда инструмент перестанет поддерживать, он не сможет выполнить сборку.

Что вы делаете в этом случае, так это используете более старый. В Debian / Ubuntu / Mint и т. Д

 sudo apt-get -y install gcc-arm-linux-gnueabi binutils-arm-linux-gnueabi
sudo apt-get -y install gcc-5-arm-linux-gnueabi
  

Которые не будут передовыми, они вернутся на несколько основных оборотов назад. Но после gcc 5.x.x произошли явные изменения, которые делают крайне желательным сохранение, оптимизация gcc снизилась, двоичные файлы стали больше и т.д. В более новых версиях Ubuntu и т. Д. Может отсутствовать gcc-5, поэтому вы можете попробовать gcc-7 вместо этого, вы потеряете gcc 5.x.x если вы не сможете создать его самостоятельно, что в конечном итоге устареет, люди gnu не склонны писать чистый код C, который предназначен для компиляции в течение многих лет, поэтому их собственные инструменты не будут создавать свои собственные инструменты через некоторый период времени. Итак, если вы настолько глубоко увязли, вы запускаете более старый Linux на виртуальной машине, и в этом Linux вы берете или создаете более старый набор инструментов (или Windows или что-то еще).

Хотя Raspberry Pi Zero все еще существует, я не вижу, чтобы поддержка armv6 прекратилась в ближайшее время. Это действительно связано с сопровождающими и, возможно, с этими конференциями, которые у них есть. поддержка pdp-11 была ДОБАВЛЕНА не так уж много лет назад и все еще поддерживается (pdp-11 все еще используются сегодня, хотя с ударом по авиационной отрасли от вируса, посмотрим, может быть, есть возможность обновить там). (pdp-11, хороший первый процессор для изучения языка ассемблера, есть хорошие симуляторы, и их легко написать самостоятельно).


Поддерживается ли ARM11 (в Pi Zero) по-прежнему? Да, gcc и binutils по-прежнему поддерживают его.

Что мне делать, если / когда они этого не делают? Используйте более старый набор инструментов или, в худшем случае, запустите более старую операционную систему, которая поддерживает создание / запуск более старого набора инструментов.