Системски софтвер/Август 2022 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Нова страница: {{tocright}} '''Испит у августовском року 2022. године''' одржан је 24. августа. Сваки задатак вреди уку…)
 
м (→‎Решење: mala greška)
Ред 52: Ред 52:
Појављивање неког макроа у својој дефиницији се не сматра макропозивом. Видети [https://gcc.gnu.org/onlinedocs/cpp/Self-Referential-Macros.html 3.10.5 Self-Referential Macros] из документације C претпроцесора.  
Појављивање неког макроа у својој дефиницији се не сматра макропозивом. Видети [https://gcc.gnu.org/onlinedocs/cpp/Self-Referential-Macros.html 3.10.5 Self-Referential Macros] из документације C претпроцесора.  
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
B M3(A M3(C, A) M1(C), B) M3(A M3(C, A), A)
B M3(A M3(C, A) M1(C), B) M3(A M3(C,A) M1(C), A)
 
</syntaxhighlight>
</syntaxhighlight>
== 3. задатак ==
== 3. задатак ==
{{делимично решено}}
{{делимично решено}}

Верзија на датум 24. август 2022. у 14:50

Испит у августовском року 2022. године одржан је 24. августа. Сваки задатак вреди укупно 10 поена. Испит траје 2 сата.

1. задатак

Поставка

Одредити вредност при обради од стране асемблера за хипотетичку машину (уколико вредност није позната написати знак питања) и индекс класификације за сваки израз у оквиру изворног асемблерског кода датог у наставку.

        BEG
        USE LAB1
        ORG 0x60
        SCT DAT
LAB2    DC LAB1
        DC 7 + LAB2
        SCT TXT
LAB3    LDA LAB2 - 1
        ADX * - LAB3
        END

Решење

Наредба Индекс класификације Вредност
DC LAB1 1.unique() ?
DC 7 + LAB2 0 + 1.DAT = 1.DAT 0x67
LDA LAB2 - 1 1.DAT - 0 = 1.DAT 0x5f
ADX * - LAB3 1.TXT - 1.TXT = 0 0x2

2. задатак

Поставка

Навести шта је резултат експанзије следећег кода од стране C претпроцесора и објаснити како је добијен.

#define M1(x1) M2(x1)
#define M2(x1) M3(x1,A)
#define M3(x1,x2) x2 M3(x1,x2) M1(x1)
M3(M1(C), B)

Решење

Појављивање неког макроа у својој дефиницији се не сматра макропозивом. Видети 3.10.5 Self-Referential Macros из документације C претпроцесора.

B M3(A M3(C, A) M1(C), B) M3(A M3(C,A) M1(C), A)

3. задатак

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

За неки емулатор потребно је написати функцију void write(unsigned addr, unsigned data) за упис у меморију. Адресни простор је величине 4 GB, а адресабилна јединица је бајт. Сматрати да је приступ речи увек поравнат на адресу дељиву са 4. На располагању су функције unsigned rphy(unsigned addr), која дохвата реч са дате физичке адресе и void wphy(unsigned addr, unsigned data), која уписује задату реч на задату физичку адресу. Емулирана машина поседује виртуелну меморију организовану странично. Величина странице је 16 KB. Регистар PMTP (који се емулира истоименом глобалном променљивом) садржи адресу табеле за пресликавање страница. Сваки улаз у табели је 32 бита, при чему су највиша два бита V и D битови. Уколико је V бит једнак 0, у најнижих 30 битова је записана адреса на диску, док је у случају да је бит V једнак 1, у најнижим битовима улаза записан редни број блока у који је смештена страница. У случају да страница није у меморији, учитава се у меморију позивом функције void load(unsigned hddaddr), која у позадини генерише page fault и блокира позивајућу нит док страница не буде учитана са диска. Једини аргумент функције представља адресу којој се приступа.

Решење

4. задатак

Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.

Поставка

Посматра се процес покренут над програмом run добијеним повезивањем са дељеном библиотеком libfoo.so. Дељена библиотека libfoo.so садржи функције bar и baz чије су адресе унутар libfoo.so 0x1218 и 0x12C4 респективно, а сама дељена библиотека libfoo.so мапирана је почев од адресе 0x4FFF0000 унутар адресног простора посматраног процеса.

Програм run, који представња PIC shared object ELF датотеку, мапиран је почев од адресе 0x7EEE0000 унутар адресног простора посматраног процеса. Програм run од дељених библиотека користи искључиво libfoo.so и позива њене две функције bar и baz користећи лењо повезивање. Уколико је познат део .plt секције програма run, наведен у наставку, потребно је урадити следеће.

  1. [2] Одредити на којој адреси се налази .got.plt секција програма run.
  2. [4] Попунити .plt секцију (заменити свако појављивање знакова питања одговарајућом вредношћу) уколико је познато да се улаз за функцију bar унутар .plt секције налази испред улаза за функцију baz унутар .plt секције.
  3. [2] Навести вредности које се налазе у улазима .got.plt секције, који одговарају симболима bar и baz, у тренутку пре него што је посматрани процес извршио први позив било које функције из дељене библиотеке libfoo.so.
  4. [2] Навести вредности које се налазе у улазима .got.plt секције, који одговарају симболима bar и baz, у тренутку након што је посматрани процес извршио позив функције bar, а пре позива функције baz.
Disassembly of section .plt:
0000000000001060 <.plt>:
  1060: ff 35 a2 42 00 00                push QWORD PTR [rip + 0x42a2]
  1066: ff 25 a4 42 00 00                jmp QWORD PTR [rip + 0x42a4]
  106c: 0f 1f 40 00                      nop DWORD PTR [rax + 0x00]
  1070: ff 25 ?? ?? ?? ??                jmp QWORD PTR [rip + ??]
  1076: 68 00 00 00 00                   push 0x00
  107b: e9 ?? ?? ?? ??                   jmp ??
  1080: ff 25 ?? ?? ?? ??                jmp QWORD PTR [rip + ??]
  1086: 68 01 00 00 00                   push 0x01
  108b: e9 ?? ?? ?? ??                   jmp ??

Решење