Как я могу создать маленькую операционную систему на старом настольном компьютере? [закрытый]

Чередование структур как Устройство Вареного пудинга :

strncpy(to, from, count)
char *to, *from;
int count;
{
    int n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
               } while (--n > 0);
    }
}

110
задан Erty Seidohl 20 April 2018 в 18:09
поделиться

18 ответов

First things first. Read, read, read, read, read. You need to have a firm understanding of how the OS works before you can hope to implement your own.

Grab one of Andrew Tanenbaum's books on operating systems. This is the one we used in my OS class in college:

Modern Operating Systems PDF

Modern Operating Systems on Amazon

Despite the ridiculous cover, it's a fantastic read, especially for a textbook. Tanenbaum is really an expert in this area and his explanations of how the OS works underneath the hood are clear and easy to understand. This book is mostly theory, but I believe he also has a book that discusses more of the implementation. I've never read it, though, so I can't comment on it.

That should help you bone up on process management, memory management, filesystems, and everything else your OS kernel needs to do to get it up to a bootable state. From that point on it's basically a matter of writing device drivers for the hardware you need to support, and offering implementations of the C library functions to make kernel calls for things like opening files and devices, reading and writing, passing messages between processes, etc.

Read up on x86 assembly (assuming you are designing this for an x86 machine). That should answer a lot of your questions with regards to moving between processor operating modes.

If you've got any electronics knowledge, it may be easier to start with writing an operating system for an embedded device that has ample documentation, because it will generally be simpler than an x86 PC. I've always wanted to write my own OS as well, and I'm starting with writing a microkernel embedded OS for This Development Board from Digilent. It can run the soft-core MicroBlaze processor from Xilinx, which has very thorough documentation. It's also got some RAM, flash data storage, LEDs, switches, buttons, VGA output, etc. Plenty of stuff to play around with writing simple drivers for.

One of the benefits of an embedded device is also that you may be able to avoid writing a VGA driver for a long time. In my case, the Digilent development board has an onboard UART, so I can effectively use the serial output as my console to get the whole thing up and booting to a command line with minimal fuss.

Just make sure that whatever you choose to target has a readily available and well-tested compiler for it. You do not want to be writing an OS and a compiler at the same time.

49
ответ дан 24 November 2019 в 03:14
поделиться

Взгляните на Minix . Изучите исходный код вместе с « Проектирование и реализация операционных систем ». Рассмотрите возможность внесения вклада в проект. Я считаю, что Minix - действительно хорошая и многообещающая ОС, которая находится в процессе разработки. Это также хорошо финансируемый проект. Это означает, что вам могут даже заплатить за ваши взносы!

2
ответ дан 24 November 2019 в 03:14
поделиться

Изучите систему A2 (ранее называвшуюся системой Оберона ) на предмет идей, которые вы можете украсть. Это графическая ОС, созданная всего двумя людьми, хотя, по общему признанию, одним из них является Никлаус Вирт. Впервые выпущен примерно в 1990 году, скорость удивительно хорошая. Есть книга Гуткнехта.

3
ответ дан 24 November 2019 в 03:14
поделиться

You might enjoy this tutorial named "Roll your own toy UNIX-clone OS", its very insightful and should help you on your way.

Good luck.

3
ответ дан 24 November 2019 в 03:14
поделиться

Во многих школах есть классы ОС, которые делают многое из того, что вы описываете. Моя школа (CMU) преподавала ОС на C, и мы написали ядро, файловую систему и оболочку, а также получили код для загрузчика.

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

4
ответ дан 24 November 2019 в 03:14
поделиться

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

редактировать : MenuetOS является графическим. Он также написан на прямом asm, но он более сложен, чем MikeOS

6
ответ дан 24 November 2019 в 03:14
поделиться

Я бы начал с малого и купил встраиваемый комплект разработчика 8086 и разработал на нем многозадачную ОС. Если у вас есть ядро ​​и вы познакомитесь с работой на аппаратном уровне, вы будете готовы к чему-то более сложному.

Создание даже клона DOS дисплея VGA - довольно сложная задача. Детали огромны. : -)

