Системски софтвер/Август 2022 — разлика између измена
(Нова страница: {{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, наведен у наставку, потребно је урадити следеће.
- [2] Одредити на којој адреси се налази
.got.plt
секција програма run. - [4] Попунити
.plt
секцију (заменити свако појављивање знакова питања одговарајућом вредношћу) уколико је познато да се улаз за функцијуbar
унутар.plt
секције налази испред улаза за функцијуbaz
унутар.plt
секције. - [2] Навести вредности које се налазе у улазима
.got.plt
секције, који одговарају симболимаbar
иbaz
, у тренутку пре него што је посматрани процес извршио први позив било које функције из дељене библиотеке libfoo.so. - [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 ??