ОС2/Пројекат 2022 — разлика између измена
м (<br> ovde nema semantičko značenje) |
|||
| Ред 24: | Ред 24: | ||
=== Дебаговање корисничких програма === | === Дебаговање корисничких програма === | ||
Да би дебаговали корисничке програме, морате у конфигурацији за дебаговање у окружењу променити бинарни фајл који ће ''gdb-multiarch'' да дебагује (подразумевано сам кернел). | |||
* Мени ''Run'' → ''Edit Configurations'' → ''Remote Debug'' → ''Debug'' (или ваш назив конфигурације) → ''Symbol file'' промените на бинарни фајл корисничког програма (налазе се у директоријуму <code>/user/</code> и сви почињу са доњом цртом). | |||
* Поставите ''breakpoint'', покрените ОС као и обично и у њему покрените жељени програм. | |||
=== Промена учестаности тајмерског прекида === | === Промена учестаности тајмерског прекида === | ||
Верзија на датум 4. фебруар 2022. у 14:24
Пројекат 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
Дебаговање корисничких програма
Да би дебаговали корисничке програме, морате у конфигурацији за дебаговање у окружењу променити бинарни фајл који ће gdb-multiarch да дебагује (подразумевано сам кернел).
- Мени Run → Edit Configurations → Remote Debug → Debug (или ваш назив конфигурације) → Symbol file промените на бинарни фајл корисничког програма (налазе се у директоријуму
/user/и сви почињу са доњом цртом). - Поставите breakpoint, покрените ОС као и обично и у њему покрените жељени програм.
Промена учестаности тајмерског прекида
У сврху тестирања на одбрани је понекад тражено да се повећа учестаност прекида ради прецизнијих мерења перформанси (помоћу системског позива 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 асембли са тачном адресом инструкција.