конкретные темы.

Как мне поместить код на компьютер? Лучше всего это делать с дискеты? Может ли большинство компьютеров сделать это с USB-накопителя?

BIOS выполнит элементарную загрузку.


Какие драйверы мне нужны, и можете ли вы предложить какие-либо ссылки на их создание?

что-нибудь, что не является прямым cpu / операции с памятью. Все, чего нет прямо в справочном руководстве по ЦП.


Что дальше после загрузки? Как перейти в защищенный режим и т. Д.

Защищенный режим будет частью последовательности загрузки.

затем вы начинаете многозадачность и выясняете, как запускать процессы.


Как управлять памятью без помощи операционной системы? Я просто использую те адреса, которые хочу? Инициализация не требуется?

Верно. Вы, вероятно, захотите в конце концов разобраться в системе виртуальной памяти.


С чем я, несомненно, столкнусь, что меня запутает?

не имея инструментов отладки, не имея ввода-вывода


Как я могу сделать это либо оператором командной строки, либо графическим?

С печалью. Найдите Windows 3.1 и Linux, в частности X windows.


На чем построена графическая операционная система? Например, как мне сделать что-то вроде командной строки со шрифтом и изображением вверху?

Найдите X windows.


Последний совет: изучите linux / x windows. Это не идеально, но он дает понимание одного подхода. Также изучите встроенные системы.

10
ответ дан 24 November 2019 в 03:14
поделиться

If you don't mind using hardware virtualisation, there is a course (book + lectures + software) that will take you 'From Nand to Tetris'. You create a full computer system entirely yourself from the (for these purposes atomic, and given) electrical NAND gate, right through to building the OS, a language, and finally coding a simple game on your personal machine.

I think it's a great idea and something I fully intend to get stuck into soon. The book is surprisingly cheap and I believe the course is taught at MIT. I can imagine no greater feeling than having the full, complete knowledge of an entire system you built yourself from the ground up.

Link: http://www1.idc.ac.il/tecs/

12
ответ дан 24 November 2019 в 03:14
поделиться

Я вижу много хороших ссылок на сайты разработки ОС, поэтому я опишу другой подход:

Если вам нужен опыт реализации ОС с нуля, есть гораздо лучший выбор оборудования, чем старый ПК. С архитектурой ПК вы потратите чрезмерное количество времени на кодирование неинтересных артефактов его 30-летней истории дизайна. Например, часть проекта, относящаяся к загрузчику, вероятно, сожгла многих отважных программистов.

Например, вам понадобится один набор драйверов для чтения вашего ядра с диска и / или из сети. Затем вам понадобится код для перехода в защищенный режим. На этом этапе вам понадобится еще один набор драйверов! После этого очень небольшая часть работы, которую вы выполняете для перевода микросхемы в защищенный режим, будет передаваться. Вы хотите запустить его на другом ПК +–4 года, и вам понадобится еще один набор драйверов.

Рассмотрите возможность начальной загрузки ARM или другого 32-разрядного «встроенного» чипа. Доступны недорогие макетные платы, или вы можете припаять свои собственные! Некоторые из них имеют встроенный Ethernet и USB. Я думаю, вы получите больше удовольствия, работая над разумной, не твердой архитектурой, и, возможно, в конечном итоге приобретете некоторые повторно используемые навыки.

нужен еще один набор драйверов! После этого очень небольшая часть работы, которую вы выполняете для перевода микросхемы в защищенный режим, будет передаваться. Вы хотите запустить его на другом ПК +–4 года, и вам понадобится еще один набор драйверов.

Рассмотрите возможность начальной загрузки ARM или другого 32-битного «встроенного» чипа. Доступны недорогие макетные платы, или вы можете припаять свои собственные! Некоторые из них имеют встроенный Ethernet и USB. Я думаю, вы получите больше удовольствия, работая над разумной, не твердой архитектурой, и, возможно, в конечном итоге приобретете некоторые повторно используемые навыки.

