Arhn - архитектура программирования

Как написать кастомное ядро ​​на Mac?

Я следовал "Mike OS Guide", чтобы создать свой собственный ядро, и у меня все заработало. Но затем я просмотрел множество руководств в Интернете по созданию загрузочного сектора в NASM, который загружает main функцию из скомпилированного объекта C. Я пробовал компилировать и связывать со всеми видами установок GCC:

x86_64-pc-linux-
arm-uclinux-elf-
arm-agb-elf-
arm-elf-
arm-apple-darwin10-
powerpc-apple-darwin10-
i686-apple-darwin10-
i586-pc-linux-
i386-elf-

Все они терпят неудачу, как только я помещаю их на дискету, как я делаю с MikeOS bootstrap. Я пробовал различные руководства на http://www.osdever.net/, например здесь, и я пробовал http://wiki.osdev.org/Bare_Bones, но ни один из них не работает при попытке компиляции на Mac, но я не устал от настоящего Linux машины пока нет. Но мне было интересно, как я могу получить начальную загрузку при сборке вызовов функции C и объединить их в рабочий файл ядра, а затем загрузить его на дискету, а затем на ISO, как в учебнике MikeOS. Или мне просто сделать kernel.bin и загрузить syslinux? Может ли кто-нибудь дать мне совет, как заставить все это работать в среде разработки Mac? У меня есть сборы через macports и homebrew, так что это помогает. Кто-нибудь последовательно это делал?

ИЗМЕНИТЬ Вот мой загрузочный сектор.

Я просто хочу знать, как перейти к функции extern из C и связать ее.

