Как стать автором
Обновить

Комментарии 29

Пишите еще! Тема очень интересна и востребована.
Благодарю за такой интересный пост. Пишите ещё. =)
Есть где-нибудь таблица команд процессоров ARM?
Я помню, когда впервые прочитал книгу Зубкова по Ассемблеру (x86), там в конце был алфавитный список команд процессора с кодами, и я решил составить шестнадцатеричную таблицу опкодов — и так обнаружил недокументированный опкод F1, а после уже стал искать в интернете подробную информацию про этот код:)
В убунте тулчейн можно поставить очень и очень просто:

sudo apt-get install g++-arm-linux-gnueabihf

Если поковыряться в пакетах то можно даже найти разные версии GCC.
arm-linux-gnueabi — это для компиляции проектов для ос линукс. Для bare metall нужен arm-none-eabi.

В gentoo все куда проще. Ставится crossdev, он просто настраивает тулчейн, собирая самую последнюю версию. Причем хоть arm, хоть avr, хоть mips.
совсем необязательно. -linux- указывает на наличие libc, но никто не мешает этим компилятором для армов компилировать загрузчик bootstrap (без всего) и ядро линукса (которое тоже с libc не линкуется, как понимаете).
none-eabi идет дефолтно с newlib, которая как бы совсем не libc.
дефолтно он ни с чем не обязан идти, это как соберёшь.
Да ладно. Дефолтно в code sourcery none-eabi идет именно с newlib.

Собрать можно, конечно, как угодно. Только с newlib мне сомнительно, что можно собрать ядро. С glibc, в теории, собрать bare metall embedded проект можно, но он получится слишком распухшим.
У компилятора есть опции «не линковать никакие библиотеки по умолчанию». с ними bare metal и собирают.

newlib/gnu libc/uclibc — это прослойки между ядром и юзерспейсом, обеспечивающие определённый интерфейс. Если нет ни ядра, ни юзерспейса — откуда им взяться в bare metal? Уж от пухлости библиотеки поддержки С никакой загрузчик не вырастет, ему что надо, у него всё внутри есть
>«не линковать никакие библиотеки по умолчанию»
А можно чуть специфичней быть? Их там как минимум три разных опции. Я просто не знаю, на какую из глупостей вынужден отвечать.

>newlib/gnu libc/uclibc — это прослойки между ядром и юзерспейсом, обеспечивающие определённый интерфейс.
Угу. memcpy или функция деления.
Ну например, -nodefaultlibs -nostdlib для начала. -nostartfiles для совсему уж чистоты хочется. Бареметальнее не бывает. Если того требует историческая справедливость, могу вам мейкфайлы загрузчиков разбирать, которые, будучи собраны компилятором со словом -linux- в названии, безупречно работают в отсутствие оного.

Про memcpy уже увы, демагогия. Я не сказал, что libc _только_ сопрягает то, что нужно С с тем, что есть у ядра ОС, но тем не менее в этом его (libc) основная задача.
Пичаль. no-hosted есть только в мане. А та гугловая ссылка, по который Вы зашли его не выдает. Я не сомневаюсь, что Вы активно искали через гугл и понятия не имеете о чем вообще речь — эти три параметра там рядом идут. Но Вы на верном пути, читайте внимательно, даже там все описано очень неплохо. Если хотите исторической справедливости — купите наиболее продаваемый на рынке микроконтроллер — SMT32F1 c 32к флеш. И напишите программу вида: sprintf(s, «Hello, World!»); Попробуйте сделать это с glibc. Удачи, может в 32кб она и влезет.

Демагогия? Нет, Вы просто не знаете из чего состоит стандартная библиотека. Хоть бы википедию открыли, прежде чем глупости писать.

Я так могу очень долго писать. Но Вы ведь понимаете, что с каждым новым ответом выставляете себя еще большим идиотом?
Для особо одарённых.

Загрузчик at91bootstrap:

CCFLAGS=-g -mcpu=arm926ej-s -O2 -Wall -D$(TARGET) -I$(INCL)
ASFLAGS=-g -mcpu=arm926ej-s -c -O2 -Wall -D$(TARGET) -I$(INCL) -DTOP_OF_MEM=$(TOP_OF_MEMORY)

# Linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS+=-nostartfiles -nostdlib -Wl,-Map=$(BOOT_NAME).map,--cref
LDFLAGS+=-T $(BOOTSTRAP_PATH)/elf32-littlearm.lds -Ttext $(LINK_ADDR)

— Лично я здесь вижу -nostartfiles -nostdlib. Для вас это поиск в Гугле, для меня — код из рабочего проекта.

Собирается, работает. С этим проектом я работал. Если в какой-то другой версии GCC (у меня для армов уже много лет 4.4) есть некий no-hosted — увы, это вне моего поля деятельности.

Намекая на то, что все другие ищут в гугле, а только вы являетесь светом знаний в данной области, вы выставляете себя не с самой хорошей стороны.

Контроллеров разнообразных у меня лежит полный шкаф и есть пяток поднятых с нуля версий железок.

snprintf если и будет вообще для данного приложения, то только самостоятельно написанный. Объём, соответственно, будет зависеть от глубины детальности написанного. Можно утащить попроще, можно посложнее.

У меня как-то в голове не укладывается использование GNU Libc без ОС вообще. Может, я не такую кашу какую-то ем? libc.so.6 для STM без операционок бывает? со всеми pthread, nss, так что ли?
Я ведь предупреждал.

>libc.so.6 для STM без операционок бывает?

Господи, да Вы даже не имеете представления о динамической и статической линковке библиотек.
Отлично, статически слинкованная gnu libc реализует вызов open.

Который syscall с небольшой библиотечной обвязкой. Который исполняется ядром.

Кому управление «статически слинкованная» libc передавать будет?

System calls are generally not invoked directly, but rather via wrapper functions in glibc (or perhaps some other library). For details of direct invocation of a system call, see intro(2). Often, but not always, the name of the wrapper function is the same as the name of the system call that it invokes. For example, glibc contains a function truncate() which invokes the underlying «truncate» system call.
savok.name/uploads/bukvar/1.jpg

Наконец-то. Это вторая причина по которой необходимо использовать newlib вместо glibc. И именно поэтому же необходим отдельный тулчейн: в лучшем случае проект попросту не соберется, в худшем вызовется stub. Но не undefined behaviour, как при использовании glibc.
мне к сожалению совершенно неясно, чем использование одной библиотеки CRT вместо другой помогает в отсутствие ядра линукса (а мы вроде именно эту проблему здесь обсуждаем).

Если его (ядра ОС) нет, не надо жаловаться на библиотеку, что она от грабль не спасла. Не будет и не должна работать хоть с какой линковкой.

Или мы какой-то другой use case здесь рассматриваем? В чём вообще вопрос? Мой bare-metal собирается arm-(название конторы)-linux-gnueabi-* и не испытывает никаких проблем (в том числе ограничение на размер загрузчика в 4 килобайта для at91sam9260). Это я и попытался раскрыть в этом треде.

Если вы считаете, что мы обсуждаем нечто другое, уточните пожалуйста.
при этом, само собой есть такие реализации libc, которым и на ядро всё равно, но функционал у них конечно же ограничен. Такие гадости несутся подарками во всяких SDK.
и да, конечно же, snprintfу и всему его семейству ядро линукса не помогает. Только это не всё, что должна уметь libc
я последний аргумент вспомнил. Без хидеров линукса gnu libc даже не соберётся, т.к. из него берёт всё платформозависимое. Осталось выяснить, как можно собрать под ядро, а запускать без ядра :-D
А как собиралась glibc до первого релиза линукса? :)
Под хидеры UNIX- (и не только) ядер тех платформ, под которые она тогда была :-)
Если нужен именно ассемблер, то GCC — далеко не лучший выбор. Процесс сборки сильно переусложнён, требуется куча шаманства на всех стадиях, а ключи вообще приходится брутфорсить, т.к. с логикой там всегда было туго.
Гораздо лучше воспользоваться чисто ассемблерными пакетами вроде FASM for ARM.
А можно поподробнее про проблемы с GCC? Я вот писал на ассемблере для Cortex-M3 (STM32), но никаких особых сложностей не было. Почитал доки, пощупал чужие примеры в интернете — стандартная процедура при изучении чего-то нового.

Ах да, GCC имеет смысл использовать хотя бы потому, что это стандарт де-факто для разработки низкоуровневого софта, в отличие от сторонних продуктов. Как минимум, проще будет использовать асму в связке с C и C++.
Не шаманства, а просто умения читать документацию.

Вы это Торвальдсу отпишите, а то он не в курсе.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории