ОС2/Пројекат 2022 — разлика између измена

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

  1. get() у scheduler() након укључивања прекида - прелаз из RUNNABLE у RUNNING.
  2. put() у yield() - кад процес предаје контекст неком другом процесу.
  3. put() у userinit() - кад се креира први кориснички процес.
  4. put() у fork() - кад се форкује нов процес.
  5. put() у wakeup() - прелаз из SLEEPING у RUNNABLE.
  6. 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 асембли са тачном адресом инструкција.