ОС2/Пројекат 2022 — разлика између измена
м (→Тумачење scause и sepc: ispravke) |
|||
| Ред 33: | Ред 33: | ||
| 0 | | 0 | ||
| Адреса у PC није поравната | | Адреса у PC није поравната | ||
| rowspan=" | | rowspan="2" | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). | ||
|- | |- | ||
| 1 | | 1 | ||
| Ред 40: | Ред 40: | ||
| 2 | | 2 | ||
| Илегална инструкција | | Илегална инструкција | ||
| Уколико користите ''floating-point'' типове, они нису подржани на овој имплементацији ''RISC-V''. | |||
|- | |- | ||
| 3 | | 3 | ||
| Ред 68: | Ред 69: | ||
| c | | c | ||
| Странична грешка при учитавању инструкције<br /> | | Странична грешка при учитавању инструкције<br /> | ||
| Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио | | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). | ||
|- | |- | ||
| d | | d | ||
| Странична грешка при читању | | Странична грешка при читању | ||
| Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио | | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). <br />Лош показивач. | ||
|- | |- | ||
| f | | f | ||
| Странична грешка при писању/атомичној инструкцији | | Странична грешка при писању/атомичној инструкцији | ||
| Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио | | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио невалидан процес). <br />Лош показивач. | ||
|} | |} | ||
Верзија на датум 4. фебруар 2022. у 00:39
Пројекат 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 асембли са тачном адресом инструкција.