<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MihailoM342</id>
	<title>SI Wiki - Кориснички доприноси [sr]</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=MihailoM342"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D0%B1%D0%BD%D0%BE:%D0%94%D0%BE%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D0%B8/MihailoM342"/>
	<updated>2026-06-04T11:31:48Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%A1/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B5&amp;diff=8093</id>
		<title>ПРС/Формуле</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%A1/%D0%A4%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B5&amp;diff=8093"/>
		<updated>2025-09-29T09:28:46Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: Zamenjen redosled za otvorene mreze i interaktivne sisteme jer tim redom ide u materijalima&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== Оперативна меморија ==&lt;br /&gt;
=== Основни појмови ===&lt;br /&gt;
* У реду за чекање увек има послова.&lt;br /&gt;
* &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;: величина посла за учитавање у меморију&lt;br /&gt;
* &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;: време задржавања програма у меморији&lt;br /&gt;
* &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;: искоришћење меморије&lt;br /&gt;
** &amp;lt;math&amp;gt;\overline{U} = \frac{\sum_{i = 0}^n t_i \cdot S_i}{\sum_{i = 0}^n t_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Модели величина послова:&lt;br /&gt;
** Модел једнаких величина: сви послови имају једнаке величине&lt;br /&gt;
** Модел једнаковероватних величина: имамо минималну и максималну величину посла, и иста је вероватноћа да се било која величина од њих појави&lt;br /&gt;
** Експоненцијална расподела величина: више има мањих послова или обрнуто&lt;br /&gt;
* Модели времена задржавања у меморији:&lt;br /&gt;
** Константно време задржавања&lt;br /&gt;
** Функција од величине програма&lt;br /&gt;
* Монопрограмски систем: само један програм је учитан у меморију&lt;br /&gt;
* Статичке партиције: у сваку партицију оперативне меморије може бити учитан један програм&lt;br /&gt;
&lt;br /&gt;
=== Модел статичких партиција ===&lt;br /&gt;
* Величине веће и мање партиције означавамо са &amp;lt;math&amp;gt;x_b&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_s&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Нормализујемо по величини веће партиције: &amp;lt;math&amp;gt;x_b = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Мали програми могу да стану у мању партицију, велики не могу.&lt;br /&gt;
* Ознаке стања:&lt;br /&gt;
** &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;: празне партиције&lt;br /&gt;
** &amp;lt;math&amp;gt;BS&amp;lt;/math&amp;gt;: програми учитани и у велику и у малу партицију&lt;br /&gt;
** &amp;lt;math&amp;gt;BE&amp;lt;/math&amp;gt;: велики програм учитан у велику партицију&lt;br /&gt;
** &amp;lt;math&amp;gt;SE&amp;lt;/math&amp;gt;: мали програм учитан у велику партицију&lt;br /&gt;
*** Ако је време задржавања у меморији константно, ово стање не постоји!&lt;br /&gt;
** &amp;lt;math&amp;gt;SS&amp;lt;/math&amp;gt;: мали програми учитани у обе партиције&lt;br /&gt;
** &amp;lt;math&amp;gt;ES&amp;lt;/math&amp;gt; није могуће стање!&lt;br /&gt;
* Искоришћење рачунамо на основу величине просечног програма.&lt;br /&gt;
* Статичке вероватноће стања: вероватноћа да се налазимо у неком стању&lt;br /&gt;
* Просечно искоришћење: &amp;lt;math&amp;gt;\overline{U} = \overline{U_{BS}} \cdot p_{BS} + U_{SS} \cdot p_{SS} + ...&amp;lt;/math&amp;gt;&lt;br /&gt;
* Рекурентно време стања: &amp;lt;math&amp;gt;\frac{1}{1 - p}&amp;lt;/math&amp;gt; где је &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; вероватноћа да се остаје у стању (извођење преко математичког очекивања и потенцијалног реда)&lt;br /&gt;
&lt;br /&gt;
=== Кнутов модел ===&lt;br /&gt;
* Равнотежно стање: једнака вероватноћа алокације и деалокације меморије&lt;br /&gt;
* Четири сценарија ослобађања блока: HBH, HBB, BBH, BBB&lt;br /&gt;
** Број случајева HBB једнак је броју случајева BBH (један се налази на почетку секвенце блокова а други на крају)&lt;br /&gt;
** У HBH имамо две рупе, у HBB и BBH једну, па на основу тога можемо изразити укупан број рупа.&lt;br /&gt;
* Вероватноћа &#039;&#039;perfect fit&#039;&#039; тежи нули.&lt;br /&gt;
* Кнутов закон: број рупа тежи половини броја блокова.&lt;br /&gt;
* Однос величине рупа и блокова: &amp;lt;math&amp;gt;c = \frac{\overline{H}}{\overline{S}}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Мора бити &amp;lt;math&amp;gt;c &amp;lt; 1&amp;lt;/math&amp;gt; јер је ред послова бесконачан.&lt;br /&gt;
* Искоришћење меморије: &amp;lt;math&amp;gt;U = \frac{2}{2 + c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Бетериџов модел ===&lt;br /&gt;
* Меморија подељена на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; блокова, програми величине 1, 2, 3... блока, а релокација није дозвољена.&lt;br /&gt;
* Све величине програма су једнако вероватне, и при прелазима између стања је увек завршио тачно један програм.&lt;br /&gt;
* Могућа стања за систем са величином меморије 2: SS, B, SE, ES.&lt;br /&gt;
** Број стања расте експоненцијално са величином меморије.&lt;br /&gt;
* Модел статичких страница: програми више не морају да буду тачне величине у блоковима, постоји интерна фрагментација.&lt;br /&gt;
** Одбачени део меморије: &amp;lt;math&amp;gt;W = \frac{n_{avr}}{2}&amp;lt;/math&amp;gt; блокова, где је &amp;lt;math&amp;gt;n_{avr}&amp;lt;/math&amp;gt; просечан степен мултипрограмирања.&lt;br /&gt;
&lt;br /&gt;
=== Виртуелна меморија ===&lt;br /&gt;
* &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: величина једне странице&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;: величина улаза у PMT&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: број страница&lt;br /&gt;
* &amp;lt;math&amp;gt;M_{PMT}&amp;lt;/math&amp;gt;: количина меморије која оде на PMT&lt;br /&gt;
** &amp;lt;math&amp;gt;M_{PMT} = \frac{M}{x} \cdot k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Одбачени део меморије: &amp;lt;math&amp;gt;W = M_{PMT} + \frac{n_{avr} \cdot x}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Оптимална величина странице: &amp;lt;math&amp;gt;x_{opt} = \sqrt{\frac{2Mk}{n_{avr}}}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{1}{R}&amp;lt;/math&amp;gt;: вероватноћа да је последња страница програма у меморији&lt;br /&gt;
** Уколико је дата, онда &amp;lt;math&amp;gt;W = M_{PMT} + \frac{n_{avr} \cdot x}{2} \cdot \frac{1}{R}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дискови ==&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;: време за пренос записа у меморију.&lt;br /&gt;
** &amp;lt;math&amp;gt;T = T_{am} + T_{rd} + T_{dt}&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;T_{am} = \frac{1}{n_{c_1} n_{c_2}} \int_{c_1}^{c_1 + n_{c_1}} \int_{c_2}^{c_2 + n_{c_2}} t(z - x) dx dz&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;T_{am}&amp;lt;/math&amp;gt;: &#039;&#039;access motion&#039;&#039; време&lt;br /&gt;
*** &amp;lt;math&amp;gt;n_{c_1}&amp;lt;/math&amp;gt;: број цилиндара првог диска&lt;br /&gt;
*** &amp;lt;math&amp;gt;c_1&amp;lt;/math&amp;gt;: први цилиндар првог диска&lt;br /&gt;
*** &amp;lt;math&amp;gt;t(z - x)&amp;lt;/math&amp;gt;: колико диску треба времена да пређе од цилиндра &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; до цилиндра &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
*** Уколико се иде са цилиндра једне датотеке на исту датотеку: &amp;lt;math&amp;gt;T_{am} = \frac{2}{n_c^2} \int_0^{n_c} (n_c - x) t(x) dx&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;T_{rev} = \frac{1}{v_{rot}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;T_{rev}&amp;lt;/math&amp;gt;: време обртања диска&lt;br /&gt;
*** &amp;lt;math&amp;gt;v_{rot}&amp;lt;/math&amp;gt;: брзина обртања диска&lt;br /&gt;
** &amp;lt;math&amp;gt;T_{rd} = \frac{T_{rev}}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;T_{dt} = c \cdot T_{rev}&amp;lt;/math&amp;gt;&lt;br /&gt;
*** &amp;lt;math&amp;gt;T_{dt}&amp;lt;/math&amp;gt;: &#039;&#039;data transfer&#039;&#039; време&lt;br /&gt;
*** &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;: који део стазе заузима један запис&lt;br /&gt;
*** Уколико се само врши приступ, а не и трансфер података, онда је &amp;lt;math&amp;gt;T_{dt} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Поасонов процес ==&lt;br /&gt;
=== Основни термини ===&lt;br /&gt;
* &amp;lt;math&amp;gt;\bar{s}&amp;lt;/math&amp;gt; - Средње време обраде посла&lt;br /&gt;
** Понекад означено и као &amp;lt;math&amp;gt;s, S_p&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;\bar{a}&amp;lt;/math&amp;gt; - Средње време/Очекивано време између два пристизања послова&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; - Брзина/интензитет обраде посла&lt;br /&gt;
* &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; - Брзина/интензитет пристизања послова&lt;br /&gt;
* &amp;lt;math&amp;gt;\lambda = \frac{1}{\bar{a}}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mu = \frac{1}{\bar{s}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Стања система ===&lt;br /&gt;
* Стања система обележавамо бројевима који уједно означавају колико има послова у систему.&lt;br /&gt;
* Број стања = Број процесора који могу да раде посао + Број места у реду за чекање&lt;br /&gt;
* Уколико је ред за чекање неограничен/бесконачан, постоји бесконачан број стања.&lt;br /&gt;
* Свако стање има статичку вероватноћу, ознака &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt;, где је &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; број стања.&lt;br /&gt;
* &amp;lt;math&amp;gt;\sum_{i = 0}^n p_i = 1&amp;lt;/math&amp;gt; - Једначина преклапања. Збир свих стања у систему мора бити 1.&lt;br /&gt;
* Статичке вероватноће одређују се из балансних једначина.&lt;br /&gt;
* У системима са бесконачним бројем стања (неограниченим редом за чекање) јављају се редови:&lt;br /&gt;
** &amp;lt;math&amp;gt;1 + \rho + \rho^2 + ... = \sum_{i = 0}^{\infty} \rho^i = \frac{1}{1 - \rho}&amp;lt;/math&amp;gt; - Геометријски ред. Конвергира само ако &amp;lt;math&amp;gt;\rho &amp;lt; 1&amp;lt;/math&amp;gt; и то је неопходно проверити - иначе ред дивергира и анализа није применљива.&lt;br /&gt;
** &amp;lt;math&amp;gt;1 + 2\rho + 3\rho^2 + ... = \sum_{i = 0}^{\infty} (i + 1)\rho^i = \frac{1}{\left(1 - \rho\right)^2}&amp;lt;/math&amp;gt; -  Потенцијални ред. Конвергира само ако &amp;lt;math&amp;gt;\rho &amp;lt; 1&amp;lt;/math&amp;gt; и то је неопходно проверити - иначе ред дивергира и анализа није применљива.&lt;br /&gt;
* За непознат али коначан број стања јавља се и геометријски низ (који има коначан број чланова): &amp;lt;math&amp;gt;1 + \rho + \rho^2 + ... \rho^n = \sum_{i = 0}^{n} \rho^i = \frac{1 - \rho^{n+1}}{1 - \rho}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Пазити на случај где &amp;lt;math&amp;gt;\rho = 1&amp;lt;/math&amp;gt;. Тада је вредност низа &amp;lt;math&amp;gt;n\rho&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Карактеристике система ===&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; - Просечно/очекивано време обраде послова/време одзива у систему&lt;br /&gt;
* &amp;lt;math&amp;gt;T_q&amp;lt;/math&amp;gt; - Просечно/очекивано време обраде послова/време одзива у реду за чекање&lt;br /&gt;
** Веза: &amp;lt;math&amp;gt;T = T_q + \bar{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - Просечан/очекивани број послова у систему&lt;br /&gt;
** &amp;lt;math&amp;gt;J = \sum_{i = 0}^n ip_i&amp;lt;/math&amp;gt;  - где се &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; слаже са бројем послова у систему.&lt;br /&gt;
* &amp;lt;math&amp;gt;J_q&amp;lt;/math&amp;gt; - Просечан/очекивани број послова у реду за чекање&lt;br /&gt;
** Важи иста формула као за J, само што се вероватноће множе са бројем послова у реду за чекање.&lt;br /&gt;
* &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - Проток кроз систем&lt;br /&gt;
** Уједно и проток кроз ред за чекање&lt;br /&gt;
** Уколико је ред за чекање бесконачан нема одбијања послова, што значи да је проток исти као и интензитет пристизања послова. &amp;lt;math&amp;gt;X = \lambda&amp;lt;/math&amp;gt;&lt;br /&gt;
** Иначе, проток је &amp;lt;math&amp;gt;X = (1 - p_{MAX})\lambda&amp;lt;/math&amp;gt;, где је &amp;lt;math&amp;gt;p_{MAX}&amp;lt;/math&amp;gt; последње стање у ком нема места у реду за чекање.&lt;br /&gt;
* &amp;lt;math&amp;gt;X&#039; = p_{MAX}\lambda&amp;lt;/math&amp;gt; - Проток одбијених послова&lt;br /&gt;
* &amp;lt;math&amp;gt;T = \frac{J}{X}&amp;lt;/math&amp;gt; - Литлова формула. Важи за &#039;&#039;&#039;цео систем&#039;&#039;&#039;.&lt;br /&gt;
** Могуће је посматрати само ред за чекање и ту важи: &amp;lt;math&amp;gt;T_q = \frac{J_q}{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Веза: &amp;lt;math&amp;gt;T = T_q + \bar{s} \iff \frac{J}{X} = \frac{J_q}{X} + \bar{s} \iff J - J_q = \bar{s}X&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;U = \sum_{i = 0}^n U_i p_i&amp;lt;/math&amp;gt; - Искоришћеност система. Искоришћеност неког дела &amp;lt;math&amp;gt;U_i&amp;lt;/math&amp;gt; се дефинише као број послова подељен са капацитетом.&lt;br /&gt;
** Важи &amp;lt;math&amp;gt;U = 1 - &amp;lt;/math&amp;gt; неискоришћени део система.&lt;br /&gt;
== Циклични модел мултипрограмирања ==&lt;br /&gt;
* Проток кроз систем је свуда исти.&lt;br /&gt;
* Ово значи да време проведено у процесорском делу система и диск делу система има исти проток, па важи: &amp;lt;math&amp;gt;T_{CPU} = \frac{J_{CPU}}{X}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{disk} = \frac{J_{disk}}{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;J_{CPU} + J_{disk} = n&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;R = T_{CPU} + T_{disk} = \frac{n}{X}&amp;lt;/math&amp;gt; - &#039;&#039;Round trip time&#039;&#039; - време проласка једног посла кроз цео систем.&lt;br /&gt;
* Пошто је проток у целом систему исти, код гранања еквивалентних паралелних сервера важи:&lt;br /&gt;
** &amp;lt;math&amp;gt;X = nX_p = mX_d&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; број процесора, &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; број дискова.&lt;br /&gt;
* Закон искоришћења једног сервера/диска: &amp;lt;math&amp;gt;U_p = X_pS_p&amp;lt;/math&amp;gt;&lt;br /&gt;
** Пошто је проток свуда исти: &amp;lt;math&amp;gt;\frac{U_p}{U_d} = \frac{X_pS_p}{X_dS_d}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Гордон-Њуелов метод ==&lt;br /&gt;
* Гордон-Њуелов метод дефинише &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; као потражњу сервера &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;. Овај фактор је релативан и обично се узима да је потражња првог сервера (процесора) &amp;lt;math&amp;gt;x_1 = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
* ГЊ систем једначина се формира овако:&lt;br /&gt;
** Сваки систем има своју једначину, где са леве стране једнакости стоје &amp;lt;math&amp;gt;\mu_ix_i&amp;lt;/math&amp;gt;, а са десне, за сваку грану која улази у систем (тј. његов ред за чекање) &amp;lt;math&amp;gt;p_i\mu_ix_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
** &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; је вероватноћа уласка у грану.&lt;br /&gt;
* &amp;lt;math&amp;gt;G(n)&amp;lt;/math&amp;gt; - константа система која зависи од броја послова у систему. Најлакше се одређује Бјузеновим методом.&lt;br /&gt;
* &amp;lt;math&amp;gt;P[n_j(N) \geq k] = x_j^k \frac{G(N-k)}{G(N)}&amp;lt;/math&amp;gt; - Вероватноћа да у неком систему има више од &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процеса.&lt;br /&gt;
** &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; је укупан број послова у систему.&lt;br /&gt;
** &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; је редни број система.&lt;br /&gt;
** &amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt; је његов фактор потражње.&lt;br /&gt;
* &amp;lt;math&amp;gt;P[n_j(N) = k] = P[n_j(N) \geq k] - P[n_j(N) \geq k + 1] = x_j^k \frac{G(N-k)}{G(N)} -  x_j^{k+1} \frac{G(N-k + 1)}{G(N)}&amp;lt;/math&amp;gt; - Вероватноћа да систем има тачно &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; послова.&lt;br /&gt;
* &amp;lt;math&amp;gt;U_j = P[n_j(N) \geq 1] = x_j \frac{G(N-1)}{G(N)}&amp;lt;/math&amp;gt; - Искоришћеност сервера&lt;br /&gt;
** Сервер који има највећу искоришћеност је &#039;&#039;&#039;уско грло&#039;&#039;&#039;.&lt;br /&gt;
* &amp;lt;math&amp;gt;J_i = x_i^1 \frac{G(N-1)}{G(N)} + x_i^2 \frac{G(N-2)}{G(N)} + x_i^3 \frac{G(N-3)}{G(N)} + ... + x_i^n \frac{G(0)}{G(N)} &amp;lt;/math&amp;gt; - Просечан/очекивани број послова на серверу.&lt;br /&gt;
* &amp;lt;math&amp;gt;P_{j_1j_2j_3...j_n} = \frac{x_1^{j_1}x_2^{j_2} ... x_n^{j_n}}{G(N)}&amp;lt;/math&amp;gt; - Вероватноћа да у систему са &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сервера и &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; послова сваки појединачни сервер има &amp;lt;math&amp;gt;j_i&amp;lt;/math&amp;gt; послова.&lt;br /&gt;
&lt;br /&gt;
== Отворене мреже ==&lt;br /&gt;
* Џексонова теорема: можемо посматрати сервисне центре као да су независни М/М/1 сервери.&lt;br /&gt;
** Време одзива појединачног сервера добијамо као: &amp;lt;math&amp;gt; R_i = \frac{1}{\mu_i - X_i} &amp;lt;/math&amp;gt; (примена Литлове формуле за М/М/1 систем)&lt;br /&gt;
** Вероватноће стања укупног система се добијају као производи појединачних стања система.&lt;br /&gt;
** За М/М/1 важи: &amp;lt;math&amp;gt;p_0 = 1 - \rho&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p_i = \rho^i p_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J = \frac{\rho}{1 - \rho}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Једначина отворене мреже са централним сервером: &amp;lt;math&amp;gt;1 = \frac{V_1}{V_0} + \frac{V_2}{V_0} + ... + \frac{V_k}{V_0} + \frac{1}{V_0}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Сабирци су редом једнаки: &amp;lt;math&amp;gt;p_1, p_2, ..., p_k, p_0&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;V_0, V_1, ..., V_k&amp;lt;/math&amp;gt;: просечан број посета сваком од сервисних центара (&amp;lt;math&amp;gt;V_0&amp;lt;/math&amp;gt; је централни сервер, у задацима, узети да је &amp;lt;math&amp;gt;V_0 = 1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Интерактивни системи ==&lt;br /&gt;
* &amp;lt;math&amp;gt;\overline{\theta}&amp;lt;/math&amp;gt;: време размишљања (време током ког се корисник одлучује шта да упише на терминал)&lt;br /&gt;
* &amp;lt;math&amp;gt;\overline{w}&amp;lt;/math&amp;gt;: време проведено у реду за чекање&lt;br /&gt;
* &amp;lt;math&amp;gt;\overline{r}&amp;lt;/math&amp;gt;: време одзива процесора&lt;br /&gt;
** &amp;lt;math&amp;gt;\overline{r} = \overline{w} + \overline{s}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;: време циклуса на процесору&lt;br /&gt;
** &amp;lt;math&amp;gt;T_c = \overline{w} + \overline{s} + \overline{\theta} = \overline{r} + \overline{\theta}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Примењена Литлова формула: &amp;lt;math&amp;gt;T_c = \frac{n}{X}&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;n^*&amp;lt;/math&amp;gt;: критичан број терминала (колико максимално терминала можемо да имамо у систему тако да остане &amp;lt;math&amp;gt;\overline{w} = 0&amp;lt;/math&amp;gt;)&lt;br /&gt;
** &amp;lt;math&amp;gt;n^* = \left\lfloor 1 + \frac{\overline{\theta}}{\overline{s}} \right\rfloor&amp;lt;/math&amp;gt;&lt;br /&gt;
* Искоришћење у интерактивном систему (опет добијено из Литлове формуле): &amp;lt;math&amp;gt;U = \frac{n \overline{s}}{T_c}&amp;lt;/math&amp;gt;&lt;br /&gt;
** За &amp;lt;math&amp;gt;\overline{w} = 0&amp;lt;/math&amp;gt; важи &amp;lt;math&amp;gt;U(n) = \frac{n \cdot \overline{s}}{\overline{s} + \overline{\theta}}&amp;lt;/math&amp;gt;&lt;br /&gt;
** За систем у засићењу важи: &amp;lt;math&amp;gt;1 = \frac{n \cdot \overline{s}}{\overline{r}(n) + \overline{\theta}}&amp;lt;/math&amp;gt;&lt;br /&gt;
* Рекурентна формула за рачунање вероватноћа стања система (&#039;&#039;&#039;важи само за систем са једним процесором&#039;&#039;&#039;): &amp;lt;math&amp;gt;\frac{1}{p_0(n)} = 1 + n\rho \frac{1}{p_0(n-1)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== МВА анализа ==&lt;br /&gt;
* Улазни параметри:&lt;br /&gt;
** &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;: укупан број послова у систему&lt;br /&gt;
** &amp;lt;math&amp;gt;Z&amp;lt;/math&amp;gt;: средње време размишљања терминала, ако систем није интерактиван онда је 0&lt;br /&gt;
** &amp;lt;math&amp;gt;S_j&amp;lt;/math&amp;gt;: време опслуживања једног посла на сервисном центру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;V_j&amp;lt;/math&amp;gt;: просечан број посета сервисном центру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;D_j&amp;lt;/math&amp;gt;: потражња сервисног центра &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
*** Користи се у другој варијанти алгоритма, и добија се као &amp;lt;math&amp;gt;S_j \cdot V_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Променљиве:&lt;br /&gt;
** &amp;lt;math&amp;gt;Q_j(n)&amp;lt;/math&amp;gt;: број послова у сервисном центру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;r_j(n)&amp;lt;/math&amp;gt;: задржавање у сервисном центру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;R(i)&amp;lt;/math&amp;gt;: време задржавања посла у систему (време одзива)&lt;br /&gt;
** &amp;lt;math&amp;gt;R_j(i)&amp;lt;/math&amp;gt;: време задржавања посла у сервисном центру &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;X(i)&amp;lt;/math&amp;gt;: проток кроз систем&lt;br /&gt;
** &amp;lt;math&amp;gt;X_j(i)&amp;lt;/math&amp;gt;: проток кроз сервисни центар &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;U_j(i)&amp;lt;/math&amp;gt;: искоришћење сервисног центра &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ПРС]]&lt;br /&gt;
[[Категорија:Водичи]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2022&amp;diff=7970</id>
		<title>Микропроцесорски системи/Јануар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2022&amp;diff=7970"/>
		<updated>2025-08-26T19:56:38Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: main.c i usart1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Јануарски рок 2022. године&#039;&#039;&#039; нема поставку доступну са странице предмета. Није много познато о овом року, осим задатка наведеног испод.&lt;br /&gt;
&lt;br /&gt;
== Задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
[[Датотека:MIPS januar 2022 referentna šema.svg|thumb|Референтна шема у задатку.&amp;lt;ref&amp;gt;На датој шеми &#039;&#039;LCD&#039;&#039; дисплеј није повезан на исти начин као на вежбама - код је одговарајуће модификован да се овоме прилагоди. На правом испиту је шема највероватније била као што је рађено на вежбама.&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
# &amp;lt;del&amp;gt;У систему постоји један микроконтролер који контролише вентилатор у складу са тренутном вредношћу температуре. У симулатору &#039;&#039;Proteus&#039;&#039; направити пројекат и инстанцирати микроконтролер &#039;&#039;STM32F103R6&#039;&#039; (&#039;&#039;CM3_STM32&#039;&#039;). Направити пројекат у алату &#039;&#039;CubeMX&#039;&#039; који ће служити за конфигурисање микроконтролера.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;У симулатору &#039;&#039;Proteus&#039;&#039; додати следеће компоненте&amp;lt;/del&amp;gt; &amp;lt;u&amp;gt;строго према датој референтној шеми&amp;lt;/u&amp;gt;:&lt;br /&gt;
#* аналогни мултиплексер &#039;&#039;74HC4051&#039;&#039; (&#039;&#039;74HC&#039;&#039;) чији је излазни пин повезан на канал 7 аналогно-дигиталног конвертора микроконтролера; селекција излаза аналогног мултиплексера се врши преко његових пинова &#039;&#039;CBA&#039;&#039; где пин &#039;&#039;A&#039;&#039; има најмању тежину,&lt;br /&gt;
#* &amp;lt;del&amp;gt;температурни сензор &#039;&#039;LM35&#039;&#039; (&#039;&#039;NATDAC&#039;&#039;) чији је излазни пин повезан&amp;lt;/del&amp;gt; на нулти улаз (&#039;&#039;X0&#039;&#039;) мултилексера &amp;lt;del&amp;gt;(аналогна вредност напона на излазном пину сензора је линеарно пропорционална вредности температуре односно ради добијања вредност температуре напон треба помножити са вредношћу 100),&amp;lt;/del&amp;gt;&lt;br /&gt;
#* анемометар &#039;&#039;ANEMOMETER&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) повезан у складу са референтном шемом на канале 1 и 2 тајмера 1;&amp;lt;ref&amp;gt;На референтној шеми са викија повезан је само на један канал, јер је само један канал и потребан.&amp;lt;/ref&amp;gt; излазни сигнал анемометра је периодична правоугаона поворка чија се фреквенција линеарно повећава са повећањем брзине ветра (брзина ветра једнака је производу фреквенције излазног сигнала анемометра и реалне константе 2.4),&lt;br /&gt;
#* ветроказ &#039;&#039;WINDVANE&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) чији је излазни пин повезан у складу са референтном шемом (обратити пажњу на постојање отпорника) на први улаз (&#039;&#039;X1&#039;&#039;) мултиплексера; аналогна вредност напона на излазном пину ветроказа представља азимут односно правац ветра (функција за пресликавање вредности напона у азимут дата је у прилогу),&amp;lt;ref&amp;gt;Овај прилог не постоји на викију, али можете ископирати функцију &amp;lt;code&amp;gt;adcToWindvane&amp;lt;/code&amp;gt; из решења.&amp;lt;/ref&amp;gt;&lt;br /&gt;
#* &amp;lt;del&amp;gt;виртуелни терминал повезан на периферију &#039;&#039;USART1&#039;&#039; микроконтролера&amp;lt;/del&amp;gt; преко пинова &#039;&#039;PB6&#039;&#039; и &#039;&#039;PB7&#039;&#039;,&lt;br /&gt;
#* &#039;&#039;LCD&#039;&#039; дисплеј &#039;&#039;LM041L&#039;&#039; (&#039;&#039;DISPLAY&#039;&#039;) са четири линије, којима редом одговарају почетне адресе &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x90&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;0xD0&amp;lt;/code&amp;gt; у &#039;&#039;DDRAM&#039;&#039; меморији контролера &#039;&#039;HD44780&#039;&#039;, &amp;lt;del&amp;gt;повезан на пинове &#039;&#039;PC0&#039;&#039;-&#039;&#039;PC6&#039;&#039; микроконтролера и&amp;lt;/del&amp;gt;&lt;br /&gt;
#* црвена &#039;&#039;LED-RED&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) повезана на &#039;&#039;PA13&#039;&#039;.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Temper: &amp;amp;lt;t&amp;gt;&#039;&#039;&#039;&#039;&#039; у трећем реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;amp;lt;t&amp;gt;&#039;&#039; представља тренутну вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] &amp;lt;u&amp;gt;очитану са температурног сензора&amp;lt;/u&amp;gt;. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Azimut: &amp;amp;lt;a&amp;gt;&#039;&#039;&#039;&#039;&#039; у првом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;amp;lt;a&amp;gt;&#039;&#039; представља тренутну вредност азимута ветра &amp;lt;u&amp;gt;очитану са ветроказа&amp;lt;/u&amp;gt;. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Brzina: &amp;amp;lt;b&amp;gt;&#039;&#039;&#039;&#039;&#039; у другом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;amp;lt;b&amp;gt;&#039;&#039; представља тренутну вредност брзине ветра &amp;lt;u&amp;gt;очитану са анемометра&amp;lt;/u&amp;gt;. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити треперење црвене &#039;&#039;LED&#039;&#039; са периодом од једне секунде (пола секунде светли, пола секунде не светли) уколико је брзина ветра једнака или већа од 50 километара на сат. Уколико је брзина ветра мања од 50 километара на сат црвена &#039;&#039;LED&#039;&#039; не светли.&lt;br /&gt;
# Обезбедити приказ порука &#039;&#039;&#039;&#039;&#039;&amp;amp;lt;a&amp;gt;/&amp;amp;lt;b&amp;gt;/&amp;amp;lt;t&amp;gt;&#039;&#039;&#039;&#039;&#039; на виртуелном терминалу, где је &#039;&#039;&amp;amp;lt;a&amp;gt;&#039;&#039; тренутна вредност азимута ветра, &#039;&#039;&amp;amp;lt;b&amp;gt;&#039;&#039; тренутна вредност брзине ветра и &#039;&#039;&amp;amp;lt;t&amp;gt;&#039;&#039; тренутна вредност температуре изражено у степенима Целзијуса у опсегу [0, 60]. За величине чије вредности нису успешно израчунате исписати ? (знак питања). Уколико је ипак за неку од ставки (3), (4) или (5) вредност успешно израчуната онда та вредност мора бити приказана на виртуелном терминалу да би за ставку (7) били признати поени. Освежавање описане поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности. Приликом освежавања поруке променити тренутне вредности у постојећој поруци уместо додавања нове поруке на виртуелном терминалу.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Цело решење може се преузети [[Медиј:MIPS januar 2022 projekat.zip|одавде]]. Разлика решења у односу на поставку јесте што је редослед исписа на &#039;&#039;LCD&#039;&#039; дисплеју температура, азимут, брзина уместо азимут, брзина, температура.&lt;br /&gt;
&lt;br /&gt;
Сви релевантни измењени фајлови са кодом налазе се у &amp;lt;code&amp;gt;cubemx/code/Core/Src&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;cubemx/code/Core/Inc&amp;lt;/code&amp;gt; директоријумима.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;CubeMX&#039;&#039; ====&lt;br /&gt;
У алату &#039;&#039;CubeMX&#039;&#039; направљене су следеће измене:&lt;br /&gt;
* Омогућени су прекиди од ADC, TIM1 и USART1.&lt;br /&gt;
* Као &#039;&#039;Timebase Source&#039;&#039; подешен је TIM2.&lt;br /&gt;
* Омогућен је IN7 улаз ADC1.&lt;br /&gt;
* У TIM1 је канал 1 подешен за &#039;&#039;Input Capture&#039;&#039;.&lt;br /&gt;
* У USART1 је режим подешен на &#039;&#039;Asynchronous&#039;&#039;, &#039;&#039;Baud Rate&#039;&#039; је 9600Bits/s.&lt;br /&gt;
* У &#039;&#039;FreeRTOS&#039;&#039; је интерфејс подешен на CMSIS_V2.&lt;br /&gt;
* У &#039;&#039;Code Generator&#039;&#039; табу је подешено да се генеришу одвојени фајлови за сваку периферију.&lt;br /&gt;
* Пинови PC&amp;lt;sub&amp;gt;6..0&amp;lt;/sub&amp;gt;, PA&amp;lt;sub&amp;gt;13&amp;lt;/sub&amp;gt; и PB&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; су подешени као GPIO_Output.&lt;br /&gt;
Након генерисања, линија 310 у &amp;lt;code&amp;gt;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c&amp;lt;/code&amp;gt; је закоментарисана.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;Makefile&#039;&#039; ====&lt;br /&gt;
У &#039;&#039;Makefile&#039;&#039; су додати фајлови &amp;lt;code&amp;gt;uart.c&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lcd.c&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sensors.c&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;exam.c&amp;lt;/code&amp;gt; у &amp;lt;code&amp;gt;C_SOURCES&amp;lt;/code&amp;gt;, следећи блок:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;makefile&amp;quot;&amp;gt;&lt;br /&gt;
ifeq ($(DEBUG), 1)&lt;br /&gt;
CFLAGS += -g -gdwarf-2&lt;br /&gt;
endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Generate dependency information&lt;br /&gt;
CFLAGS += -MMD -MP -MF&amp;quot;$(@:%.o=%.d)&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
је промењен на:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;makefile&amp;quot;&amp;gt;&lt;br /&gt;
ifeq ($(DEBUG), 1)&lt;br /&gt;
CFLAGS += -g -gdwarf-2 -fdebug-prefix-map==../&lt;br /&gt;
endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Generate dependency information&lt;br /&gt;
CFLAGS += -MMD -MP -MF&amp;quot;$(@:%.o=%.d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CFLAGS += -mlong-calls&lt;br /&gt;
CFLAGS += -Wall -Wextra&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
и &amp;lt;code&amp;gt;startup_stm32f103x6.s&amp;lt;/code&amp;gt; је промењено на &amp;lt;code&amp;gt;Core/Src/startup_stm32f103x6.s&amp;lt;/code&amp;gt; унутар &amp;lt;code&amp;gt;ASM_SOURCES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;lcd.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_LCD_H_&lt;br /&gt;
#define CORE_INC_LCD_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
#include &amp;quot;queue.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define CLEAR_DISPLAY_INSTRUCTION 		0x01&lt;br /&gt;
&lt;br /&gt;
#define RETURN_HOME_INSTRUCTION 		0x02&lt;br /&gt;
&lt;br /&gt;
#define ENTRY_MODE_INSTRUCTION			0x04&lt;br /&gt;
#define ENTRY_MODE_INC_CURSOR			0x02&lt;br /&gt;
&lt;br /&gt;
#define DISPLAY_INSTRUCTION				0x08&lt;br /&gt;
#define DISPLAY_ON						0x04&lt;br /&gt;
#define DISPLAY_CURSOR_ON				0x02&lt;br /&gt;
#define DISPLAY_BLINK_ON				0x01&lt;br /&gt;
&lt;br /&gt;
#define SHIFT_INSTRUCTION				0x10&lt;br /&gt;
#define SHIFT_DISPLAY					0x08&lt;br /&gt;
#define SHIFT_RIGHT						0x04&lt;br /&gt;
&lt;br /&gt;
#define FUNCTION_INSTRUCTION			0x20&lt;br /&gt;
#define FUNCTION_2_LINES				0x08&lt;br /&gt;
#define FUNCTION_5x10_DOTS				0x04&lt;br /&gt;
&lt;br /&gt;
#define SET_CGRAM_ADDRESS_INSTRUCTION	0x40&lt;br /&gt;
&lt;br /&gt;
#define SET_DDRAM_ADDRESS_INSTRUCTION	0x80&lt;br /&gt;
&lt;br /&gt;
typedef enum {&lt;br /&gt;
	LCD_INSTRUCTION, LCD_DATA&lt;br /&gt;
} LCD_Register;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	LCD_Register reg;&lt;br /&gt;
	uint8_t data;&lt;br /&gt;
} LCD_Command;&lt;br /&gt;
&lt;br /&gt;
void LCD_Init();&lt;br /&gt;
void LCD_Enqueue(LCD_Register reg, uint8_t data);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;uart.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_UART_H_&lt;br /&gt;
#define CORE_INC_UART_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
#include &amp;quot;queue.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void UART_Transmit(uint8_t byte);&lt;br /&gt;
void UART_Init();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;sensors.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_SENSORS_H_&lt;br /&gt;
#define CORE_INC_SENSORS_H_&lt;br /&gt;
&lt;br /&gt;
extern float temperatureSensor;&lt;br /&gt;
extern float anemometerSensor;&lt;br /&gt;
extern float windvaneSensor;&lt;br /&gt;
&lt;br /&gt;
void Sensors_Init();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;exam.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_EXAM_H_&lt;br /&gt;
#define CORE_INC_EXAM_H_&lt;br /&gt;
&lt;br /&gt;
extern unsigned overflowCounter;&lt;br /&gt;
&lt;br /&gt;
void examInit();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;lcd.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;lcd.h&amp;quot;&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Napomena: referentna šema se razlikuje od one date na vežbama.&lt;br /&gt;
#define LCD_ENABLE_BIT 0x04&lt;br /&gt;
&lt;br /&gt;
QueueHandle_t LCD_QueueHandle;&lt;br /&gt;
LCD_Command cmd;&lt;br /&gt;
&lt;br /&gt;
void LCD_Write(LCD_Register reg, uint8_t data) {&lt;br /&gt;
	// Napomena: referentna šema se razlikuje od one date na vežbama.&lt;br /&gt;
	GPIOC-&amp;gt;ODR = (data &amp;lt;&amp;lt; 3) | reg;&lt;br /&gt;
	GPIOC-&amp;gt;ODR |= LCD_ENABLE_BIT;&lt;br /&gt;
	GPIOC-&amp;gt;ODR &amp;amp;= ~LCD_ENABLE_BIT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LCD_WriteCommand(LCD_Register reg, uint8_t data) {&lt;br /&gt;
	LCD_Write(reg, data &amp;gt;&amp;gt; 4);&lt;br /&gt;
	LCD_Write(reg, data);&lt;br /&gt;
	vTaskDelay(pdMS_TO_TICKS(2));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LCD_Task(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	LCD_Write(LCD_INSTRUCTION, (FUNCTION_INSTRUCTION) &amp;gt;&amp;gt; 4);&lt;br /&gt;
	vTaskDelay(pdMS_TO_TICKS(2));&lt;br /&gt;
	LCD_WriteCommand(LCD_INSTRUCTION, FUNCTION_INSTRUCTION | FUNCTION_2_LINES);&lt;br /&gt;
	LCD_WriteCommand(LCD_INSTRUCTION, DISPLAY_INSTRUCTION | DISPLAY_ON);&lt;br /&gt;
	LCD_WriteCommand(LCD_INSTRUCTION,&lt;br /&gt;
	ENTRY_MODE_INSTRUCTION | ENTRY_MODE_INC_CURSOR);&lt;br /&gt;
	LCD_WriteCommand(LCD_INSTRUCTION, RETURN_HOME_INSTRUCTION);&lt;br /&gt;
	while (1) {&lt;br /&gt;
		xQueueReceive(LCD_QueueHandle, &amp;amp;cmd, portMAX_DELAY);&lt;br /&gt;
		LCD_WriteCommand(cmd.reg, cmd.data);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LCD_Enqueue(LCD_Register reg, uint8_t data) {&lt;br /&gt;
	cmd.reg = reg;&lt;br /&gt;
	cmd.data = data;&lt;br /&gt;
	xQueueSendToBack(LCD_QueueHandle, &amp;amp;cmd, portMAX_DELAY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LCD_Init() {&lt;br /&gt;
	xTaskCreate(LCD_Task, &amp;quot;LCD_Task&amp;quot;, 128, NULL, 5, NULL);&lt;br /&gt;
	LCD_QueueHandle = xQueueCreate(64, sizeof(LCD_Command));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;uart.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;usart.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
QueueHandle_t UART_QueueHandle;&lt;br /&gt;
TaskHandle_t UART_TaskHandle;&lt;br /&gt;
&lt;br /&gt;
void UART_Task(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	uint8_t byte;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		xQueueReceive(UART_QueueHandle, &amp;amp;byte, portMAX_DELAY);&lt;br /&gt;
		HAL_UART_Transmit_IT(&amp;amp;huart1, &amp;amp;byte, sizeof(uint8_t));&lt;br /&gt;
		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {&lt;br /&gt;
	if (huart-&amp;gt;Instance != huart1.Instance) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	BaseType_t wokenTask = pdFALSE;&lt;br /&gt;
	vTaskNotifyGiveFromISR(UART_TaskHandle, &amp;amp;wokenTask);&lt;br /&gt;
	portYIELD_FROM_ISR(wokenTask);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void UART_Transmit(uint8_t byte) {&lt;br /&gt;
	xQueueSendToBack(UART_QueueHandle, &amp;amp;byte, portMAX_DELAY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void UART_Init() {&lt;br /&gt;
	xTaskCreate(UART_Task, &amp;quot;UART_Task&amp;quot;, 128, NULL, 5, &amp;amp;UART_TaskHandle);&lt;br /&gt;
	UART_QueueHandle = xQueueCreate(64, sizeof(uint8_t));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;sensors.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;sensors.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;adc.h&amp;quot;&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
#include &amp;quot;tim.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MAX_VOLTAGE 5.0&lt;br /&gt;
#define MAX_RESOLUTION 4096&lt;br /&gt;
&lt;br /&gt;
float temperatureSensor = 0.0;&lt;br /&gt;
float anemometerSensor = 0.0;&lt;br /&gt;
float windvaneSensor = 0.0;&lt;br /&gt;
int fetchingTemperature;&lt;br /&gt;
unsigned overflowCounter = 0;&lt;br /&gt;
int previousTicks = 0;&lt;br /&gt;
&lt;br /&gt;
TaskHandle_t Sensors_TaskHandle;&lt;br /&gt;
&lt;br /&gt;
void Sensors_Task(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	while (1) {&lt;br /&gt;
		fetchingTemperature = 1;&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);&lt;br /&gt;
		HAL_ADC_Start_IT(&amp;amp;hadc1);&lt;br /&gt;
		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);&lt;br /&gt;
&lt;br /&gt;
		fetchingTemperature = 0;&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);&lt;br /&gt;
		HAL_ADC_Start_IT(&amp;amp;hadc1);&lt;br /&gt;
		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);&lt;br /&gt;
&lt;br /&gt;
		vTaskDelay(pdMS_TO_TICKS(100));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float adcToWindvane(int adcValue) {&lt;br /&gt;
	switch (adcValue) {&lt;br /&gt;
	case 952:&lt;br /&gt;
		return 0.0;&lt;br /&gt;
	case 2471:&lt;br /&gt;
		return 22.5;&lt;br /&gt;
	case 2250:&lt;br /&gt;
		return 45.0;&lt;br /&gt;
	case 3760:&lt;br /&gt;
		return 67.5;&lt;br /&gt;
	case 3723:&lt;br /&gt;
		return 90.0;&lt;br /&gt;
	case 3831:&lt;br /&gt;
		return 112.5;&lt;br /&gt;
	case 3356:&lt;br /&gt;
		return 135.0;&lt;br /&gt;
	case 3589:&lt;br /&gt;
		return 157.5;&lt;br /&gt;
	case 2946:&lt;br /&gt;
		return 180.0;&lt;br /&gt;
	case 3116:&lt;br /&gt;
		return 202.5;&lt;br /&gt;
	case 1575:&lt;br /&gt;
		return 225.0;&lt;br /&gt;
	case 1698:&lt;br /&gt;
		return 247.5;&lt;br /&gt;
	case 315:&lt;br /&gt;
		return 270.0;&lt;br /&gt;
	case 786:&lt;br /&gt;
		return 292.5;&lt;br /&gt;
	case 547:&lt;br /&gt;
		return 315.0;&lt;br /&gt;
	case 1285:&lt;br /&gt;
		return 337.5;&lt;br /&gt;
	default:&lt;br /&gt;
		return 0.0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {&lt;br /&gt;
	if (hadc-&amp;gt;Instance != hadc1.Instance) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	uint32_t value = HAL_ADC_GetValue(hadc);&lt;br /&gt;
	if (fetchingTemperature) {&lt;br /&gt;
		temperatureSensor =&lt;br /&gt;
				((float) value) * MAX_VOLTAGE * 100 / MAX_RESOLUTION;&lt;br /&gt;
	} else {&lt;br /&gt;
		windvaneSensor = adcToWindvane(value);&lt;br /&gt;
	}&lt;br /&gt;
	xTaskNotifyGive(Sensors_TaskHandle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {&lt;br /&gt;
	if (htim-&amp;gt;Instance != htim1.Instance) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	float ticks = htim-&amp;gt;Instance-&amp;gt;CCR1 + overflowCounter * 65536&lt;br /&gt;
			- previousTicks;&lt;br /&gt;
	previousTicks = htim-&amp;gt;Instance-&amp;gt;CCR1;&lt;br /&gt;
	overflowCounter = 0;&lt;br /&gt;
	anemometerSensor = 8000000.0 / ticks * 2.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Sensors_Init() {&lt;br /&gt;
	HAL_TIM_Base_Start_IT(&amp;amp;htim1);&lt;br /&gt;
	HAL_TIM_IC_Start_IT(&amp;amp;htim1, TIM_CHANNEL_1);&lt;br /&gt;
	xTaskCreate(Sensors_Task, &amp;quot;Sensors_Task&amp;quot;, 128, NULL, 5,&lt;br /&gt;
			&amp;amp;Sensors_TaskHandle);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;exam.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;exam.h&amp;quot;&lt;br /&gt;
#include &amp;quot;lcd.h&amp;quot;&lt;br /&gt;
#include &amp;quot;uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;sensors.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timers.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void writeLCD(unsigned addr, const char *str) {&lt;br /&gt;
	LCD_Enqueue(LCD_INSTRUCTION, SET_DDRAM_ADDRESS_INSTRUCTION | addr);&lt;br /&gt;
	for (size_t i = 0; i &amp;lt; strlen(str); ++i) {&lt;br /&gt;
		LCD_Enqueue(LCD_DATA, str[i]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writeUART(char *str) {&lt;br /&gt;
	for (size_t i = 0; i &amp;lt; strlen(str); ++i) {&lt;br /&gt;
		UART_Transmit(str[i]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void intToStr(int num, char *str, int maxLen) {&lt;br /&gt;
	for (int i = 0; i &amp;lt; maxLen; ++i) {&lt;br /&gt;
		str[i] = &#039; &#039;;&lt;br /&gt;
	}&lt;br /&gt;
	int index = maxLen - 1;&lt;br /&gt;
	if (num == 0) {&lt;br /&gt;
		str[maxLen - 1] = &#039;0&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	while (num &amp;gt; 0 &amp;amp;&amp;amp; index &amp;gt;= 0) {&lt;br /&gt;
		str[index--] = &#039;0&#039; + (num % 10);&lt;br /&gt;
		num /= 10;&lt;br /&gt;
	}&lt;br /&gt;
	str[maxLen] = &#039;\0&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float prevTemperatureSensor;&lt;br /&gt;
float prevWindvaneSensor;&lt;br /&gt;
float prevAnemometerSensor;&lt;br /&gt;
&lt;br /&gt;
void examTask(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	// Ekvivalentne adrese: 0x80, 0xC0, 0x90&lt;br /&gt;
	// Kontroleru se ne mogu poslati adrese sa preko 7 bita&lt;br /&gt;
	// Napomena: redosled ispisa je ispravljen ovde, ali nije u projektu.&lt;br /&gt;
	writeLCD(0x10, &amp;quot;Temper: &amp;quot;);&lt;br /&gt;
	writeLCD(0x00, &amp;quot;Azimut: &amp;quot;);&lt;br /&gt;
	writeLCD(0x40, &amp;quot;Brzina: &amp;quot;);&lt;br /&gt;
	while (1) {&lt;br /&gt;
		if (((int) prevTemperatureSensor) != ((int) temperatureSensor)&lt;br /&gt;
				|| ((int) prevWindvaneSensor) != ((int) windvaneSensor)&lt;br /&gt;
				|| ((int) prevAnemometerSensor) != ((int) anemometerSensor)) {&lt;br /&gt;
			prevTemperatureSensor = temperatureSensor;&lt;br /&gt;
			prevWindvaneSensor = windvaneSensor;&lt;br /&gt;
			prevAnemometerSensor = anemometerSensor;&lt;br /&gt;
			char temper[4];&lt;br /&gt;
			char azimut[4];&lt;br /&gt;
			char brzina[4];&lt;br /&gt;
			intToStr((int) temperatureSensor, temper, 3);&lt;br /&gt;
			intToStr((int) windvaneSensor, azimut, 3);&lt;br /&gt;
			intToStr((int) anemometerSensor, brzina, 3);&lt;br /&gt;
			// Napomena: redosled ispisa je ispravljen ovde, ali nije u projektu.&lt;br /&gt;
			writeLCD(0x18, temper);&lt;br /&gt;
			writeLCD(0x08, azimut);&lt;br /&gt;
			writeLCD(0x48, brzina);&lt;br /&gt;
			writeUART(&amp;quot;\b\b\b\b\b\b\b\b\b\b\b&amp;quot;);&lt;br /&gt;
			writeUART(azimut);&lt;br /&gt;
			writeUART(&amp;quot;/&amp;quot;);&lt;br /&gt;
			writeUART(brzina);&lt;br /&gt;
			writeUART(&amp;quot;/&amp;quot;);&lt;br /&gt;
			writeUART(temper);&lt;br /&gt;
		}&lt;br /&gt;
		vTaskDelay(pdMS_TO_TICKS(200));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ledTimer(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	if (anemometerSensor &amp;lt; 50) {&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET);&lt;br /&gt;
	} else {&lt;br /&gt;
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_13);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void examInit() {&lt;br /&gt;
	LCD_Init();&lt;br /&gt;
	UART_Init();&lt;br /&gt;
	Sensors_Init();&lt;br /&gt;
	xTaskCreate(examTask, &amp;quot;examTask&amp;quot;, 128, NULL, 2, NULL);&lt;br /&gt;
	TimerHandle_t timer = xTimerCreate(&amp;quot;ledTimer&amp;quot;, pdMS_TO_TICKS(500), pdTRUE,&lt;br /&gt;
	NULL, ledTimer);&lt;br /&gt;
	xTimerStart(timer, portMAX_DELAY);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
Унутар &amp;lt;code&amp;gt;HAL_TIM_PeriodElapsedCallback&amp;lt;/code&amp;gt;, додат је блок кода:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
	/* USER CODE BEGIN Callback 1 */&lt;br /&gt;
	if (htim-&amp;gt;Instance == TIM1) {&lt;br /&gt;
		++overflowCounter;&lt;br /&gt;
	}&lt;br /&gt;
	/* USER CODE END Callback 1 */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Такође додати:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  /* USER CODE BEGIN Includes */&lt;br /&gt;
  #include &amp;quot;exam.h&amp;quot;&lt;br /&gt;
  /* USER CODE END Includes */&lt;br /&gt;
&lt;br /&gt;
  /* USER CODE BEGIN 2 */&lt;br /&gt;
  examInit();&lt;br /&gt;
  /* USER CODE END 2 */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Напомене ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Микропроцесорски системи]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%9A2_2022&amp;diff=7737</id>
		<title>Системски софтвер/К2 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%9A2_2022&amp;diff=7737"/>
		<updated>2024-08-27T16:58:27Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2022.&#039;&#039;&#039; одржан је 14. маја. Колоквијум је трајао 90 минута и радио се у вежбанкама. Оба задатка су вредела 10 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Дати код на асемблеру за &#039;&#039;amd64&#039;&#039; преводи се двопролазним асемблером. Резултат превођења је предмети програм по &#039;&#039;ELF&#039;&#039; формату. Приказати садржај:&lt;br /&gt;
# табеле симбола&lt;br /&gt;
# релокационих записа као и&lt;br /&gt;
# садржај секција.&lt;br /&gt;
Користити школски формат наведен у наставку:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ТАБЕЛА СИМБОЛА&lt;br /&gt;
|-&lt;br /&gt;
! Num !! Value !! Size !! Type !! Bind !! Ndx !! Name&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ РЕЛОКАЦИОНИ ЗАПИСИ&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Type !! Symbol !! Addend&lt;br /&gt;
|}&lt;br /&gt;
При решавању усвојити следеће (хексадецималне вредности унутар заграда након податка о величини инструкције јесу први бајтови инструкције који представљају њен операциони код):&lt;br /&gt;
* Инструкција &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt; користи &#039;&#039;PC&#039;&#039; релативно адресирање. Величина инструкције је шест бајтова (&amp;lt;code&amp;gt;0xff 0x15&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Инструкција &amp;lt;code&amp;gt;mov&amp;lt;/code&amp;gt; користи апсолутно адресирање. Величина инструкције је осам бајтова (&amp;lt;code&amp;gt;0x48 0x8b 0x04 0x25&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Инструкција &amp;lt;code&amp;gt;jz&amp;lt;/code&amp;gt; користи &#039;&#039;PC&#039;&#039; релативно адресирање. Величина инструкције је два бајта (&amp;lt;code&amp;gt;0x74&amp;lt;/code&amp;gt;) или шест бајтова (&amp;lt;code&amp;gt;0x0f 0x84&amp;lt;/code&amp;gt;) зависно од величине помераја.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.intel_syntax noprefix&lt;br /&gt;
.extern a&lt;br /&gt;
.global f&lt;br /&gt;
.equ f, b-c&lt;br /&gt;
&lt;br /&gt;
.text&lt;br /&gt;
    call a[rip]&lt;br /&gt;
e:  mov rax, c&lt;br /&gt;
    jz e&lt;br /&gt;
    jz c&lt;br /&gt;
d:  mov rax, b - f&lt;br /&gt;
    .long e&lt;br /&gt;
&lt;br /&gt;
.data&lt;br /&gt;
    .skip 6&lt;br /&gt;
c:  .long b + 0xe&lt;br /&gt;
b:&lt;br /&gt;
.end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &amp;lt;code&amp;gt;.symtab&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Num !! Value [hex] !! Size !! Type  !! Bind !! Ndx   !! Name&lt;br /&gt;
|-&lt;br /&gt;
| 0   || 0           || 0    || NOTYP || LOC  || UND   ||&lt;br /&gt;
|-&lt;br /&gt;
| 1   || 0           || 0    || SCTN  || LOC  || 1     || .text&lt;br /&gt;
|-&lt;br /&gt;
| 2   || 0           || 0    || SCTN  || LOC  || 2     || .data&lt;br /&gt;
|-&lt;br /&gt;
| 3   || 4           || 0    || NOTYP || GLOB || *ABS* || f&lt;br /&gt;
|-&lt;br /&gt;
| 4   || 0           || 0    || NOTYP || GLOB || UND   || a&lt;br /&gt;
|-&lt;br /&gt;
| 5   || A           || 0    || NOTYP || LOC  || 2     || b&lt;br /&gt;
|-&lt;br /&gt;
| 6   || 6           || 0    || NOTYP || LOC  || 2     || c&lt;br /&gt;
|-&lt;br /&gt;
| 7   || 16          || 0    || NOTYP || LOC  || 1     || d&lt;br /&gt;
|-&lt;br /&gt;
| 8   || 6           || 0    || NOTYP || LOC  || 1     || e&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &amp;lt;code&amp;gt;.rela.text&amp;lt;/code&amp;gt;&lt;br /&gt;
! Offset !! Type !! Symbol !! Addend&lt;br /&gt;
|-&lt;br /&gt;
| 2  || PC32 || a     || -4&lt;br /&gt;
|-&lt;br /&gt;
| A  || 32   || .data || 6&lt;br /&gt;
|-&lt;br /&gt;
| 12 || PC32 || .data || 2&lt;br /&gt;
|-&lt;br /&gt;
| 1A || 32   || .data || 6&lt;br /&gt;
|-&lt;br /&gt;
| 1E || 32   || .text || 6&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &amp;lt;code&amp;gt;.rela.data&amp;lt;/code&amp;gt;&lt;br /&gt;
! Offset !! Type !! Symbol !! Addend&lt;br /&gt;
|-&lt;br /&gt;
| 6  || 32   || .data || 18&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;&lt;br /&gt;
! Offset&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Content&lt;br /&gt;
! Instruction&lt;br /&gt;
|-&lt;br /&gt;
| 0000 || FF || 15 || 00 || 00 || 00 || 00 ||    ||    || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;call a[rip]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0006 || 48 || 8B || 04 || 25 || 00 || 00 || 00 || 00 || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov rax, c&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 000E || 74 || F6 ||    ||    ||    ||    ||    ||    || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;jz e&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0010 || 0F || 84 || 00 || 00 || 00 || 00 ||    ||    || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;jz c&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0016 || 48 || 8B || 04 || 25 || 00 || 00 || 00 || 00 || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;mov rax, b - f&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 001D || 00 || 00 || 00 || 00 ||    ||    ||    ||    || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;.long e&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &amp;lt;code&amp;gt;.data&amp;lt;/code&amp;gt;&lt;br /&gt;
! Offset&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot; | Content&lt;br /&gt;
! Instruction&lt;br /&gt;
|-&lt;br /&gt;
| 0000 || 00 || 00 || 00 || 00 || 00 || 00 ||    ||    || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;.skip 6&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0006 || 00 || 00 || 00 || 00 ||    ||    ||    ||    || &amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot; inline&amp;gt;.long b + 0xe&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Одредити вредност при обради од стране асемблера за хипотетичку машину (уколико вредност није позната написати знак питања) и индекс класификације за сваки израз у оквиру изворног асемблерског кода датог у наставку.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
        BEG&lt;br /&gt;
        USE LAB1&lt;br /&gt;
        ORG 0x64&lt;br /&gt;
        SCT DAT&lt;br /&gt;
LAB2    DC LAB1&lt;br /&gt;
        DC 7 + LAB2&lt;br /&gt;
        SCT TXT&lt;br /&gt;
LAB3    LDA LAB2 - 1&lt;br /&gt;
        ADX * - LAB3&lt;br /&gt;
        OTI&lt;br /&gt;
        HLT&lt;br /&gt;
        END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Наредба&lt;br /&gt;
! Индекс класификације&lt;br /&gt;
! Вредност&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DC LAB1&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1.unique()&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DC 7 + LAB2&amp;lt;/code&amp;gt;&lt;br /&gt;
| 0 + 1.DAT = 1.DAT&lt;br /&gt;
| 0x6b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LDA LAB2 - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1.DAT - 0 = 1.DAT&lt;br /&gt;
| 0x63&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADX * - LAB3&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1.TXT - 1.TXT = 0&lt;br /&gt;
| 0x2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Системски софтвер]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2022&amp;diff=7736</id>
		<title>Системски софтвер/Септембар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2022&amp;diff=7736"/>
		<updated>2024-08-17T17:56:23Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит из септембарског рока 2022.&#039;&#039;&#039; одржан је 14.09. &lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
: Исти задатак се нашао на [[Системски софтвер/Јун 2022#1. задатак|јунском року 2022. године]]&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се процес асемблирања датог ивзорног асемблерског кода за &#039;&#039;amd64&#039;&#039; архитектуру. Резултат асемблирања је предметни програм по &#039;&#039;ELF&#039;&#039; формату. Приказати садржај (1) табеле симбола и (2) релокационих записа &amp;lt;u&amp;gt;строго поштујући школски формат и обавезно у складу са задатом нумерацијом симбола&amp;lt;/u&amp;gt;.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
.intel_syntax noprefix&lt;br /&gt;
.section .text&lt;br /&gt;
.global min, la1&lt;br /&gt;
min: enter 0, 0          # 0x00&lt;br /&gt;
     mov rbx, la1        # 0x04&lt;br /&gt;
     cmp rbx, [rbp]+0x12 # 0x0c&lt;br /&gt;
     call var[rip]       # 0x10&lt;br /&gt;
     jle la1             # 0x16&lt;br /&gt;
     mov rax, [rbp]+0x12 # 0x18&lt;br /&gt;
     jmp la2             # 0x1c&lt;br /&gt;
la1: mov rax, rbx        # 0x1e&lt;br /&gt;
la2: leave               # 0x21&lt;br /&gt;
     ret                 # 0x22&lt;br /&gt;
&lt;br /&gt;
.data&lt;br /&gt;
.global var&lt;br /&gt;
.type var, @object&lt;br /&gt;
var:&lt;br /&gt;
.quad la1, la2-4&lt;br /&gt;
.end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Напомена: хексадецимални бројеви наведени у коментару изворног асемблерског кода представљају померај до почетка инструкције у том реду гледано од почетка секције којој инструкција припада. Такође, усвојити претпоставку да је величина операционог кода:&lt;br /&gt;
* 2B за инструкцију &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt; за &#039;&#039;PC&#039;&#039; релативно адресирање,&lt;br /&gt;
* 4B за инструкцију &amp;lt;code&amp;gt;mov&amp;lt;/code&amp;gt; за апсолутно адресирање и&lt;br /&gt;
* 1B за инструкције &amp;lt;code&amp;gt;jle&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; за &#039;&#039;PC&#039;&#039; релативно адресирање.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Видети [[Системски софтвер/Јун 2022#1. задатак|овде]].&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се макро процесор са угњежденим макро дефиницијама, без угњеждених макро експанзија.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Шта је резултат макро експанзије задатог текста?&lt;br /&gt;
# Приказати операције над стеком параматера према редоследу њиховог извођења користећи нотације &#039;&#039;PUSH(...)&#039;&#039; и &#039;&#039;POP(...)&#039;&#039; при чему уместо три тачкице треба навести листу вредности које се смештају или скидају са стека.&lt;br /&gt;
# Приказати операције над стеком аргумената према редоследу њиховог извођења користећи нотације &#039;&#039;PUSH(...)&#039;&#039; и &#039;&#039;POP(...)&#039;&#039; при чему уместо три тачкице треба навести листу вредности које се смештају или скидају са стека.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 MCDEFN&lt;br /&gt;
 M1 A, B, C D&lt;br /&gt;
 M2 A, B, C&lt;br /&gt;
 MCDEFN&lt;br /&gt;
 M2 C, D, F&lt;br /&gt;
 A, B, C, D, E&lt;br /&gt;
 MCEND&lt;br /&gt;
 M2 C, D, F&lt;br /&gt;
 MCEND&lt;br /&gt;
 M2 1, 2, 3&lt;br /&gt;
 M1 4, 5, 6, 7&lt;br /&gt;
 M1 4, 5, 6, 7&lt;br /&gt;
 M2 1, 2, 3&lt;br /&gt;
=== Решење ===&lt;br /&gt;
a)&lt;br /&gt;
&lt;br /&gt;
 M2 1, 2, 3&lt;br /&gt;
 M2 4, 5, 6&lt;br /&gt;
 M2 6, 7, F&lt;br /&gt;
 M2 4, 5, 6&lt;br /&gt;
 M2 6, 7, F&lt;br /&gt;
 4, 5, 1, 2, E&lt;br /&gt;
&lt;br /&gt;
b)&lt;br /&gt;
&lt;br /&gt;
 PUSH(((1,0),A), ((1,1),B), ((1,2),C), ((1,3),D))&lt;br /&gt;
 PUSH(((2,0),C), ((2,1),D), ((2,2),F))&lt;br /&gt;
 POP(((2,0),C), ((2,1),D), ((2,2),F))&lt;br /&gt;
 POP(((1,0),A), ((1,1),B), ((1,2),C), ((1,3),D))&lt;br /&gt;
&lt;br /&gt;
c)&lt;br /&gt;
&lt;br /&gt;
 PUSH((0,4), (1,5), (2,6), (3,7))&lt;br /&gt;
 POP((0,4), (1,5), (2,6), (3,7))&lt;br /&gt;
 PUSH((0,4), (1,5), (2,6), (3,7))&lt;br /&gt;
 POP((0,4), (1,5), (2,6), (3,7))&lt;br /&gt;
 PUSH((0,1), (1,2), (2,3))&lt;br /&gt;
 POP((0,1), (1,2), (2,3))&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматрају се два објектна програма &amp;lt;code&amp;gt;levi.o&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;desni.o&amp;lt;/code&amp;gt; добијена помоћу &#039;&#039;GNU&#039;&#039; асемблера.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
 #shdr&lt;br /&gt;
 Num  Address Size  Type     Flags  Name&lt;br /&gt;
   1: 0000000 0052  PROGBITS    AX  .text&lt;br /&gt;
   3: 0000000 0000  PROGBITS    WA  .data&lt;br /&gt;
   4: 0000000 0012  NOBITS      WA  .bss&lt;br /&gt;
 #.symtab&lt;br /&gt;
 Num  Value   Size  Type  Bind Ndx  Name&lt;br /&gt;
   0: 0000000 0000  NOTYP LOC  UND&lt;br /&gt;
   1: 0000000 0000  SCTN  LOC    1  .text&lt;br /&gt;
   2: 0000000 0000  SCTN  LOC    3  .data&lt;br /&gt;
   3: 0000000 0000  SCTN  LOC    4  .bss&lt;br /&gt;
   4: 0000013 0000  FUNC  GLOB   1  a&lt;br /&gt;
   5: 0000010 0000  NOTYP GLOB   4  d&lt;br /&gt;
   6: 0000000 0000  NOTYP GLOB UND  c&lt;br /&gt;
 #.rela.text&lt;br /&gt;
 Offset  Type             Symbol       Addend&lt;br /&gt;
 0000004 R_X86_64_32S     4 (a)             0&lt;br /&gt;
 000000b R_X86_64_PC32    6 (c)            -4&lt;br /&gt;
|| &lt;br /&gt;
 #shdr&lt;br /&gt;
 Num  Address Size  Type     Flags  Name&lt;br /&gt;
   1: 0000000 000a  PROGBITS    AX  .text&lt;br /&gt;
   3: 0000000 0008  PROGBITS    WA  .data&lt;br /&gt;
   5: 0000000 0016  NOBITS      WA  .bss&lt;br /&gt;
 #.symtab&lt;br /&gt;
 Num  Value   Size  Type  Bind Ndx  Name&lt;br /&gt;
   0: 0000000 0000  NOTYP LOC  UND&lt;br /&gt;
   1: 0000000 0000  SCTN  LOC    1  .text&lt;br /&gt;
   2: 0000000 0000  SCTN  LOC    3  .data&lt;br /&gt;
   3: 0000000 0000  SCTN  LOC    5  .bss&lt;br /&gt;
   4: 0000004 0000  NOTYP LOC    3  b&lt;br /&gt;
   5: 0000008 0000  OBJCT GLOB   5  c&lt;br /&gt;
   6: 0000000 0000  NOTYP GLOB UND  a&lt;br /&gt;
 #.rela.text&lt;br /&gt;
 Offset  Type             Symbol       Addend&lt;br /&gt;
 0000003 R_X86_64_PC32    6 (a)            -4&lt;br /&gt;
 #.rela.data&lt;br /&gt;
 Offset  Type             Symbol       Addend&lt;br /&gt;
 0000002 R_X86_64_32      3 (.bss)          0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Приказати излаз линкера &amp;lt;code&amp;gt;izlaz.o&amp;lt;/code&amp;gt; тако да буде испоштовано све што је наведено у наставку:&lt;br /&gt;
* &amp;lt;u&amp;gt;строго поштујући школски формат и обавезно са нумерацијом у табели симбола према следећем редоследу&amp;lt;/u&amp;gt;: &amp;lt;code&amp;gt;UND, .text, .data, .bss, b, c, d, a &amp;lt;/code&amp;gt;&lt;br /&gt;
* повезивање се иницира следећом командом &amp;lt;code&amp;gt;ld --relocatable -o izlaz.o -T script.ld levi.o desni.o&amp;lt;/code&amp;gt;&lt;br /&gt;
* линкерска скрипта &amp;lt;code&amp;gt;script.ld&amp;lt;/code&amp;gt; има следећи садржај: &lt;br /&gt;
 SECTIONS&lt;br /&gt;
 {&lt;br /&gt;
    .text : { *(.text) }&lt;br /&gt;
    .data : { *(.data) }&lt;br /&gt;
    .bss : { *.(bss) }&lt;br /&gt;
 }&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
 #shdr&lt;br /&gt;
 Num  Address Size  Type     Flags  Name&lt;br /&gt;
   1: 0000000 005c  PROGBITS    AX  .text&lt;br /&gt;
   3: 0000000 0008  PROGBITS    WA  .data&lt;br /&gt;
   4: 0000000 0028  NOBITS      WA  .bss&lt;br /&gt;
 #.symtab&lt;br /&gt;
 Num  Value   Size  Type  Bind Ndx  Name&lt;br /&gt;
   0: 0000000 0000  NOTYP LOC  UND&lt;br /&gt;
   1: 0000000 0000  SCTN  LOC    1  .text&lt;br /&gt;
   2: 0000000 0000  SCTN  LOC    3  .data&lt;br /&gt;
   3: 0000000 0000  SCTN  LOC    4  .bss&lt;br /&gt;
   4: 0000004 0000  NOTYP LOC    3  b&lt;br /&gt;
   5: 000001a 0000  OBJCT GLOB   4  c&lt;br /&gt;
   6: 0000010 0000  NOTYP GLOB   4  d&lt;br /&gt;
   7: 0000013 0000  FUNC GLOB    1  a&lt;br /&gt;
 #.rela.text&lt;br /&gt;
 Offset  Type             Symbol       Addend&lt;br /&gt;
 0000004 R_X86_64_32S     7 (a)             0&lt;br /&gt;
 000000b R_X86_64_PC32    5 (c)            -4&lt;br /&gt;
 0000055 R_X86_64_PC32    7 (a)            -4&lt;br /&gt;
 #.rela.data&lt;br /&gt;
 Offset  Type             Symbol       Addend&lt;br /&gt;
 0000002 R_X86_64_32      3 (.bss)         12&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
: Исти задатак се нашао на [[Системски софтвер/Јун 2022#4. задатак|јунском року 2022. године]]&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се &#039;&#039;JIT&#039;&#039; емулатор и емулирање следећег програма.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Означити све блокове који ће у току рада емулатора бити преведени. За сваки преведени блок навести јединствену идентификацију у облику &amp;lt;code&amp;gt;&#039;&#039;&#039;B&#039;&#039;&#039;&#039;&#039;&amp;amp;lt;n&amp;amp;gt;(&amp;amp;lt;x&amp;amp;gt;-&amp;amp;lt;y&amp;amp;gt;)&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; је &amp;lt;u&amp;gt;редни број блока у погледу тренутка његовог превођења при чему нумерација почиње од броја један&amp;lt;/u&amp;gt;, &amp;amp;lt;x&amp;amp;gt; је редни број прве а &amp;amp;lt;y&amp;amp;gt; редни број последње линије изворног кода блока).&lt;br /&gt;
# Навести секвенцу извршавања. У секвенци извршавања могу се нађи само &amp;lt;code&amp;gt;GP&amp;lt;/code&amp;gt; (сваки пут када се емулатор врати у главну петљу), &amp;lt;code&amp;gt;BH&amp;lt;/code&amp;gt; (сваки пут када се позове функција која помаже у разрешавању скокова) и &amp;lt;code&amp;gt;&#039;&#039;&#039;B&#039;&#039;&#039;&#039;&#039;&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; (сваки пут када се изврши дати блок у складу са ознакама из претходне тачке).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
      BEG       ; line  1&lt;br /&gt;
      LDI 2     ; line  2   ( PZ) A &amp;lt;= &amp;lt;V&amp;gt;&lt;br /&gt;
  L1  SUB B     ; line  3   (CPZ) A &amp;lt;= A - mem[&amp;lt;V&amp;gt;]&lt;br /&gt;
  L2  ADD C     ; line  4   (CPZ) A &amp;lt;= A + mem[&amp;lt;V&amp;gt;]&lt;br /&gt;
      BNG L2    ; line  5         if (!flags[P]) PC &amp;lt;= &amp;lt;V&amp;gt;&lt;br /&gt;
      BZE L3    ; line  6         if ( flags[Z]) PC &amp;lt;= &amp;lt;V&amp;gt;&lt;br /&gt;
      SBI 2     ; line  7   (CPZ) A &amp;lt;= A - &amp;lt;V&amp;gt;&lt;br /&gt;
      BNZ L1    ; line  8         if (!flags[Z]) PC &amp;lt;= &amp;lt;V&amp;gt;&lt;br /&gt;
  L3  HLT       ; line  9         stop execution&lt;br /&gt;
  B   DC 9      ; line 10&lt;br /&gt;
  C   DC 2      ; line 11&lt;br /&gt;
      END       ; line 12&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Видети [[Системски софтвер/Јун 2022#4. задатак|овде]].&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Системски софтвер]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2022&amp;diff=7735</id>
		<title>Системски софтвер/Август 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80/%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2022&amp;diff=7735"/>
		<updated>2024-08-13T15:07:04Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у августовском року 2022. године&#039;&#039;&#039; одржан је 24. августа. Сваки задатак вреди укупно 10 поена. Испит траје 2 сата.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Одредити вредност при обради од стране асемблера за хипотетичку машину (уколико вредност није позната написати знак питања) и индекс класификације за сваки израз у оквиру изворног асемблерског кода датог у наставку.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
        BEG&lt;br /&gt;
        USE LAB1&lt;br /&gt;
        ORG 0x60&lt;br /&gt;
        SCT DAT&lt;br /&gt;
LAB2    DC LAB1&lt;br /&gt;
        DC 7 + LAB2&lt;br /&gt;
        SCT TXT&lt;br /&gt;
LAB3    LDA LAB2 - 1&lt;br /&gt;
        ADX * - LAB3&lt;br /&gt;
        END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Наредба&lt;br /&gt;
! Индекс класификације&lt;br /&gt;
! Вредност&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DC LAB1&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1.unique()&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DC 7 + LAB2&amp;lt;/code&amp;gt;&lt;br /&gt;
| 0 + 1.DAT = 1.DAT&lt;br /&gt;
| 0x67&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LDA LAB2 - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1.DAT - 0 = 1.DAT&lt;br /&gt;
| 0x5f&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADX * - LAB3&amp;lt;/code&amp;gt;&lt;br /&gt;
| 1.TXT - 1.TXT = 0&lt;br /&gt;
| 0x2&lt;br /&gt;
|}&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Навести шта је резултат експанзије следећег кода од стране C претпроцесора и објаснити како је добијен.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define M1(x1) M2(x1)&lt;br /&gt;
#define M2(x1) M3(x1,A)&lt;br /&gt;
#define M3(x1,x2) x2 M3(x1,x2) M1(x1)&lt;br /&gt;
M3(M1(C), B)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Појављивање неког макроа у својој дефиницији се не сматра макропозивом. Видети [https://gcc.gnu.org/onlinedocs/cpp/Self-Referential-Macros.html 3.10.5 Self-Referential Macros] из документације C претпроцесора. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
B M3(A M3(C, A) M1(C), B) M3(A M3(C,A) M1(C), A)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
За неки емулатор потребно је написати функцију &amp;lt;code&amp;gt;void write(unsigned addr, unsigned data)&amp;lt;/code&amp;gt; за упис у меморију. Адресни простор је величине 4 GB, а адресабилна јединица је бајт. Сматрати да је приступ речи увек поравнат на адресу дељиву са 4.&lt;br /&gt;
На располагању су функције &amp;lt;code&amp;gt;unsigned rphy(unsigned addr)&amp;lt;/code&amp;gt;, која дохвата реч са дате физичке адресе и &amp;lt;code&amp;gt;void wphy(unsigned addr, unsigned data)&amp;lt;/code&amp;gt;, која уписује задату реч на задату физичку адресу.&lt;br /&gt;
Емулирана машина поседује виртуелну меморију организовану странично. Величина странице је 16 KB. Регистар &#039;&#039;PMTP&#039;&#039; (који се емулира истоименом глобалном променљивом) садржи адресу табеле за пресликавање страница.&lt;br /&gt;
Сваки улаз у табели је 32 бита, при чему су највиша два бита &#039;&#039;V&#039;&#039; и &#039;&#039;D&#039;&#039; битови.&lt;br /&gt;
Уколико је &#039;&#039;V&#039;&#039; бит једнак 0, у најнижих 30 битова је записана адреса на диску, док је у случају да је бит &#039;&#039;V&#039;&#039; једнак 1, у најнижим битовима улаза записан редни број блока у који је смештена страница. У случају да страница није у меморији, учитава се у меморију позивом функције &amp;lt;code&amp;gt;void load(unsigned hddaddr)&amp;lt;/code&amp;gt;, која у позадини генерише &#039;&#039;page fault&#039;&#039; и блокира позивајућу нит док страница не буде учитана са диска. Једини аргумент функције представља адресу којој се приступа.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Адресни простор је 4 GB, што значи да је адреса 32-битна.&lt;br /&gt;
Ако је величина странице 16 KB, најнижих 14 бита виртуелне адресе је померај у страници, а виших 18 је број улаза. Пошто је свака реч поравната са 4, улаз у табелу не мора да садржи два најнижа бита јер су она увек 0. Улаз у табелу пресликавања страница и виртуеална адреса изгледају овако:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;VA(32): PageNumber(18), Offset(14)&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PMT(32): V(1), D(1), PhyAddress/BlockNumber(30)&#039;&#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void write(unsigned addr, unsigned data) {&lt;br /&gt;
    unsigned offset = addr &amp;amp; 0x3FFF;&lt;br /&gt;
    unsigned blk_no = addr &amp;gt;&amp;gt; 14;&lt;br /&gt;
    // Проверавамо присутност блока у меморији&lt;br /&gt;
    if (PMTP[blk_no] &amp;amp; 0x8000_0000) {&lt;br /&gt;
        // Блок се налази у меморији&lt;br /&gt;
        unsigned phy_addr = PMT[blk_no] &amp;lt;&amp;lt; 2;&lt;br /&gt;
        wphy(phy_addr + offset, data);&lt;br /&gt;
&lt;br /&gt;
        // Постављање dirty бита није било стриктно тражено на испиту&lt;br /&gt;
        PMTP[blk_no] |= 0x4000_0000;&lt;br /&gt;
    } else {&lt;br /&gt;
        // Блок се мора довући са диска&lt;br /&gt;
        unsigned block_no = PMT[blk_no] &amp;amp; 0x3FFF_FFFF;&lt;br /&gt;
        load(block_no);&lt;br /&gt;
        // Рекурзивни позив упада у горњу грану if-а.&lt;br /&gt;
        write(addr, data);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се процес покренут над програмом &#039;&#039;run&#039;&#039; добијеним повезивањем са дељеном библиотеком &#039;&#039;libfoo.so&#039;&#039;. Дељена библиотека &#039;&#039;libfoo.so&#039;&#039; садржи функције &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt; чије су адресе унутар &#039;&#039;libfoo.so&#039;&#039; &amp;lt;code&amp;gt;0x1218&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;0x12C4&amp;lt;/code&amp;gt; респективно, а сама дељена библиотека &#039;&#039;libfoo.so&#039;&#039; мапирана је почев од адресе &amp;lt;code&amp;gt;0x4FFF0000&amp;lt;/code&amp;gt; унутар адресног простора посматраног процеса.&lt;br /&gt;
&lt;br /&gt;
Програм &#039;&#039;run&#039;&#039;, који представња &#039;&#039;PIC shared object ELF&#039;&#039; датотеку, мапиран је почев од адресе &amp;lt;code&amp;gt;0x7EEE0000&amp;lt;/code&amp;gt; унутар адресног простора посматраног процеса. Програм &#039;&#039;run&#039;&#039; од дељених библиотека користи искључиво &#039;&#039;libfoo.so&#039;&#039; и позива њене две функције  &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt; користећи лењо повезивање. Уколико је познат део &amp;lt;code&amp;gt;.plt&amp;lt;/code&amp;gt; секције програма &#039;&#039;run&#039;&#039;, наведен у наставку, потребно је урадити следеће.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;[2]&#039;&#039;&#039; Одредити на којој адреси се налази &amp;lt;code&amp;gt;.got.plt&amp;lt;/code&amp;gt; секција програма &#039;&#039;run&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;[4]&#039;&#039;&#039; Попунити &amp;lt;code&amp;gt;.plt&amp;lt;/code&amp;gt; секцију (заменити свако појављивање знакова питања одговарајућом вредношћу) уколико је познато да се улаз за функцију &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; унутар &amp;lt;code&amp;gt;.plt&amp;lt;/code&amp;gt; секције налази испред улаза за функцију &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt; унутар &amp;lt;code&amp;gt;.plt&amp;lt;/code&amp;gt; секције.&lt;br /&gt;
# &#039;&#039;&#039;[2]&#039;&#039;&#039; Навести вредности које се налазе у улазима &amp;lt;code&amp;gt;.got.plt&amp;lt;/code&amp;gt; секције, који одговарају симболима &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt;, у тренутку пре него што је посматрани процес извршио први позив било које функције из дељене библиотеке &#039;&#039;libfoo.so&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;[2]&#039;&#039;&#039; Навести вредности које се налазе у улазима &amp;lt;code&amp;gt;.got.plt&amp;lt;/code&amp;gt; секције, који одговарају симболима &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt;, у тренутку након што је посматрани процес извршио позив функције &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt;, а пре позива функције &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Disassembly of section .plt:&lt;br /&gt;
 0000000000001060 &amp;lt;.plt&amp;gt;:&lt;br /&gt;
   1060: ff 35 a2 42 00 00                push QWORD PTR [rip + 0x42a2]&lt;br /&gt;
   1066: ff 25 a4 42 00 00                jmp QWORD PTR [rip + 0x42a4]&lt;br /&gt;
   106c: 0f 1f 40 00                      nop DWORD PTR [rax + 0x00]&lt;br /&gt;
   1070: ff 25 ?? ?? ?? ??                jmp QWORD PTR [rip + ??]&lt;br /&gt;
   1076: 68 00 00 00 00                   push 0x00&lt;br /&gt;
   107b: e9 ?? ?? ?? ??                   jmp ??&lt;br /&gt;
   1080: ff 25 ?? ?? ?? ??                jmp QWORD PTR [rip + ??]&lt;br /&gt;
   1086: 68 01 00 00 00                   push 0x01&lt;br /&gt;
   108b: e9 ?? ?? ?? ??                   jmp ??&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Адресу &amp;lt;code&amp;gt;.got.plt&amp;lt;/code&amp;gt; секције може се наћи разрешавањем помераја у нултом улазу &amp;lt;code&amp;gt;.plt&amp;lt;/code&amp;gt; секције. Инструкција &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; на 0x1060 као операнд има први улаз у &#039;&#039;GOT&#039;&#039; табели. Величина улаза у &#039;&#039;GOT&#039;&#039; табели је 8 бајта. Одатле:&lt;br /&gt;
 GOT[1] = rip + 0x42a2&lt;br /&gt;
 GOT[1] = 0x1066 + 0x42a2&lt;br /&gt;
 GOT[1] = 0x5308&lt;br /&gt;
 GOT[0] = GOT[1] - 1 * 8 = 0x5308 - 8 = 0x5300&lt;br /&gt;
Исти резултат се добија коришћењем операнда &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; инструкције на 0x1066, која указује на други улаз:&lt;br /&gt;
 GOT[2] = rip + 0x42a4&lt;br /&gt;
 GOT[2] = 0x106c + 0x42a4&lt;br /&gt;
 GOT[2] = 0x5310&lt;br /&gt;
 GOT[0] = GOT[2] - 2 * 8 = 0x5310 - 0x10 = 0x5300&lt;br /&gt;
&lt;br /&gt;
Структура &#039;&#039;GOT&#039;&#039; табеле: &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Адреса&lt;br /&gt;
! Улаз&lt;br /&gt;
! Садржај&lt;br /&gt;
|-&lt;br /&gt;
| 0x5300&amp;lt;br /&amp;gt;&lt;br /&gt;
| 0&lt;br /&gt;
| .dynamic&lt;br /&gt;
|-&lt;br /&gt;
| 0x5308&lt;br /&gt;
| 1&lt;br /&gt;
| .rel.dyn&lt;br /&gt;
|-&lt;br /&gt;
| 0x5310&lt;br /&gt;
| 2&lt;br /&gt;
| динамички линкер&lt;br /&gt;
|-&lt;br /&gt;
| 0x5318&lt;br /&gt;
| 3&lt;br /&gt;
| bar()&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0x5320&lt;br /&gt;
| 4&lt;br /&gt;
| baz()&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Први улаз &#039;&#039;PLT&#039;&#039;-а припада функцији &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt;. Инструкција &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; на 0x1070 треба да скаче на трећи улаз у &#039;&#039;GOT&#039;&#039;, а &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; на 0x107b на нулти улаз &#039;&#039;PLT&#039;&#039;-а:&lt;br /&gt;
 0x5318 - 0x1076 = 0x42a2&lt;br /&gt;
 0x1060 - 0x1080 = 0xffffffe0&lt;br /&gt;
Други улаз &#039;&#039;PLT&#039;&#039;-а припада функцији &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt;. Инструкција &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; на 0x1080 треба да скаче на четврти улаз у &#039;&#039;GOT&#039;&#039;, а &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; на 0x108b на нулти улаз &#039;&#039;PLT&#039;&#039;-а:&lt;br /&gt;
 0x5320 - 0x1086 = 0x429a&lt;br /&gt;
 0x1060 - 0x1090 = 0xffffffd0&lt;br /&gt;
&lt;br /&gt;
Садржај &amp;lt;code&amp;gt;.plt&amp;lt;/code&amp;gt; секције:&lt;br /&gt;
 Disassembly of section .plt:&lt;br /&gt;
 0000000000001060 &amp;lt;.plt&amp;gt;:&lt;br /&gt;
   1060: ff 35 a2 42 00 00                push QWORD PTR [rip + 0x42a2]&lt;br /&gt;
   1066: ff 25 a4 42 00 00                jmp QWORD PTR [rip + 0x42a4]&lt;br /&gt;
   106c: 0f 1f 40 00                      nop DWORD PTR [rax + 0x00]&lt;br /&gt;
   1070: ff 25 a2 42 00 00                jmp QWORD PTR [rip + 0x42a2]&lt;br /&gt;
   1076: 68 00 00 00 00                   push 0x00&lt;br /&gt;
   107b: e9 e0 ff ff ff                   jmp 1060&lt;br /&gt;
   1080: ff 25 9a 42 00 00                jmp QWORD PTR [rip + 0x429a]&lt;br /&gt;
   1086: 68 01 00 00 00                   push 0x01&lt;br /&gt;
   108b: e9 d0 ff ff ff                   jmp 1060&lt;br /&gt;
&lt;br /&gt;
Садржај &#039;&#039;GOT&#039;&#039; табеле пре позивања било које функције из &#039;&#039;libfoo.so&#039;&#039;:&lt;br /&gt;
   5318: 76 10 ee 7e 00 00 00 00&lt;br /&gt;
   5320: 86 10 ee 7e 00 00 00 00&lt;br /&gt;
&lt;br /&gt;
Садржај &#039;&#039;GOT&#039;&#039; табеле након што је посматрани процес извршио позив функције &amp;lt;code&amp;gt;bar&amp;lt;/code&amp;gt;, а пре позива функције &amp;lt;code&amp;gt;baz&amp;lt;/code&amp;gt;:&lt;br /&gt;
   5318: 18 12 ff 4f 00 00 00 00&lt;br /&gt;
   5320: 86 10 ee 7e 00 00 00 00&lt;br /&gt;
   &lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Системски софтвер]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2022&amp;diff=7720</id>
		<title>Заштита података/Јун 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2022&amp;diff=7720"/>
		<updated>2024-07-09T16:45:39Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* 5. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u junskom ispitnom roku 2022. godine&#039;&#039;&#039; održan je 7. juna.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Ana je kreirala poruku &#039;&#039;M&#039;&#039; koju je poslala Branku dva puta.&lt;br /&gt;
&lt;br /&gt;
Uz poruku je oba puta poslala El Gamalov digitalni potpis poruke &#039;&#039;M&#039;&#039;. Branko je oba puta dobio poruku i digitalne potpise. Prvi put je vrednost digitalnog potpisa koju je dobio Branko bila: &amp;lt;math&amp;gt;(S_1=110, S_2=791)&amp;lt;/math&amp;gt;, a drugi put &amp;lt;math&amp;gt;(S_1=1760, S_2=640)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Branko je izračunao hash dobijene poruke &#039;&#039;M&#039;&#039; i oba puta dobio vrednost &amp;lt;math&amp;gt;m=3769&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Javni elementi digitalnog potpisa su broj &amp;lt;math&amp;gt;q=5003&amp;lt;/math&amp;gt; i njegov primitivni koren &amp;lt;math&amp;gt;\alpha=4999&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Anin javni ključ &amp;lt;math&amp;gt;Y_a&amp;lt;/math&amp;gt; je 1682. Provera El Gamalovog digitalnog potpisa se obavlja korišćenjem sledećih formula:&lt;br /&gt;
* &amp;lt;math&amp;gt;V_1=\alpha^m \bmod q&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;V_2=Y_a^{S_1}S_1^{S_2}\bmod q&amp;lt;/math&amp;gt;&lt;br /&gt;
Odrediti:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;(3 poena)&#039;&#039;&#039; Vrednost &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; za prvi digitalni potpis: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;4890&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;(1 poen)&#039;&#039;&#039; Vrednost &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; za drugi digitalni potpis: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;2419&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;(4 poena)&#039;&#039;&#039; Na osnovu vrednosti V1 i izračunatih vrednosti u tačkama a) i b), Branko može da zaključi:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
* Oba digitalna potpisa su ispravna, poruka &#039;&#039;M&#039;&#039; u oba slučaja nije menjana tokom prenosa i oba puta ju je potpisala Ana&lt;br /&gt;
* Ni jedan digitalni potpis nije ispravan i ne može da se utvrdi da je Ana potpisala tu poruku i da li je menjana tokom prenosa.&lt;br /&gt;
* Samo drugi digitalni potpis je ispravan i samo druga poruka nije menjana tokom prenosa i nju je potpisala Ana&lt;br /&gt;
* &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Samo prvi digitalni potpis je ispravan i samo prva poruka nije menjana tokom prenosa i nju je potpisala Ana&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Na slici je dat digitalni sertifikat (sa skraćenim prikazom RSA modula i digitalnog potpisa zbog prostora).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Version:       3 (0x02)&lt;br /&gt;
Serial number: 20045315772003125868899357870856421858 (0x0f14965f202069994fd5c7ac788941e2)&lt;br /&gt;
Algorithm ID:  SHA256withRSA&lt;br /&gt;
Validity&lt;br /&gt;
  Not Before:  21/07/2020 23:00:00 (dd-mm-yyyy hh:mm:ss) (200721230000Z)&lt;br /&gt;
  Not After:   08/10/2024 07:00:00 (dd-mm-yyyy hh:mm:ss) (241008070000Z)&lt;br /&gt;
Issuer&lt;br /&gt;
  C  = IE&lt;br /&gt;
  O  = Baltimore&lt;br /&gt;
  OU = CyberTrust&lt;br /&gt;
  CN = Baltimore CyberTrust Root&lt;br /&gt;
Subject&lt;br /&gt;
  C  = US&lt;br /&gt;
  O  = Microsoft Corporation&lt;br /&gt;
  CN = Microsoft RSA TLS CA 01&lt;br /&gt;
Public Key&lt;br /&gt;
  Algorithm:   RSA&lt;br /&gt;
  Length:      4096 bits&lt;br /&gt;
  Modulus:     aa:62:77:cf:9a:63:b2:06:84:f3:90:36:f4:99:f3:14: &lt;br /&gt;
...&lt;br /&gt;
               1c:dd:30:8b:Od:4a:14:60:f9:d5:64:4f:43:44:a1:ed&lt;br /&gt;
  Exponent:    65537 (0x10001)&lt;br /&gt;
Certificate Signature&lt;br /&gt;
  Algorithm:   SHA256withRSA&lt;br /&gt;
  Signature:   9f:2b:be:92:67:5b:da:7b:Ba:ad:e8:ff:9d:4d:05:0e:&lt;br /&gt;
...&lt;br /&gt;
               47:45:5e:79:54:c5:f9:dd:eb:fa:3f:78:51:75:d2:5b&lt;br /&gt;
&lt;br /&gt;
Extensions&lt;br /&gt;
  subjectKeyIdentifier :&lt;br /&gt;
    b5760c3011cec792424d4cc75c2cc8a90ce80b64&lt;br /&gt;
  authorityKeyldentifier :&lt;br /&gt;
    kid=e59d5930824758ccacfa085436867b3ab5044df0&lt;br /&gt;
  keyUsage CRITICAL:&lt;br /&gt;
    digitalSignature,keyCertSign,cRLSign&lt;br /&gt;
  extKeyUsage :&lt;br /&gt;
    serverAuth, clientAuth&lt;br /&gt;
  basicConstraints CRITICAL:&lt;br /&gt;
    cA=true, pathLen=0&lt;br /&gt;
  authorityInfoAccess :&lt;br /&gt;
    ocsp: http://ocsp.digicert.com&lt;br /&gt;
  cRLDistributionPoints :&lt;br /&gt;
    http://crl3.digicert.com/Omniroot2025.crl&lt;br /&gt;
  certificatePolicies :&lt;br /&gt;
    policy oid: 2.23.140.1.2.1&lt;br /&gt;
    policy oid: 2.23.140.1.2.2&lt;br /&gt;
    policy oid: 1.3.6.1.4.1.311.42.1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Taj digitalni sertifikat je izdala firma:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
* Microsoft Corporation&lt;br /&gt;
* &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Baltimore CyberTrust&amp;lt;/span&amp;gt;&lt;br /&gt;
* Digicert&lt;br /&gt;
* Ne može da se odredi&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Da bi se proverila validnost ovog sertifikata potrebno je:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
* Proveriti CRL listu koju hostuje Microsoft Corporation&lt;br /&gt;
* Proveriti CRL listu koju hostuje Baltimore CyberTrust&lt;br /&gt;
* &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Proveriti CRL listu koju hostuje Digicert&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Preuzeti i proveriti digitalni sertifikat firme Baltimore CyberTrust&amp;lt;/span&amp;gt;&lt;br /&gt;
* Preuzeti i proveriti digitalni sertifikat firme Microsoft Corporation&lt;br /&gt;
* Preuzeti i proveriti digitalni sertifikat firme Digicert&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Sledeći algoritmi omogućavaju dobijanje različitih kriptografskih ključeva u svakoj TLS razmeni i to takvih da je moguća verifikacija porekla ključeva.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;RSA&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ephemeral Diffie Hellman&amp;lt;/span&amp;gt;&lt;br /&gt;
# Anonymous Diffie Hellman&lt;br /&gt;
# Fixed Diffie Hellman&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovom porukom se potvrđuju kriptografski algoritmi koji će biti korišćeni u toku TLS sesije:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Server Hello&amp;lt;/span&amp;gt;&lt;br /&gt;
# Server Hello Done&lt;br /&gt;
# Client Hello Done&lt;br /&gt;
# Certificate Verify&lt;br /&gt;
# Certificate Request&lt;br /&gt;
# Finished&lt;br /&gt;
# Client Key Exchange&lt;br /&gt;
# Client Hello&lt;br /&gt;
# Change Cipher Specification&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Na slici je prikazan SAML deo poruke tokom autentikacije u okviru federacije identiteta:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ds:Signature xmlns:ds=&amp;quot;http://www.w3.org/2000/09/xmldsig#&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ds:SignedInfo&amp;gt;&lt;br /&gt;
            &amp;lt;ds:CanonicalizationMethod Algoritm=&amp;quot;http://www.w3.org/2001/10/xml-exc-c14n#&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;ds:SignatureMethod Algorithm=&amp;quot;http://www.w3.org/2000/09/xmldsig#rsa-sha1&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;ds:Reference URI=&amp;quot;...&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;ds:Transforms&amp;gt;&lt;br /&gt;
                    &amp;lt;ds:Transform Algorithm=&amp;quot;http://www.w3.org/2000/09/xmldsig#enveloped-signature&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;ds:Transform Algorithm=&amp;quot;http://www.w3.org/2001/10/xml-exc-c14n#&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/ds:Transforms&amp;gt;&lt;br /&gt;
                &amp;lt;ds:DigestMethod Algorithm=&amp;quot;http://www.w3.org/2000/09/xmldsig#sha1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;ds:DigestValue&amp;gt;...&amp;lt;/ds:DigestValue&amp;gt;&lt;br /&gt;
            &amp;lt;/ds:Reference&amp;gt;&lt;br /&gt;
        &amp;lt;/ds:SignedInfo&amp;gt;&lt;br /&gt;
        &amp;lt;ds:SignatureValue&amp;gt;...&amp;lt;/ds:SignatureValue&amp;gt;&lt;br /&gt;
        &amp;lt;ds:KeyInfo&amp;gt;&lt;br /&gt;
            &amp;lt;ds:X509Data&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Za ovu poruku je tačno sledeće:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# šalje je klijent direktno ka pružaocu identiteta&lt;br /&gt;
# šalje je klijent direktno ka pružaocu usluge&lt;br /&gt;
# šalje je klijent ka pružaocu usluge preko pružaoca identiteta&lt;br /&gt;
# šalje je klijent ka pružaocu identiteta preko pružaoca usluge&lt;br /&gt;
# šalje je pružalac identiteta direktno ka klijentu&lt;br /&gt;
# šalje je pružalac identiteta direktno ka pružaocu usluge&lt;br /&gt;
# šalje je pružalac identiteta ka klijentu preko pružaoca usluge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;šalje je pružalac identiteta ka pružaocu usluge preko klijenta&amp;lt;/span&amp;gt;&lt;br /&gt;
# šalje je pružalac usluge direktno ka klijentu&lt;br /&gt;
# šalje je pružalac usluge direktno ka pružaocu identiteta&lt;br /&gt;
# šalje je pružalac usluge ka pružaocu identiteta preko klijenta&lt;br /&gt;
# šalje je pružalac usluge ka klijentu preko pružaoca identiteta&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Za IKE razmenu ključeva je tačno sledeće:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Prvo se vrši razmena ključeva pa provera identiteta&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prvo se vrši provera identiteta pa razmena ključeva&lt;br /&gt;
# Ključ dobijen u prvoj fazi IKE razmene se češće menja od ključa dobijenog u drugoj fazi&lt;br /&gt;
# U prvoj i drugoj fazi razmene ključeva moraju da se koriste isti kriptografski algoritmi&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;U prvoj i drugoj fazi razmene ključeva mogu da se koriste različiti kriptografski algoritmi&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ključ dobijen u drugoj fazi IKE razmene se češće menja od ključa dobijenog u prvoj fazi&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Kada korisnik A prebacuje X bitcoin-a korisniku B, korisnik A mora da uradi sledeće:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# da enkriptuje blok u kojem je ova transakcija&lt;br /&gt;
# da odredi nonce za potvrdu bloka u blockchainu&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;da digitalno potpiše ovu transakciju DSA algoritmom&amp;lt;/span&amp;gt;&lt;br /&gt;
# da izračuna Merkleovo stablo transakcija&lt;br /&gt;
# da enkriptuje ovu transakciju RSA algoritmom&lt;br /&gt;
# da enkriptuje ovu transakciju AES algoritmom&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Odrediti optimalni poredak operacija u procesu prijema PGP poruke, ukoliko su svi servisi u upotrebi:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;Restauriranje poruke prema originalnom poretku, Skidanje email kompatibilnosti, Dešifrovanje poruke, Obezbeđivanje dekompresije, Provera autentikacije&amp;quot;&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Skidanje email kompatibilnosti&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Dešifrovanje poruke&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Obezbeđivanje dekompresije&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Provera autentikacije&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Na slici je data šema PGP upravljanja ključem uz korišćenje poverenja. U korenu hijerarhije se nalazi korisnički čvor. Čvorovi označeni crvenom bojom su čvorovi kojima se u potpunosti veruje da potpisuju druge ključeve, dok su plavom bojom označeni čvorovi kojima se delimično veruje da potpisuju druge ključeve. Konfigurabilni parametri su &amp;lt;code&amp;gt;X = 1&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;Y = 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Датотека:ZP jun 2022 zadatak 7 PGP šema.svg|PGP šema uz sedmi zadatak.|frame|center|class=transparent-svg]]&lt;br /&gt;
&lt;br /&gt;
Označiti sve čvorove koji su legitimni.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;B&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;C&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;D&amp;lt;/span&amp;gt;&lt;br /&gt;
# E&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;G&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;H&amp;lt;/span&amp;gt;&lt;br /&gt;
# I&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Peđa želi da šifruje poruku &#039;&#039;&#039;0246813579BD&#039;&#039;&#039;h. Poruka se šifruje primenom CCM moda funkcionisanja. Algoritam enkripcije koje se koristi u šifrovanju radi tako što permutuje heksa cifre ulaznog podatka prema priloženoj permutaciji:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Permutacija iz osmog zadatka.&lt;br /&gt;
| 3 || 5 || 7 || 4 || 6 || 0 || 1 || 2&lt;br /&gt;
|}&lt;br /&gt;
Blokovi ulaznih podataka koji se koriste za šifrovanje kreirani su po standardnoj šemi. Bajt flegova koji se čuvaju u blokovima ima vrednost &#039;&#039;&#039;8B&#039;&#039;&#039;h. Nonce ima vrednost &#039;&#039;&#039;C0D0&#039;&#039;&#039;h. Veličina bloka algoritma enkripcije je 4 bajta. MAC ima vrednost &#039;&#039;&#039;E159&#039;&#039;&#039;h.&lt;br /&gt;
&lt;br /&gt;
Brojači koji se koriste u šemi kreću od 0.&lt;br /&gt;
&lt;br /&gt;
Odgovoriti na sledeća pitanja. Odgovore davati u heksadecimalnom obliku bez oznake.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Koji osnovni mod funkcionisanja se koristi za šifrovanje poruke? (Tačan odgovor nosi 1 poen, netačan odgovor nosi -1 poen, a odgovor &amp;quot;Ne znam&amp;quot; nosi 0 poena) &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;CTR&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dati vrednost ulaznog bloka koji se kombinuje sa MAC-om &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;8BC0D000&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dati vrednost ulaznih blokova za šifrovanje razdvojenih blanko znakom &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;8BC0D001 8BC0D002&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dati vrednost koja se kombinuje sa MAC-om &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;000D&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dati vrednost koja se kombinuje sa plaintext-om &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;001D08BC002D&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dati vrednost šifrovane poruke &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;025B89897990&amp;lt;/span&amp;gt;&lt;br /&gt;
# Dati vrednost celokupne poruke koja se šalje &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;025B89897990E154&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
: &#039;&#039;Oblast ovog zadatka se od 2023. godine ne predaje na predmetu i kao takav nije rešen.&#039;&#039;&lt;br /&gt;
Malina Vojvodić iz Topolske 18 želi da napravi nalog na društvenoj mreži da se poveže sa Feđom da bi ga pozvala na svoj 50. rođendan. Odabrati dobre lozinke za Malinu imajući u vidu da Malina loše pamti i teške lozinke zapisuje na papir:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# maki1972&lt;br /&gt;
# ha03AMd&amp;quot;k&lt;br /&gt;
# prEduzEtnica44&lt;br /&gt;
# 123456&lt;br /&gt;
# topolskadama&lt;br /&gt;
# _Visnja_011&lt;br /&gt;
# m@lin@v&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Na slici je prikazan IBM-ov digitalni imuni sistem. Za svaki od navedenih koraka odrediti akciju koja se u tom koraku sprovodi.&lt;br /&gt;
[[Датотека:ZP jun 2022 zadatak 9 digitalni imuni sistem.svg|frame|center|Digitalni imuni sistem iz devetog zadatka.]]&lt;br /&gt;
* 3A. korak: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
* 3B. korak: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
* 3C. korak: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
* 6. korak: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;nerešeno&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Za svaki od sledećih scenarija, odrediti o kom malicioznom softveru je reč.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;logička bomba,zadnja vrata,zombi,keylogger,spamer,flooder,downloader,adware,ransomware&amp;quot;&amp;gt;&lt;br /&gt;
* Marija je preuzela igricu na svoj računar i odigrala je nekoliko partija. Marijini mejl kontakti su odjednom krenuli da primaju veliku količinu elektronske pošte. Preuzeta igrica predstavlja trojanskog konja koji u sebi sadrži maliciozan softver &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;spamer&amp;lt;/span&amp;gt;.&lt;br /&gt;
* Petar želi da organizuje DDOS napad i zbog toga je preuzeo kontrolu nad zombi računarima odakle šalje veliku količinu podataka ka određenom servisu na mreži. Maliciozni softver koji šalje ove podatke je &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;flooder&amp;lt;/span&amp;gt;.&lt;br /&gt;
* Vlada je otvorio mejl i preuzeo priloženu izvršnu datoteku koja je prilikom pokretanja prouzrokovala konekciju na udaljeni server sa kojeg je preuzela i instalirala dodatne zlonamerne programe. Koji softver predstavlja ova izvršna datoteka? &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;downloader&amp;lt;/span&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80&amp;diff=7430</id>
		<title>Системски софтвер</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%81%D0%BA%D0%B8_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80&amp;diff=7430"/>
		<updated>2024-03-16T13:20:58Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Пројекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С113СС, 13Е113СС&lt;br /&gt;
| семестар  = 6, 8 (СИ)&lt;br /&gt;
| статус    = изборни (СИ), обавезни (РТИ)&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir3ss/ rti.etf.rs/rti/ir3ss]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
У овом снимку ћемо се упознати са &#039;&#039;&#039;Системским софтвером&#039;&#039;&#039;, изборним предметом у шестом семестру на СИ, и обавезним на РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [http://si3ss.etf.bg.ac.rs/ Стара страница предмета] (рокови)&lt;br /&gt;
* [https://godbolt.org/ &#039;&#039;Compiler Explorer&#039;&#039;] (користан алат при вежбању задатака из декомпилације за први колоквијум)&lt;br /&gt;
* [https://drive.google.com/open?id=19796xkLX-qDMEAh9-4a5yi-8cdX_9t3G ETF SI] (рокови, белешке)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/17683025696 ETF Materijali (Box)] (рокови, наставни материјал, белешке)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Највећи део градива се обрађује на вежбама и на испите и колоквијуме/лабораторијску вежбу долазе задаци са вежби. Самим тим, предавања нису нарочитно битна, осим у првом делу када се обрађује архитектура &#039;&#039;x86&#039;&#039;. На предавањима се обрађују:&lt;br /&gt;
* Асемблер, репрезентација типова, врсте &#039;&#039;x86&#039;&#039; асемблерских инструкција, кодови услова, сет инструкције, програмски скокови, петље, позивање потпрограма и стек оквири.&lt;br /&gt;
* ГНУ алати, развој програма уз помоћ &#039;&#039;GDB&#039;&#039; дебагера.&lt;br /&gt;
* Конструкција асемблера, двопролазни и једнопролазни асемблер.&lt;br /&gt;
* Линкери, релокације, статичке библиотеке, &#039;&#039;ELF&#039;&#039; формат, пуниоци, дељене библиотеке, &#039;&#039;PIE&#039;&#039;. &lt;br /&gt;
* Емулатори, интерпретативни емулатори, статичка и динамичка рекомпилација, &#039;&#039;JIT&#039;&#039; превођење.&lt;br /&gt;
* Макропроцесори, &#039;&#039;C&#039;&#039; претпроцесор.&lt;br /&gt;
Предавања се претходних пар година нису одржавала уживо и самим тим распоред градива се не слаже са вежбама и колоквијумима. &lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат из Системског софтвера је обавезан и састоји се од 3 програма који чине заједнички скуп алата за развој софтвера на апстрактном рачунарском систему. Програми су редом асемблер, линкер и емулатор. Оцењивање се дели на 3 нивоа:&lt;br /&gt;
* Ниво А који носи 30 поена&lt;br /&gt;
* Ниво Б који носи 35 поена и&lt;br /&gt;
* Ниво Ц који носи 40 поена.&lt;br /&gt;
У сваком нивоу је неопходно развити сва 3 програма и нивои изнад А садрже додатне функционалности. Поставка се објављује на &#039;&#039;Moodle&#039;&#039; платформи.&lt;br /&gt;
&lt;br /&gt;
Тражени језик за развој пројекта је C/C++. Препоручено окружење за развој је &#039;&#039;Visual Studio Code&#039;&#039; на &#039;&#039;Ubuntu&#039;&#039; виртуелној машини која је доступна на &#039;&#039;Moodle&#039;&#039; платформи. За контролу генерисања кода препоручен је &#039;&#039;GNU make&#039;&#039;. Дозвољено је користити спољашње библиотеке које не имплементирају срж пројекта (генерисање кода, повезивање, релоцирање, емулација и сл.), али није препоручено јер је можда неопходно инсталирати њих на вирутелну машину за одбрану, а то захтева дозволу предметног асистента на самој одбрани.&lt;br /&gt;
&lt;br /&gt;
Пројекат се тестира помоћу јавних тестова (доступни на &#039;&#039;Moodle&#039;&#039; курсу предмета), који се покрећу за жељени ниво и све ниже нивое (могуће је уз одобрење асистента спустити ниво на одбрани). Поред покретања јавних тестова, одбрану чини и модификација која се тестира тајним тестовима. Потребно је да сви тестови раде како би одбрана пројекта била успешна.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Лабораторијска вежба се одржава само на РТИ одсеку, и еквивалентна је првом колоквијуму на СИ одсеку.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Стари испитни рокови могу се пронаћи на старој страници предмета, у [[#Корисне везе|одељку за корисне везе]]. Нови испитни рокови нису доступни са странице предмета, али се могу наћи на неком од драјвова у истом том одељку. Званична решења се не објављују.&lt;br /&gt;
&lt;br /&gt;
Пре првог колоквијума обично изађу пробни тестови за теорију и задатак. Тренутно су доступни [[Системски софтвер/Пробни тестови 2022|пробни тестови 2022. године]].&lt;br /&gt;
&lt;br /&gt;
Следећи рокови су сакупљени на {{SITENAME}}:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category        = Системски софтвер&lt;br /&gt;
| category        = Рокови&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦19¦-1}²]],,&lt;br /&gt;
| noresultsheader = Тренутно нема рокова.&lt;br /&gt;
}}&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — бодови са првог колоквијума, има један термин за надокнаду или поправку (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — бодови са другог колоквијума, надокнађује се у оквиру испита (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt; — бодови са пројектног задатка (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита, услов за излазак је преко 30 бодова на пројектном задатку и првом колоквијуму&lt;br /&gt;
* Коначни бодови: &amp;lt;math&amp;gt;P = K_1 + Pr + max\left(K_2 + \frac{I}{2}, I\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|rešenja}}&lt;br /&gt;
* Од користи би био водич за први колоквијум, са објашњењима како се одређене структуре у C могу пресликати у асемблер.&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7309</id>
		<title>КДП/Фебруар 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7309"/>
		<updated>2024-02-12T19:59:08Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#039;&#039;) користећи активне мониторе. Обезбедити да процес који је пре упутио захтев за приступ ресурсу пре треба да буде опслужен.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...; //broj citalaca + broj pisaca&lt;br /&gt;
chan s(int, int); //id, op&lt;br /&gt;
chan r[N](int, int);&lt;br /&gt;
&lt;br /&gt;
// 0 - start read&lt;br /&gt;
// 1 - end read&lt;br /&gt;
// 2 - start write&lt;br /&gt;
// 3 - end write&lt;br /&gt;
&lt;br /&gt;
void reader(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 0);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //read&lt;br /&gt;
        send s(id, 1);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writer(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 2);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //write&lt;br /&gt;
        send s(id, 3);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void monitor() {&lt;br /&gt;
    int id, op, numR = 0;&lt;br /&gt;
    queue buffer(int, int);&lt;br /&gt;
&lt;br /&gt;
    while(true) {&lt;br /&gt;
        if(buffer.isNotEmpty()) id, op = buffer.get();&lt;br /&gt;
        else receive s(id, op);&lt;br /&gt;
&lt;br /&gt;
        if(op == 0) {&lt;br /&gt;
            numR++;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 1) {&lt;br /&gt;
            numR--;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 2) {&lt;br /&gt;
            int id2, op2;&lt;br /&gt;
            while(numR &amp;gt; 0) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 1) {&lt;br /&gt;
                    numR--;&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
            while(true) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 3) {&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7308</id>
		<title>КДП/Фебруар 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7308"/>
		<updated>2024-02-12T19:58:16Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* {{категорија|3. задатак|Активни_монитори}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#039;&#039;) користећи активне мониторе. Обезбедити да процес који је пре упутио захтев за приступ ресурсу пре треба да буде опслужен.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
const int N = ...; //broj citalaca + broj pisaca&lt;br /&gt;
chan s(int, int); //id, op&lt;br /&gt;
chan r[N](int, int);&lt;br /&gt;
&lt;br /&gt;
// 0 - start read&lt;br /&gt;
// 1 - end read&lt;br /&gt;
// 2 - start write&lt;br /&gt;
// 3 - end write&lt;br /&gt;
&lt;br /&gt;
void reader(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 0);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //read&lt;br /&gt;
        send s(id, 1);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writer(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 2);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //write&lt;br /&gt;
        send s(id, 3);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void monitor() {&lt;br /&gt;
    int id, op, numR = 0;&lt;br /&gt;
    queue buffer(int, int);&lt;br /&gt;
&lt;br /&gt;
    while(true) {&lt;br /&gt;
        if(buffer.isNotEmpty()) id, op = buffer.get();&lt;br /&gt;
        else receive s(id, op);&lt;br /&gt;
&lt;br /&gt;
        if(op == 0) {&lt;br /&gt;
            numR++;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 1) {&lt;br /&gt;
            numR--;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 2) {&lt;br /&gt;
            int id2, op2;&lt;br /&gt;
            while(numR &amp;gt; 0) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 1) {&lt;br /&gt;
                    numR--;&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
            while(true) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 3) {&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7307</id>
		<title>КДП/Фебруар 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7307"/>
		<updated>2024-02-12T19:57:10Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#039;&#039;) користећи активне мониторе. Обезбедити да процес који је пре упутио захтев за приступ ресурсу пре треба да буде опслужен.&lt;br /&gt;
const int N = ...; //broj citalaca + broj pisaca&lt;br /&gt;
chan s(int, int); //id, op&lt;br /&gt;
chan r[N](int, int);&lt;br /&gt;
&lt;br /&gt;
// 0 - start read&lt;br /&gt;
// 1 - end read&lt;br /&gt;
// 2 - start write&lt;br /&gt;
// 3 - end write&lt;br /&gt;
&lt;br /&gt;
void reader(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 0);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //read&lt;br /&gt;
        send s(id, 1);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writer(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 2);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //write&lt;br /&gt;
        send s(id, 3);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void monitor() {&lt;br /&gt;
    int id, op, numR = 0;&lt;br /&gt;
    queue buffer(int, int);&lt;br /&gt;
&lt;br /&gt;
    while(true) {&lt;br /&gt;
        if(buffer.isNotEmpty()) id, op = buffer.get();&lt;br /&gt;
        else receive s(id, op);&lt;br /&gt;
&lt;br /&gt;
        if(op == 0) {&lt;br /&gt;
            numR++;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 1) {&lt;br /&gt;
            numR--;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 2) {&lt;br /&gt;
            int id2, op2;&lt;br /&gt;
            while(numR &amp;gt; 0) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 1) {&lt;br /&gt;
                    numR--;&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
            while(true) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 3) {&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7306</id>
		<title>КДП/Фебруар 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2024&amp;diff=7306"/>
		<updated>2024-02-12T19:55:01Z</updated>

		<summary type="html">&lt;p&gt;MihailoM342: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#039;&#039;) користећи активне мониторе. Обезбедити да процес који је пре упутио захтев за приступ ресурсу пре треба да буде опслужен.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
const int N = ...; //broj citalaca + broj pisaca&lt;br /&gt;
chan s(int, int); //id, op&lt;br /&gt;
chan r[N](int, int);&lt;br /&gt;
&lt;br /&gt;
// 0 - start read&lt;br /&gt;
// 1 - end read&lt;br /&gt;
// 2 - start write&lt;br /&gt;
// 3 - end write&lt;br /&gt;
&lt;br /&gt;
void reader(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 0);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //read&lt;br /&gt;
        send s(id, 1);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void writer(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while(true) {&lt;br /&gt;
        send s(id, 2);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
        //write&lt;br /&gt;
        send s(id, 3);&lt;br /&gt;
        receive r[id](status);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void monitor() {&lt;br /&gt;
    int id, op, numR = 0;&lt;br /&gt;
    queue buffer(int, int);&lt;br /&gt;
&lt;br /&gt;
    while(true) {&lt;br /&gt;
        if(buffer.isNotEmpty()) id, op = buffer.get();&lt;br /&gt;
        else receive s(id, op);&lt;br /&gt;
&lt;br /&gt;
        if(op == 0) {&lt;br /&gt;
            numR++;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 1) {&lt;br /&gt;
            numR--;&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
        } else if(op == 2) {&lt;br /&gt;
            int id2, op2;&lt;br /&gt;
            while(numR &amp;gt; 0) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 1) {&lt;br /&gt;
                    numR--;&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            send r[id](true);&lt;br /&gt;
            while(true) {&lt;br /&gt;
                receive s(id2, op2);&lt;br /&gt;
                if(op2 == 0 || op2 == 2) buffer.put(id2, op2);&lt;br /&gt;
                else if(op2 == 3) {&lt;br /&gt;
                    send r[id2](true);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>MihailoM342</name></author>
	</entry>
</feed>