Напишіть ОС для Raspberry Pi на C


19

Підручники Baking Pi я вже знайшов , але вони використовують лише мову монтажу . Я дотримувався перших уроків, але мені вже цікаво, як використовувати 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, усі домінуючі в даний час ОС написані в основному на С, тому має бути стаття, що пояснює процес. Я був би дуже задоволений переліком кроків, тому я можу погуглювати ці кроки і, можливо, задати питання трохи менш широким.

Примітка: еквівалент складання ARM вищевказаного коду С працює просто чудово. Вмикається світлодіод (після трохи блимає). Я думаю (сподіваюся), що вказує на моє Raspberry Pi, це добре.


C був розроблений як портативна мова складання для Unix. Linux написаний на мові С, ви можете заощадити зовсім небагато часу, подивившись, як це робиться.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen Я думаю, що мені не до читання джерела Linux. Linux набагато складніший за те, що я хочу знати, тим самим затушовуючи цікаві для мене частини.
11684,

1
Гм, "підключіть" кілька світлодіодів.
11684,

1
Дякую, але я хочу зробити більшість справ сам. Це навчальний проект.
11684,

1
Потрібно визнати, що ніколи раніше не бачив питання, як написати ОС. І є кілька цікавих відповідей. Це просто божевільно ...
Пьотр Кула

Відповіді:


14

Я написав дуже просте ядро ​​років тому і запустив його на 386. Я не займався програмуванням голого металу в роки, але в широкому розумінні вам потрібно написати код асемблера, який буде:

  • вимкнути переривання під час завантаження
  • якщо у Pi є контролер пам'яті, вам потрібно буде це налаштувати
  • встановити галочку таймера
  • налаштувати контролер переривання
  • встановіть стек, щоб ви могли виконати код C

Налаштування стека просте - знайдіть деяку пам'ять, яка не використовується, і завантажте таку адресу, в яку коли-небудь реєструєтесь, використовуйте як покажчик стека.

У своєму C-коді потрібно запустити структури даних ОС, такі як пули пам'яті та таблиці потоків. Ви не зможете використовувати функції бібліотеки С - вам потрібно буде написати цей матеріал самостійно.

Якщо ви хочете написати простий багатозадачний ОС, вам потрібно буде написати деякі підпрограми асемблера, щоб зберегти регістри процесора на стеці та завантажити інший набір значень регістра з іншого стека потоку. І вам потрібно буде написати API, щоб створити різні потоки.


1
Важко вибрати між цією відповіддю та Жоржем Дупероном. Я прийняв цю і дав другій нагороду.
11684

13

Я не переглянув ваш код глибоко, але мені здається, ви на правильному шляху. Переконайтесь, що:

  • _startСимвол дійсно один використовується при компіляції і зв'язування файлу збірки і файл C (і що main()не використовується замість цього)
  • Під час дзвінка main()потрібно використовувати умову C виклику:
    • натисніть на стек адресу інструкції після вашого дзвінка (зворотна адреса, яка буде використовуватися у returnвиписці на С)
    • висунути аргументи для функції. У вашому випадку ви можете натиснути два 32-бітні значення (загалом 8 байт), але щоб зробити простішими, ви також можете видалити аргументи і просто матиint main() { ... }
    • можливо, зарезервуйте трохи місця в стеці для повернення значення
    • Я не можу пригадати, в якому порядку слід висунути ці речі
    • Щоб знати, що саме очікує функція C, розберіть її ( objdump -S main.o) і подивіться, як вона маніпулює стеком.
  • Якщо ви не дотримуєтесь конвенції про виклики, то код складання, сформований компілятором C, може змінити адресу повернення на стеці, і у вашому випадку ви навіть не натисніть зворотну адресу, тому інструкція повернення кудись перескочить випадково, а не йти loop$.

OSDev вікі буде дуже корисним Ressource - це в основному пов'язано з розвитком x86 , але більша частина інформації по - , як і раніше застосовні до Raspberry Pi.

Ще кілька специфічних ресурсів малинового пі-осьдеву:


Важко вибрати між цією відповіддю та Стівом. Я дав вам заяву і прийняв інший. Я шкодую про різницю в 5 повторень.
11684

OSDev вики добре - і навіть має деякі специфічні RasPi речі
Уоллі

2

Основна проблема, з якою ви можете зіткнутися, - це бібліотеки С та пролог-код. Він запускається до того, як ваш власний код почне виконувати та встановлювати стек, купу та робити багато інших корисних речей. Однак, коли ви намагаєтесь програмувати на голий метал, у вас не працює жодна ОС під вами, і вам краще уникати виклику цих функцій. Для цього вам потрібні модифіковані версії бібліотек C та / або деякі глобальні символи, визначені або замінені на власні. Цей процес трохи пов'язаний, тому люди «Випікання Пі» вирішили використовувати збірку для своїх навчальних посібників.


Дякую, що відповіли на моє запитання (і вибачте, що відповіли так пізно). Але (сюрприз!) Я купив своє пі, щоб дізнатися про саме це, біт, що включає процеси низького рівня (я б краще не робив цього на дорогому робочому столі з ризиком знищити особисті файли / пошту / фотографії). Не могли б ви додати, як я налаштував стек, або статтю / підручник / якийсь ресурс, що пояснює це? (І що ще мені знадобиться для запуску C).
11684,

2

Спробуйте це замість цього:

http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/

Також досвід x86 дещо інший. Це може бути застосовано до загальних програм програмування AR з голими металами ARM. Але для Pi, вибачте, що це перший запуск gpu і встановити трохи раніше, ніж ваш код ОС (?).


1
Трохи детальніше було б чудово, що станеться, якщо посилання у вашій відповіді розірветься?
Дарт Вейдер

Це все ще є, але я думаю, що для тих, хто приїжджає сюди, може google "арматура голий метал" і краще спробувати серію OSDEV (щоб пройти повз хрест-дев один, як я боровся, читайте форум; я розміщую один ви можете спробувати google "OSDEV форум шестимісячний крос ")
Dennis Ng

Я знаю, що це стара відповідь на ще більш старе питання, але сторінка є на web.archive.org у випадку, якщо вона знизиться.
анонімний

1

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

Дуже рекомендую.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.