Мы уже несколько лет преподаем разработку компонентов учебной операционной системы xv6, и хотим поделиться своим опытом. Этот курс прошли уже около 600 студентов. Если вас заинтересует эта статья, то вы можете ознакомиться с нашим курсом.
После базовых курсов вроде операционных систем часто студенты выходят без реальных практических знаний. Лучше всего можно понять работу операционной системы, написав её самому. Но так как этот процесс может занять не один семестр, в рамках учебного курса можно ограничиться разработкой только ключевых компонентов. Для этого мы используем учебную операционную систему xv6, про которую расскажем ниже, так как она значительно проще Linux или других пользовательских ОС.
Для курса мы требуем следующий минимальный набор навыков:
Владение Linux на уровне пользователя
Чтение кода на Assembler
Навык написания и чтения кода на С
Знание архитектуры ЭВМ
Чтение технических текстов на английском языке
Курс предназначен для слушателей, заинтересованных в получении (или освежении) знаний о принципах работы операционных систем и их архитектуре. В рамках данного курса рассматриваются:
история и основные этапы развития операционных систем,
общие принципы организации современных операционных систем общего назначения,
их архитектура.
Основное внимание уделено:
механизмам планирования исполнения процессов и потоков,
организации памяти,
средствам межпроцессного взаимодействия.
Обзорно рассматриваются:
особенности мобильных операционных систем и систем реального времени.
Информация о xv6
xv6 - современная реализация Unix 6 версии для архитектуры x86 и RISC-V систем. Написана на стандарте языка C ANSI. Имеет CLI (Command line interface - интерфейс командной строки).
Эта ОС используется в педагогических целях в курсе "6.828 Operating System Engineering" университета MIT. ОС вдохновлена комментарием Джона Лайонса к 6-му изданию UNIX, который можно найти также сайте с курсом (https://pdos.csail.mit.edu/6.828/). Этот комментарий не просто пару строчек, как может показаться, а целая книга, посвящённая объяснению функционирования операционной системы Unix.
Еще в 2002 году в MIT решили, что необходимо начать преподавание курса по инженерии операционных систем. В рамках этого курса студенты должны были написать экзоядро (exokernel, Экзоядро — ядро операционной системы компьютеров, предоставляющее лишь функции для взаимодействия между процессами и безопасного выделения и освобождения ресурсов) для архитектуры x86, используя для этого систему Sixth Edition Unix (V6) и комментарии Джона Лайонса ( John Lions) в качестве учебного материала. Однако с этим курсом возникли проблемы.
Самая большая проблема состояла в том, что хотя курс курс был ориентирован на обучение написанию экзоядра для архитектуры Intel x86 (они разрабатывали ОС JOS), система Sixth Edition Unix и комментарии Джона Лайонса относились к области PDP-11 — системы совершенно другого вида. PDP-11 — серия 16-разрядных мини-ЭВМ компании DEC, серийно производившихся и продававшихся в 1970—80-х годах. Студенты жаловались на эти различия, и у них также не было желания учиться программировать для PDP-11. Получалось, что студенты изучали две различные архитектуры одновременно, на курсе, не посвященном архитектурам вычислительных систем. Кроме того, система Sixth Edition Unix была написана на мертвом диалекте языка C (еще до языка С Кернигана и Ричи).
Поэтому преподаватели в MIT решились на то, чтобы переписать систему Sixth Version Unix для архитектуры x86 на языке ANSI C. Хотя этот проект был выпущен в 2006 году, мало кто о нем слышал. При этом комментарии Джона Лайонса и система V6 достаточно знамениты.
xv6 берет код из следующих источников:
JOS (asm.h, elf.h, mmu.h, bootasm.S, ide.c, console.c и др.)
Plan 9 (mp.h, mp.c, lapic.c)
FreeBSD (ioapic.c)
NetBSD (console.c)
Попутно система была улучшена за счет добавления поддержки многопроцессорности. На странице проекта указывается: "использование архитектуры x86 в системе Xv6 оказалось более уместным для студенческой практики, чем V6, и позволило унифицировать курс вокруг единой архитектуры", а "добавление многопроцессорности потребовало параллельной обработки с использованием блокировок и потоков (вместо использования включения/отключения прерываний), повысило актуальность курса. Наконец, написание новой системы позволило чище переписать грубые версии частей системы V6, такие как планировщик и файловая система".
Код доступен всем для просмотра и использования под лицензией MIT. Обычно код не запускается на реальном оборудовании, в MIT его запускают под QEMU.
Студентам предлагается выполнить лабораторные работы на следующие темы:
Загрузка ПК
Управление памятью
Пользовательский уровень (запуск процессов)
Вытесняющая многозадачность
Реализация spawn (вызов библиотеки, которая загружает и запускает исполняемые файлы на диске), запуск оболочки в консоли.
Лабораторные работы направлены на изучение основных компонентов ОС: управление памятью, процессами и межпроцессное взаимодействие. Таким образом, студенты разбираются механизмах работы ОС через программирование ее компонентов, попутно изучая особенности написания кода под ОС.
Наш опыт преподавания xv6 показал, что студентам интереснее выполнять задания, работая с настоящей ОС, а также у обучающихся остаются знания о работе ОС, что полезно будущим разработчикам.
Литература
MIT 6.828 Operating System Engineering
хv6 OS sources
K&R Язык программирования Си
Intel X86 Arch manuals
Linux man pages
Linux sources