Мы уже несколько лет преподаем разработку компонентов учебной операционной системы 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.

Студентам предлагается выполнить лабораторные работы на следующие темы:

  1. Загрузка ПК

  2. Управление памятью

  3. Пользовательский уровень (запуск процессов)

  4. Вытесняющая многозадачность

  5. Реализация spawn (вызов библиотеки, которая загружает и запускает исполняемые файлы на диске), запуск оболочки в консоли.

Лабораторные работы направлены на изучение основных компонентов ОС: управление памятью, процессами и межпроцессное взаимодействие. Таким образом, студенты разбираются механизмах работы ОС через программирование ее компонентов, попутно изучая особенности написания кода под ОС.

Наш опыт преподавания xv6 показал, что студентам интереснее выполнять задания, работая с настоящей ОС, а также у обучающихся остаются знания о работе ОС, что полезно будущим разработчикам.

Литература

  • MIT 6.828 Operating System Engineering

  • хv6 OS sources

  • K&R Язык программирования Си

  • Intel X86 Arch manuals

  • Linux man pages

  • Linux sources

Комментарии (6)


  1. ophil
    22.12.2021 15:08

    Имеет CLI (Command line interface - интерфейс командной строки).

    как-то скупо описано. Надеюсь, портировали bash, gcc, прочие текст- и файл-утилиты. То что графики нет, понятно. Идея замечательная, думаю, очень полезная. Линукс начинался с меньшего. Ещё бы показать код на гитхабе, без этого что за разработка?


    1. vvviperrr
      22.12.2021 15:49

      да все есть давно, сабжу не первый год


  1. myxo
    22.12.2021 16:51
    +1

    Ничего не понятно, но очень интересно (с) =)

    Как все-таки выглядят начальные условия лабораторных и их результат. Ну то есть что-то типа «вот вам ссылка на репозиторий xv6, но с вырезанным модулем управления памяти, вам нужно его написать». Или как-то по-другому? В чем именно упрощение происходит?

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


    1. volkanin
      22.12.2021 17:54
      +2

      Примерно так и выглядит. Вот вторая лаба, про управление памятью - https://pdos.csail.mit.edu/6.828/2018/labs/lab2/

      Смотрим первое самостоятельное упражнение. Exercise 1. In the file kern/pmap.c, you must implement code for the following functions (probably in the order given).

      boot_alloc()
      mem_init() (only up to the call to check_page_free_list(1))
      page_init()
      page_alloc()
      page_free()

      Фактически со студентами надо исходный код прочитать вместе, рассказать, что там происходит, дать отсылки на документацию по железу - и вперёд, к самостоятельной работе


    1. lgorSL
      22.12.2021 20:10
      +2

      В Шаде встречался с лабами по xv6 на х86. С одной стороны - очень интересно и круто. С другой - требовалась куча знаний: си, ассемблер, отладка, архитектура ОС (страничная адресация памяти, потоки, фишки типа cow и fork) на хорошем глубоком уровне. Если студент знает меньше - будет сложно и не понятно.


  1. byman
    23.12.2021 09:26

    Как-то здесь была статья про японских студентов которые придумали свой процессор, свой отладочный инструмент и запустили XV6. Я тогда подумал, что у меня все тоже это есть и почему бы мне не попробовать запустить эту ОС. Оказалось, что есть исходники для портирования под ARM, MIPS, RISC-V. Вначале я использовал для изучения код ARM, т.к. хорошо знал эту архитектуру, но обнаружил, что код просто ужасный. Очень часто адреса преобразуются в числа и вычисления производятся над числами с учетом некоторых особенностей системы команд ARM (например, использовался тот факт, что сохранение контекста делается одной командой). Пришлось взять MIPS версию. В ней был более толковый код. В итоге на моей уникальной архитектуре все это тоже заработало и я даже запустил пример японских студентов и их дымящимся паравозиком :)