ОС2/Пројекат 2022
Пројекат 2022. године је први пројекат из Оперативних система 1 и 2 у ком се користи xv6 оперативни систем на RISC-V архитектури. У овом водичу се налазе корисни савети при изради пројекта.
Додавање интерфејса распоређивача
Интерфејс дефинисан поставком за распоређивач је исти онај из школског језгра:
struct proc *get(); // Дохватање спремног процеса из реда чекања
void put(struct proc *); // Убацивање спремног процеса у ред чекања
xv6 у себи садржи Round-robin распоређивач директно имплементиран у функцији scheduler(). Неопходно је заменити овај алгоритам са траженим интерфејсом. Места од значаја су она где процес мења стање.
get()уscheduler()након укључивања прекида - прелаз из RUNNABLE у RUNNING.put()уyield()- кад процес предаје контекст неком другом процесу.put()уuserinit()- кад се креира први кориснички процес.put()уfork()- кад се форкује нов процес.put()уwakeup()- прелаз из SLEEPING у RUNNABLE.put()уkill()- кад процес треба да се заврши треба да га пробудимо.
Имплементирање преотимања по временском квантуму
Окружење
Makefile
Дебаговање корисничких програма
Промена учестаности тајмерског прекида
У сврху тестирања на одбрани је понекад тражено да се повећа учестаност прекида ради прецизнијих мерења перформанси (помоћу системског позива uptime()) и видљивијег ефекта распоређивања. Интервал тајмера се може променити у фајлу start.c у функцији timerinit().
Тумачење scause и sepc
Прескочене су резервисане вредности.
| scause вредност | Значење | Потенцијални проблем |
|---|---|---|
| 0 | Адреса у PC није поравната | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). |
| 1 | Грешка у приступу инструкцији | |
| 2 | Илегална инструкција | Уколико користите floating-point типове, они нису подржани на овој имплементацији RISC-V. |
| 3 | Breakpoint |
Не би требало да се појави као разлог за панику. |
| 4 | Адреса са које се чита није поравната | Лош показивач. |
| 5 | Грешка у приступу при читању | |
| 6 | Адреса у коју се пише није поравната Атомична инструкција приступа адреси која није поравната | |
| 7 | Грешка у приступу при писању/атомичној инструкцији. | |
| 8 | ecall из корисничког режима | Не би требало да се појави као разлог за панику. |
| 9 | ecall из супервизорског (кернел) режима | Не би требало да се дешава уопште у xv6. |
| c | Странична грешка при учитавању инструкције |
Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). |
| d | Странична грешка при читању | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). Лош показивач. |
| f | Странична грешка при писању/атомичној инструкцији | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). Лош показивач. |
Вредност sepc регистра означава вредност PC у тренутку кад је настала грешка. Може се тачно пронаћи место у коду претраживњем ове адресе у фајлу kernel.asm који садржи и C код кернела и генерисани RISC-V асембли са тачном адресом инструкција.