Советы для амбициозного студента по созданию собственного ядра [закрыто]

18

Я очень амбициозный студент университета, который хочет выучить почти все, что нужно знать о компьютерах (если хочешь, я люблю учиться). Недавно я подумал, что это будет забавный проект (хотя и длительный) для разработки и сборки моего собственного ядра.

Я получил некоторую основную информацию, и я понял, что мне нужно освоить ассемблер и C / C ++, чтобы действительно сделать эту работу. Пока я работаю над этим, я хотел бы узнать, КАК ядро ​​действительно работает с точки зрения программирования. Я потратил часы на просмотр кода ядра Linux, но это может занять только так далеко.

Каковы основные этапы сборки ядра? Вещи, которые вы должны решить? Заказывать или делать вещи? Я знаю, что много откусываю, но я достаточно полон решимости справиться с этим.

n0pe
источник
12
Не нужно ругать вас за то, что вы хотите узнать все. Но если вы планируете на самом деле пытаться, вам лучше продлить срок жизни, сверхчеловеческий мозг и никаких других планов для вашей жизни;)
2
Я ожидаю иметь все это! Хотя, на самом деле, у меня просто непреодолимое желание учиться.
11:30
@delnan Возможная параноидальная шизофрения тоже является плюсом: templeos.org
DanteTheEgregore
@DanteTheEgregore Что за?
Panzercrisis

Ответы:

34

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

Если вы не настроены на то, чтобы он был похож на UNIX, у вас возникнет еще больше вопросов: должны ли процессы образовывать дерево или они «плоские»? Какие виды межпроцессного взаимодействия вы хотите поддерживать? Вы хотите, чтобы он был многопользовательским, или просто многозадачным (или, возможно, однозадачным)? Вы хотите, чтобы это была система реального времени? Какую степень изоляции вы хотите обеспечить между задачами? Где вы хотите, чтобы он падал в масштабе монолитного или микроядерного? В какой степени (если есть) вы хотите, чтобы он поддерживал распределенную работу?

Я бы вообще советовал против изучения ядра Linux для вашего вдохновения. Это не против самого ядра Linux, но простой факт, что Linux предназначен в первую очередь для производственного использования, а не для обучения. Он имеет множество оптимизаций, хаков обратной совместимости и т. Д., Которые чрезвычайно полезны для производства, но скорее отвлекают, чем обучают.

Если вам удастся найти его, копия книги Льва ( «Комментарии Льва о 6-й редакции UNIX , с исходным кодом » Джона Лайонса) будет гораздо более простой отправной точкой. 6-е издание UNIX было все еще небольшим и достаточно простым, чтобы читать и понимать довольно быстро, не будучи слишком упрощенной игрушечной системой.

Если вы планируете нацеливаться на x86 (по крайней мере, в первую очередь), вы также можете взглянуть на MMURTL V 1.0 от Richard Burgess. Это представляет собой систему для x86, которая использует аппаратное обеспечение x86 гораздо больше, чем изначально предполагали разработчики ЦП, - что большинство реальных систем избегает переносимости на другие ЦП. Как вы можете догадаться, это имеет тенденцию быть гораздо более ориентированным на аппаратное обеспечение. Печатные копии кажутся дорогими и трудно найти, но вы можете скачать текст и код бесплатно.

К счастью, есть еще немало возможностей - например , Эндрю Таненбаум и Альберт Вудхалл: разработка и внедрение операционной системы .

Джерри Гроб
источник
Вау, спасибо за хороший ответ. Я посмотрю все эти книги.
n0pe
7
Я добавил ссылки на PDF-файлы книги и источника. Удивительная особенность исходного кода UNIX v6 заключается в том, что его длина составляет 100 страниц, по 100 строк на страницу. И в 10000 строк кода у вас есть полная, многозадачная операционная система . Если вы действительно можете понять код, окружающий знаменитый комментарий в строке 2238: «От вас этого не ожидают», вы можете дать себе Золотую Звезду и Почетного Мастера. Наслаждайтесь!
Питер Роуэлл
Спасибо за ссылки! Теперь я должен выяснить, где это напечатать ....
n0pe
1
Minix (книга Tannenbaum) предназначена для образования и может быть именно тем, что нужно здесь.
@PeterRowell, dmr заявил, что это ошибка в cm.bell-labs.com/who/dmr/odd.html
12

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

Это будет иметь несколько преимуществ:

  1. В конечном итоге вам понадобится процесс начальной загрузки для вашего ядра, так что это не будет бессмысленным упражнением.
  2. Это даст вам практику в письменной форме в сборке.
  3. Это поможет вам в написании низкоуровневых процедур ввода-вывода. Как вы пишете сообщение на экран или читаете нажатие клавиши, когда нет операционной системы, к которой вы можете обратиться?
  4. Это даст вам опыт в изучении технических деталей процессора и материнской платы. (Первый вопрос: как ваша материнская плата / процессор находит загрузочную программу при запуске?)
  5. Написание ядер стало очень сложной задачей, с кучей тонкостей. Это задание даст вам кое-что для начала и, возможно, не даст вам заблудиться в сорняках еще до того, как вы начнете.

Как только вы это сделаете, у вас будет гораздо лучшее представление о том, во что вы ввязываетесь.

Чарльз Э. Грант
источник
Спасибо за это, я думаю, что это именно то, что я собираюсь попробовать. Больше читать в моем будущем.
n0pe
7

Изучение, как программировать на ассемблере, является хорошим первым началом, и выполнение этого из MSDOS 6.0 также может быть полезным из-за отсутствия встроенных функций.

Чтение хорошей книги, такой как «Концепции операционной системы», станет хорошим началом для разработки вашего собственного ядра. Вам нужно будет выполнить загрузку, управление драйвером устройства, взаимодействие с BIOS, создание и управление файловой системой, планирование программ, загрузку и выгрузку программ, реализовать по крайней мере какую-то оболочку (намного проще, чем создание системы управления окнами).

C / C ++ будет работать только в том случае, если ваше ядро ​​совместимо со стандартными библиотеками для этих языков, в противном случае вам также потребуется написать копию этих библиотек.

Это даже не начинает думать о многопоточности, безопасности системы, сети.

Питер Смит
источник
7

Minix - хороший клон Unix (который вдохновил Linux), который был написан для обучения.

Эндрю С. Танненбаум - превосходный писатель и учитель, он написал целую книгу об операционных системах, используя Minix в качестве примера (и включает в себя исходный код для подражания): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation

Лично я считаю, что он несколько лучше, чем программист, поэтому некоторые вещи не так ясны, как хотелось бы лично, но - эй - это работает!

Я настоятельно рекомендую рассмотреть это как учебный ресурс. Это также даст вам представление о количестве работы, необходимой для создания чего-то, что действительно может быть полезным.


источник
Я бы порекомендовал получить физическую книгу. Проще делать заметки.
На самом деле, если подумать, я думаю, что я видел книгу на Амазоне для дешевых. Я мог бы получить это там. Спасибо
n0pe
Также обратите внимание, что это третье издание. Я считаю, что мы использовали первое издание еще тогда, когда у меня был курс.