нужен еще один набор драйверов! После этого очень небольшая часть работы, которую вы выполняете для перевода микросхемы в защищенный режим, будет передаваться. Вы хотите запустить его на другом ПК +–4 года, и вам понадобится еще один набор драйверов.

Рассмотрите возможность начальной загрузки ARM или другого 32-разрядного «встроенного» чипа. Доступны недорогие макетные платы, или вы можете припаять свои собственные! Некоторые из них имеют встроенный Ethernet и USB. Я думаю, вы получите больше удовольствия, работая над разумной, не твердой архитектурой, и, возможно, в конечном итоге приобретете некоторые повторно используемые навыки.

8
ответ дан 24 November 2019 в 03:14
поделиться

At its lowest level the minimum that an operating system needs to be able to do is to drive a system's hardware in some way and somehow load an execute some sort of "user code." If you're going to start with a PC then you need to write code that can be loaded by it from some device or another. Older PCs have a BIOS in firmware which determines how the hardware performs some initialization (at least video, keyboard, and some form of storage or boot loader). (Update October 2017: Newer PCs have EFI or UEFI firmware ... which is largely a pedantic difference; the serve the same purposes for this discussion).

So start by learning the low level details of how to use the BIOS or other firmware, on your target system. That is, learn how to write a program that the BIOS can load and execute. That will eventually morph into your boot loader. Start small. Just get a program that prints: "Hello, Linus" directly from the firmware boot process (on a floppy, or USB thumb drive, would be a good start ... or on a hard drive if you like).

From there I'd recommend writing a very simple serial driver ... update your boot loader to initialize some serial port, and start a download there from. Then it can execute the code it pulls across. From there write a bit of bootstrap that can write to another set of blocks (we haven't implemented a file system yet ... not even partition table parsing; so we'd just deal with raw ranges of blocks on the disk at first).

At that point your boot loader should be able to pull new code across the serial line, dump it into a partition (yes, implement partition table handling of some sort ... whether it conforms to standard PC conventions is up to you at this point), and execute it.

From there you should be able to work on far more sophisticated features. From this base you can write and compile a new "kernel" ... reboot your testbed, and have the new kernel deployed to it.

(Your bootloader should take some signal, such as a BREAK over the serial handshaking lines as a command to skip the download and just boot the existing image; and it should handle some timeout in this way as well).

From there write a very simple terminal layer and command shell? A filesystem? Implement commands to download new executable content other than the kernel (files or objects of some sort). And so on.

Naturally you could have started with a console driver using the PC keyboard and video (the BIOS INT 0x16h and INT 0x10H stuff, respectively, if I recall correctly). However, I'd suggest starting with a serial driver since you can then automate your build/deploy/test cycle from any other existing (functional) system. Since your new OS will start as a cross-compiled project it's going to be essential for you to have a streamlined way of handling that.

I don't know how far you want to take your project. A reasonably impressive goal would be to achieve "self hosting." If you can create a simple assembler/compiler that can allow you to use your new OS to (re-)build, link, and boot into a working version of your new OS ... then you've achieved that goal. (Note that's not a requirement. Many embedded systems are never going to be self-hosting and there's nothing wrong with that).

14
ответ дан 24 November 2019 в 03:14
поделиться

http://www.osdev.org/ а также http://www.osdever.net/

добро пожаловать в мир разработки ОС.

См. Также другие ссылки на документацию по x86 в вики-странице SO tag : Intel и AMD руководства, документация по компилятору / ассемблеру и различные руководства.

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

28
ответ дан 24 November 2019 в 03:14
поделиться

Я бы посоветовал поработать, по крайней мере, сначала, на Bochs или какой-нибудь другой виртуальной машине по той причине, что вы можете взять ее с собой куда угодно, проще debug (вы можете видеть точное состояние оборудования), и если вам нужна помощь извне, они могут использовать то же самое «оборудование», что и вы.

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

15
ответ дан 24 November 2019 в 03:14
поделиться