14.01.2013

  • Загрузочные секторы начинают выполняться в 16-битном реальном режиме. Все компиляторы C, которые вы пробовали компилировать в 32-битный код. Если вы хотите запустить вывод кода из этих компиляторов, ваш загрузочный сектор сначала должен перейти в 32-битный защищенный режим. Как только вы это сделаете, у вас останется всего 510 байтов минус количество байтов, необходимое для переключения в защищенный режим. Вероятно, вы захотите написать больше кода, чем поместится в этом объеме. 14.01.2013
  • правда, очень верно, что если я поставлю BITS 32 в начале th вместо BITS 16 14.01.2013
  • Затем NASM выведет 32-битный код, который ЦП будет интерпретировать как 16-битный код, что определенно не то, что вам нужно. 14.01.2013
  • Понятно, поэтому операционные системы используют пространство для начальной загрузки, чтобы перейти с 16 бит на 32 или 64, и я не хочу 16-битную ОС, поэтому мне нужно было бы передать загрузочную загрузку на 32-битный код? вместо прямого внешнего вызова? 14.01.2013
  • Нет, большинство операционных систем заполняют загрузочный сектор кодом для загрузки большего загрузчика, а затем этот загрузчик загрузит ядро, переключится в 32-битный режим и перейдет к ядру. 14.01.2013
  • Я надеюсь, вы понимаете, что в вашем текущем коде нет необходимости делать много вызовов print_string. Вы делаете что-то вроде printf("a\n"); printf("b\n");, тогда как можете просто printf("a\nb\n");. 14.01.2013
  • понял, поэтому ваше решение для меня - скомпилировать мой код c в 16 бит или переключиться на более крупный лодочный загрузчик, а затем перейти на 32-битный, где я могу запустить свой 32-битный код, который потребует 16 бит для создания этого второго загрузчика, поэтому я нужен 16-битный gcc 14.01.2013
  • Я бы рекомендовал просто использовать мультизагрузку с GRUB. Он многое сделает за вас. 14.01.2013
  • и о моем коде, я не знаю сборки, я просто знаю, что 0Dh, 0Ah, дайте мне новую строку и, 0 был в источнике, когда я его загрузил, поэтому я не знаю, что мне понадобится для \ n вместо 0Dh, 0Ач, 0 14.01.2013
  • Если вы не разбираетесь в сборке, вам пока не следует пытаться написать собственное ядро. Вам нужно знать сборку, чтобы написать ядро ​​операционной системы, которое делает что-нибудь нетривиальное. 14.01.2013
  • и знаете ли вы какие-нибудь хорошие учебники по написанию собственного ядра с моими инструментами, которые будут работать с grub? 14.01.2013
  • и я знаю c, так что я пытаюсь перейти от сборки к c, чтобы я мог работать над красивым кастомным ядром оттуда, вы понимаете, о чем я? 14.01.2013
  • Даже если вы используете ядро, в основном состоящее из C, вам придется иметь дело со сборкой. Например, вам нужна сборка для загрузки глобальной таблицы дескрипторов. Вам нужно будет написать сборку для обработки прерываний. Вам понадобится сборка для множества вещей, и пытаться обойтись без нее - просто не лучшая идея. 14.01.2013
  • вздох пора выучить новый язык, который в значительной степени имеет дело с байтами и шестнадцатеричными числами, это все базовое :( если бы я мог обойтись с gcc -S 14.01.2013
  • и это то, о чем вы в двух словах говорили wiki.osdev.org/ 14.01.2013
  • Можете ли вы разместить код сборки на pastebin.com или на подобной странице? Спасибо. 14.01.2013
  • я сделал ссылку на него на своем веб-сайте в вопросе, trevorrudolph.com/myfirst.asm 14.01.2013
  • @Jack, вы можете посмотреть мой источник, это просто сборочная часть загрузочного сектора 15.01.2013
  • @icktoofay, можете ли вы ответить, сказав, что нужно использовать 16-битный компилятор и переключиться на 32-битный или 64-битный, и как для выполнения этой задачи требуется хорошее знание сборки, чтобы я мог задать этот вопрос как ответ 15.01.2013

Ответы:


1

С этим есть несколько проблем. Во-первых, все упомянутые вами компиляторы выводят либо 32-битный, либо 64-битный код. Это здорово, но когда загрузочный сектор запускается, он работает в 16-битном реальном режиме. Если вы хотите иметь возможность запускать этот 32-битный или 64-битный код, вам нужно сначала переключиться в соответствующий режим (32-битный защищенный режим, ну, 32-битный и длинный режим для 64-битного ).

Затем, как только вы переключитесь в соответствующий режим, у вас даже не останется так много места для кода: загрузочные секторы имеют размер 512 байт; два байта зарезервированы для загрузочной подписи, и вам понадобится несколько байтов для кода, который переключается в соответствующий режим. Если вы хотите иметь возможность использовать разделы на этом диске или, возможно, файловую систему FAT, уберите еще больше полезных байтов. У вас просто не хватит места для всех, кроме самой банальной программы.

Так как же с этим справляются реальные операционные системы? Реальные операционные системы, как правило, используют загрузочный сектор для загрузки с диска загрузчика большего размера. Затем этот более крупный загрузчик может загрузить фактическое ядро ​​и переключиться в соответствующий режим (хотя это может быть обязанностью загруженного ядра - это зависит).

Написание загрузчика может потребовать много работы, поэтому вместо того, чтобы накатывать свой собственный, вы можете захотеть использовать GRUB и сделать так, чтобы ваше ядро ​​соответствовало стандарту Multiboot. GRUB - это загрузчик, который сможет загрузить ваше ядро ​​с диска (возможно, в формате ELF) и перейти к точке входа в 32-битном защищенном режиме. Полезно, правда?

Это не освобождает вас от изучения сборки, однако: точкой входа ядра должна быть сборка. Часто все, что он делает, - это настраивает небольшой стек и передает соответствующие регистры функции C с правильным соглашением о вызовах.

Вы можете подумать, что можете просто скопировать это, а не писать сами, и будете правы, но на этом все не заканчивается. Также понадобится сборка для (как минимум):

  • Загрузка новой глобальной таблицы дескрипторов.
  • Обработка прерываний.
  • Использование портов ввода-вывода без отображения памяти.

… И так далее, не говоря уже о том, что если вам нужно отлаживать, у вас может не быть хорошего отладчика; вместо этого вам придется смотреть на разборки, значения регистров и дампы памяти. Даже если ваш код скомпилирован из C, вам нужно знать, что делает базовая сборка, иначе вы не сможете отлаживать ее.

Таким образом, ваша основная проблема - незнание сборки. Как уже говорилось, сборка необходима для разработки операционной системы. Если вы досконально изучите сборку, то, возможно, сможете приступить к написанию операционной системы.

15.01.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..