ОС2/Пројекат 2022 — разлика између измена
м (→Тумачење scause и sepc: ispravke) |
м (Formatiranje) |
||
| Ред 9: | Ред 9: | ||
void put(struct proc *); // Убацивање спремног процеса у ред чекања | void put(struct proc *); // Убацивање спремног процеса у ред чекања | ||
</syntaxhighlight> | </syntaxhighlight> | ||
''xv6'' у себи садржи ''Round-robin'' распоређивач директно имплементиран у функцији [ | ''xv6'' у себи садржи ''Round-robin'' распоређивач директно имплементиран у функцији <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L456|scheduler()]]</code>. Неопходно је заменити овај алгоритам са траженим интерфејсом. Места од значаја су она где процес мења стање. | ||
# get() у scheduler() [ | # <code>get()</code> у <code>scheduler()</code> [[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L446|након укључивања прекида]] - прелаз из ''RUNNABLE'' у ''RUNNING''. | ||
# put() у [ | # <code>put()</code> у <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L501|yield()]]</code> - кад процес предаје контекст неком другом процесу. | ||
# put() у [ | # <code>put()</code> у <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L245|userinit()]]</code> - кад се креира први кориснички процес. | ||
# put() у [ | # <code>put()</code> у <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L315|fork()]]</code> - кад се форкује нов процес. | ||
# put() у [ | # <code>put()</code> у <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L568|wakeup()]]</code> - прелаз из ''SLEEPING'' у ''RUNNABLE''. | ||
# put() у [ | # <code>put()</code> у <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/proc.c#L589|kill()]]</code> - кад процес треба да се заврши треба да га пробудимо. | ||
== Имплементирање преотимања по временском квантуму == | == Имплементирање преотимања по временском квантуму == | ||
== Окружење == | == Окружење == | ||
=== Makefile === | === Makefile === | ||
=== Дебаговање корисничких програма === | === Дебаговање корисничких програма === | ||
=== Промена учестаности тајмерског прекида === | === Промена учестаности тајмерског прекида === | ||
У сврху тестирања на одбрани је понекад тражено да се повећа учестаност прекида ради прецизнијих мерења перформанси (помоћу системског позива <code>uptime()</code>) и видљивијег ефекта распоређивања. Интервал тајмера се може променити у фајлу | У сврху тестирања на одбрани је понекад тражено да се повећа учестаност прекида ради прецизнијих мерења перформанси (помоћу системског позива <code>uptime()</code>) и видљивијег ефекта распоређивања. Интервал тајмера се може променити у фајлу <code>start.c</code> у функцији <code>[[github:mit-pdos/xv6-riscv/blob/riscv//kernel/start.c#L68|timerinit()]]</code>. | ||
=== Тумачење ''scause'' и ''sepc'' === | === Тумачење ''scause'' и ''sepc'' === | ||
Верзија на датум 4. фебруар 2022. у 00:41
Пројекат 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 асембли са тачном адресом инструкција.