ОС2/Пројекат 2022 — разлика између измена
| Ред 24: | Ред 24: | ||
=== Тумачење ''scause'' и ''sepc'' === | === Тумачење ''scause'' и ''sepc'' === | ||
Прескочене су резервисане вредности. | |||
{| class="wikitable" | |||
|- | |||
! scause вредност | |||
! Значење | |||
! Потенцијални проблем | |||
|- | |||
| 0 | |||
| Адреса у PC није поравната | |||
| rowspan="3" | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null). | |||
|- | |||
| 1 | |||
| Грешка у приступу инструкцији | |||
|- | |||
| 2 | |||
| Илегална инструкција | |||
|- | |||
| 3 | |||
| Breakpoint<br /> | |||
| Не би требало да се појави као разлог за панику. | |||
|- | |||
| 4 | |||
| Адреса са које се чита није поравната | |||
| rowspan="4" | Лош показивач. | |||
|- | |||
| 5 | |||
| Грешка у приступу при читању | |||
|- | |||
| 6 | |||
| Адреса у коју се пише није поравната<br />Атомична инструкција приступа адреси која није поравната<br /> | |||
|- | |||
| 7 | |||
| Грешка у приступу при писању/атомичној инструкцији. | |||
|- | |||
| 8 | |||
| ''ecall'' из корисничког режима | |||
| Не би требало да се појави као разлог за панику. | |||
|- | |||
| 9 | |||
| ''ecall'' из супервизорског (кернел) режима | |||
| Не би требало да се дешава уопште у xv6. | |||
|- | |||
| c | |||
| Странична грешка при учитавању инструкције<br /> | |||
| Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null). | |||
|- | |||
| d | |||
| Странична грешка при читању | |||
| Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null).<br />Лош показивач. | |||
|- | |||
| f | |||
| Странична грешка при писању/атомичној инструкцији | |||
| Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null).<br />Лош показивач.<br /> | |||
|} | |||
Вредност ''sepc'' регистра означава вредност PC у тренутку кад је настала грешка. Може се тачно пронаћи место у коду претраживњем ове адресе у фајлу <code>kernel.asm</code> који садржи и C код кернела и генерисани ''RISC-V'' асембли са тачном адресом инструкција. | |||
[[Категорија:ОС2]] | [[Категорија:ОС2]] | ||
[[Категорија:Водичи]] | [[Категорија:Водичи]] | ||
Верзија на датум 4. фебруар 2022. у 00:16
Пројекат 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 није поравната | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null). |
| 1 | Грешка у приступу инструкцији | |
| 2 | Илегална инструкција | |
| 3 | Breakpoint |
Не би требало да се појави као разлог за панику. |
| 4 | Адреса са које се чита није поравната | Лош показивач. |
| 5 | Грешка у приступу при читању | |
| 6 | Адреса у коју се пише није поравната Атомична инструкција приступа адреси која није поравната | |
| 7 | Грешка у приступу при писању/атомичној инструкцији. | |
| 8 | ecall из корисничког режима | Не би требало да се појави као разлог за панику. |
| 9 | ecall из супервизорског (кернел) режима | Не би требало да се дешава уопште у xv6. |
| c | Странична грешка при учитавању инструкције |
Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null). |
| d | Странична грешка при читању | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null). Лош показивач. |
| f | Странична грешка при писању/атомичној инструкцији | Кернел је променио контекст у невалидан процес (вероватно је распоређивач вратио null). Лош показивач. |
Вредност sepc регистра означава вредност PC у тренутку кад је настала грешка. Може се тачно пронаћи место у коду претраживњем ове адресе у фајлу kernel.asm који садржи и C код кернела и генерисани RISC-V асембли са тачном адресом инструкција.