Больше всего на свете, если вы хотите, чтобы это работало на реальном оборудовании, вам абсолютно необходима копия руководства вашего процессора. Руководства Intel ( http://www.intel.com/products/processor/manuals/ ) бесценны. Они охватывают все, от переключения режимов (реальный / защищенный) до управления виртуальной памятью (если вы решите зайти так далеко) и выполнения системных вызовов (если вы когда-нибудь перейдете в пользовательский режим). Что наиболее важно , они очень подробно объясняют ряд вещей, которые должны быть настроены для работы вещей, таких как TSS и регистры сегментов, которые в большинстве текстов по ОС не обсуждаются, потому что их больше интересует понятий -уровня, а не конкретных деталей процессора.

8
ответ дан 24 November 2019 в 03:14
поделиться

Возможно, вы захотите взглянуть на Концепции операционных систем, Абрахам Зильбершатц - Понимание концепций системного программирования является фундаментальным требованием, загляните в ядро ​​F / OSS внутреннее устройство операционных систем linux * BSD и GNU / Linux , особенно более ранние версии, которые, вероятно, немного более документированы. alt text alt text

3
ответ дан 24 November 2019 в 03:14
поделиться

Серия Разработка ОС @ BrokenThorn может вас заинтересовать.

8
ответ дан 24 November 2019 в 03:14
поделиться

О низком- уровень программирования графики, это даст вам много информации: http://www.osdever.net/FreeVGA/home.htm . (Это очень интересно и для текстового режима.)

С чем я, несомненно, столкнусь, что меня запутает?

Вы поймете, что на ПК очень много непонятных вещей: сам набор инструкций x86 является сложно, и когда у вас есть прямой доступ к оборудованию, может пройти некоторое время, прежде чем вы поймете, как написать один символ на экране.

Не беспокойтесь о дискетах и ​​тому подобном, большую часть времени вы будете использовать эмулятор, такой как Bochs или QEmu.

3
ответ дан 24 November 2019 в 03:14
поделиться

Я веду список ресурсов на StackOverflow: Как начать разработку операционной системы . Пожалуйста, добавляйте к нему новые ресурсы, когда начнете свое приключение (я собираюсь начать :))

5
ответ дан 24 November 2019 в 03:14
поделиться

У вас амбициозная цель. Но выполнение является ключевым моментом.

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

Мой совет таков: сократите свои ожидания и начните с простого вопроса.

Что такое операционная система?

Ученый-компьютерщик (надеюсь) никогда не скажет, что ОС - это графический пользовательский интерфейс, или веб-браузер, или способ подключения USB-устройств, или что-то, что пользователь может увидеть или потрогать . Вместо этого ОС на самом фундаментальном уровне - это то, о чем я упоминал выше. Все они попадают под один большой зонтик: управление ресурсами.

Операционная система - это не что иное, как программа, которая управляет аппаратными ресурсами компьютера: памятью, ЦП и периферийными устройствами.

Вот простая операционная система: программа позволяет пользователю вводить программу ( в шестнадцатеричном или двоичном формате) с использованием последовательного соединения. После того, как программа набрана, она запускает программу. Когда программа завершена, управление возвращается пользователю, где он может либо запустить программу снова, либо ввести новую.

Сделайте это на «чистой» архитектуре, такой как встроенный процессор ARM с 64 КБ памяти или около того. . Вы можете закодировать это в сборке после нескольких дней изучения тонкостей ARM. И вуаля! , у вас есть операционная система.

Она делает все, что должна делать ОС:

  • Он управляет памятью, не позволяя пользователю перезаписывать саму ОС.
  • Он планирует запуск одного процесса.
  • Он обрабатывает ввод-вывод для одного последовательного периферийного устройства.

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

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

Ваш выбор неограничен, но каждый - маленький шаг по сравнению с тем, что у вас было раньше.

Это весело, если вы не ставите перед собой слишком высокие цели!

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

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

Ваш выбор неограничен, но каждый - маленький шаг по сравнению с тем, что у вас было раньше.

Это весело, если вы не ставите перед собой слишком высокие цели!

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

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

Ваш выбор неограничен, но каждый - маленький шаг по сравнению с тем, что у вас было раньше.

Это весело, если вы не ставите перед собой слишком высокие цели!

6
ответ дан 24 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: