Я уже нашел учебники по выпечке пи , но они используют только ассемблер . Я прошел первые уроки, но мне уже интересно, как использовать C вместо этого. Я имею в виду, что есть причина, по которой они изобрели языки более высокого уровня. Я попытался просто скомпилировать код C в .o
файл object ( ), компилируя
.section .init
.globl _start
_start:
bl main
loop$:
b loop$
к другому объектному файлу и связывая их вместе и таким образом получая kernel.img
. Затем я заменил уже существующее ядро своим собственным, но оно не выполняет код Си. Код C, который я написал, должен просто включить светодиод OK и затем вернуться (затем приходит loop$: b loop$
). Но светодиод OK несколько раз мигает случайным образом, а затем просто гаснет. Вот мой код C:
int main(int argc, char ** argv) {
volatile unsigned *gpioAddr = (volatile unsigned *)0x20200000;
*(gpioAddr + 4) = 1 << 18;
*(gpioAddr + 40) = 1 << 16;
return 0;
}
Как использовать C для разработки операционной системы на Raspberry Pi?
Я сомневаюсь, что это ошибка в коде (хотя я просто любитель). Я знаю, что настройка C может быть сложной, но я не первый, кто делает это. AFAIK, все доминирующие в настоящее время ОС написаны в основном на C, поэтому должна быть статья, объясняющая процесс. Я был бы очень счастлив со списком шагов, так что я могу поискать эти шаги в Google и, возможно, задать вопрос чуть менее широкий.
Примечание: эквивалент сборки кода ARM вышеупомянутого кода C работает просто отлично. Включается светодиод (после небольшого мигания). Я думаю (надеюсь), что означает, что мой Raspberry Pi в порядке.
источник
Ответы:
Я написал очень простое ядро несколько лет назад и запустил его на 386. Я не занимался программированием на голое железо годами, но в общих чертах вам нужно написать некоторый ассемблерный код, который будет:
Настроить стек очень просто - найдите некоторую память, которая не используется, и загрузите тот адрес, на который когда-либо был зарегистрирован регистр, в качестве указателя стека.
В вашем C-коде вам нужно инициализировать структуры данных ОС, такие как пулы памяти и таблицы потоков. Вы не сможете использовать функции библиотеки C - вам придется написать этот материал самостоятельно.
Если вы хотите написать простую многозадачную операционную систему, вам нужно написать несколько процедур на ассемблере для сохранения регистров ЦП в стеке и загрузки другого набора значений регистров из стека другого потока. И вам нужно написать API для создания разных потоков.
источник
Я не посмотрел ваш код подробно, но мне кажется, вы на правильном пути. Убедись, что:
_start
символ действительно используется при компиляции и компоновке вашего сборочного файла и вашего C-файла (иmain()
вместо этого он не используется)main()
необходимо использовать соглашение о вызовах C:return
оператором в C)int main() { ... }
objdump -S main.o
) и посмотрите, как она манипулирует стеком.loop$
.OSDev вики будет очень полезным Ressource - это в основном связано с развитием x86 , но большая часть информации по - прежнему применимы к Raspberry Pi.
Еще несколько специфических ресурсов для raspberry-pi osdev:
kernel.img
начнете.kernel.img
будет выполнен.источник
Основная проблема, с которой вы можете столкнуться - это библиотеки C и код пролога. Он запускается до того, как ваш собственный код начинает выполняться и настраивает стек, кучу и делает много других полезных вещей. Однако, когда вы пытаетесь программировать на голое железо, у вас нет операционной системы, работающей под вами, и вам лучше избегать вызова этих функций. Для этого вам нужны модифицированные версии библиотек C и / или некоторые глобальные символы, определенные или замененные вашими собственными. Этот процесс немного сложен, поэтому люди «Выпечки Пи» решили использовать ассемблер в своих уроках.
источник
Попробуйте это вместо этого:
http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/
Кроме того, опыт x86 немного отличается. Это может быть применимо к обычному программированию ОС на ARM. Но для Пи, извините, сначала запускается gpu, и он настраивается немного раньше кода вашей ОС (?).
источник
s-matyukevich/raspberry-pi-os
https://github.com/s-matyukevich/raspberry-pi-os
Этот удивительный репозиторий выполняет как начальную загрузку C, так и довольно сложные темы.
Кроме того, он рассматривает, как работает ядро Linux, и комментирует код ядра Linux.
Посмотрите первый урок для минималистичной установки: https://github.com/s-matyukevich/raspberry-pi-os/tree/43f682d406c8fc08736ca3edd08a1c8e477c72b0/src/lesson01/src
Я очень рекомендую это.
источник