Mikroračunari -- FAQ (ili ČPP -- Često Postavljena Pitanja)
O kursu
O čemu se radi u "Mikroračunarima"?

Pravi naziv ovog kursa bi trebalo da bude "Mikroprocesorski sistemi" ili nešto nalik tome. Dakle, u okviru ovog predmeta izučavaju se mikroprocesori, njihov dizajn i organizacija, principi rada, zatim arhitektura, mašinski i asemblerski jezici kao i asemblersko programiranje. Osnovni cilj kursa je da student razume kako računari funkcionišu na elementarnom nivou i kako se sa tog nivoa "prelazi" na više nivoe računarskog sistema koji su izučavani u okviru drugih predmeta (programiranje na višim programskim jezicima, rad operativnih sistema, računarske mreže, itd.). Dakle, pokušavamo da "složimo kockice" i da do kraja razjasnimo stvari koje su do sada prihvatane sa rezervom, kao dosta apstraktne.

Kako je organizovan kurs?

Kurs se sastoji iz predavanja i vežbi. Na predavanjima se pre svega izučavaju principi rada i organizacija mikroprocesora. Izučavaju se elementarna logička kola i način kako se ona mogu kombinovati u složenije logičke sisteme, od kojih se nakon toga gradi procesor. Takođe, izučavaju se osnove VLSI dizajna. Na vežbama se pre svega demonstriraju neke tipične arhitekture procesora i asemblersko programiranje na tim arhitekturama.

Koje se teme obrađuju na vežbama?

Prvi deo kursa se odnosi na IA-32 arhitekturu, koja je još uvek najčešće korišćena arhitektura. Radi se o tipičnoj CISC arhitekturi. U okviru ovog dela kursa se, osim programiranja na asemblerskom jeziku ove arhitekture, izučava i povezivanje koda pisanog na asembleru sa kodom pisanim na višim programskim jezicima, konvencije koje se tom prilikom primenjuju, inline asemblersko programiranje, deljene i dinamičke biblioteke, itd. Ovim se produbljuje razumevanje procesa prevođenja i upotpunjuje se slika o tome na koji način se od programa na višem programskom jeziku dolazi do mašinskih instrukcija koje procesor izvršava. Drugi deo kursa se odnosi na ARM arhitekturu -- u pitanju je RISC arhitektura pretežno zastupljena na mobilnim uređajima (mobilni telefoni, PDA uređaji, itd.). Ovo je novina u nastavi ove godine i trebalo bi da upotpuni kurs i poboljša njegov kvalitet, izučavanjem jedne RISC arhitekture.

Koje se arhitekture mikroprocesora rade, i zašto baš te?

Radi se o arhitekturama IA-32 i ARM, koje su respektivno predstavnici CISC i RISC arhitektura. Prva arhitektura je odabrana zato što je najčešće korišćena u praksi, uglavnom iz istorijskih i tržišnih razloga, ne zato što je najbolja koja postoji. Njena unapređena verzija x86-64 (ili AMD-64) je svakako vredna pomena, ali će ove godine ipak biti preskočena zato što još uvek mnogo studenata kod svoje kuće nema novije procesore koji pomenuto proširenje podržavaju. Takođe, operativni sistemi koji su u upotrebi još uvek su mahom 32-bitni, kao i ostali softver. Druga arhitektura je jedna od najzastupljenijih na tzv. "embedded" sistemima, pa je time zaslužila da se obradi na vežbama.

Kako izgleda ispit?

Pismeni deo ispita se polaže na računaru. Tačan broj zadataka biće naknadno određen i blagovremeno saopšten studentima. Ispit će pokrivati gradivo obrađeno na vežbama. Pismeni deo ispita se takođe može položiti preko kolokvijuma. Najverovatnije će ih biti tri. Prvi verovatno početkom decembra, drugi u martu, a treći krajem maja. Student mora položiti sve kolokvijume da bi se smatralo da je položio pismeni deo ispita. Prednost polaganja ispita preko kolokvijuma je, nadam se, jasna i očigledna. Urađeni zadaci na ispitu ili kolokvijumu moraju da rade da bi bili ocenjeni prelaznom ocenom. Koliko zadataka mora da proradi da bi se ispit (ili kolokvijum) položio zavisi od broja zadataka (npr. ako su dva zadatka, tada mora da proradi bar jedan). Usmeni deo ispita se polaže u dogovoru sa profesorom, nakon položenog pismenog dela. Usmeni ispit pokriva gradivo sa predavanja.

Da li moram da polažem pismeni deo ispita i/ili kolokvijume na računaru?

Da. Ne postoji mogućnost polaganja na papiru. S obzirom da se radi o studentima završne godine, pritom računarskog smera, besmisleno je da se programi u bilo kom programskom jeziku pišu na papiru. Papir nije za programiranje, čemu služe računari??

Šta ako ne položim neki od kolokvijuma?

Jedina mogućnost je da se polaže pismeni na klasičan način. Ne postoji mogućnost da se parcijalno polaže samo taj deo gradiva, ili da se na drugi način nadoknadi propušteni kolokvijum.

Da li moram da polažem usmeni u istom roku kada i pismeni?

Ovo zavisi isključivo od dobre volje profesora. Sva pitanja na tu temu treba uputiti njemu.

Koja literatura mi je potrebna/dovoljna za pripremu ispita?

Spisak literature koja se koristi za pripremu pismenog dela ispita data je na web strani predmeta. Ovaj spisak će biti dopunjen dodatnim materijalima u toku izvođenja nastave. IA-32 arhitektura dobro je obrađena u skripti Aleksandra Samardžića -- "Mikroprocesorski sistemi". Osim ove skripte, tu su svakako pdf dokumenti sa zvaničnom Intel-ovom dokumentacijom. Korišćenje ove literature dozvoljeno je i na ispitu. Literatura za ARM arhitekturu biće naknadno saopštena. Što se tiče literature za usmeni deo ispita, o tome se treba konsultovati sa profesorom.

Na koji način mogu da se dodatno informišem u vezi gradiva?

Ukoliko vam literatura data na strani predmeta nije dovoljna, možete pronaći mnogo materijala na Internetu. Možete kontaktirati mene, kao i profesora u vezi ove teme. Sa druge strane, ako neko od studenata pronađe neki zanimljiv sadržaj koji bi mogao da bude od koristi za bolje razumevanje oblasti koje na vežbama obrađujemo, molim da me obavesti, kako bih link ka tim materijalima dodao na stranu predmeta.

Redovno pratim vežbe, ali mi ipak nije sve jasno. Da li mogu da dobijem dodatnu pomoć?
Naravno. Konsultacije se mogu zakazati putem e-mail-a, u standardnom terminu (koji je dat na mojoj web strani) ili u nekom drugom terminu po dogovoru. Takođe, mnoge sitne nedoumice i nejasnoće mogu se razjasniti putem e-mail-a. Zato ne oklevajte da pošaljete pitanja -- odgovori slede brzo.

Prevođenje programa
Kako da prevedem program napisan u asembleru?

Ako pretpostavimo da je program napisan u celini u asembleru, tj. da nema povezivanja sa funkcijama koje su napisane u C-u. tada je dovoljno pokrenuti sledeće komande:
as -o hello.o hello.s
gcc -o hello hello.o
pri čemu smo pretpostavili da se izvorni fajl sa asemblerskim kodom zove 'hello.s', objektni fajl 'hello.o', a izvršni fajl 'hello'. Prva komanda prevodi asemblerski kod u binarni oblik (tzv. objektni fajl). Druga komanda vrši povezivanje tako prevedenog koda sa standardnom bibliotekom i kreira izvršni fajl. Opcija -o u oba slučaja označava ime izlaznog fajla.

Kako se povezuju delovi programa napisani u C-u i asembleru?

Pretpostavimo da se u fajlu 'asmfunc.s' nalaze napisane asemblerske funkcije, a da se u fajlu 'cfunc.c' nalaze napisane C funkcije. Tada je potrebno zasebno prevesti oba fajla (bez povezivanja), a zatim ih povezati u jedan izvršni fajl. Ovo se može postići sledećim komandama:
as -o asmfunc.o asmfunc.s
gcc -c -o cfunc.o cfunc.c
gcc -o program asmfunc.o cfunc.o
Prve dve komande vrše prevođenje na mašinski jezik (prva sa asemblera, a druga sa C-a), dok poslednja komanda vrši povezivanje ova dva objektna fajla. Ime izvršnog fajla je 'program'. Opcija -c u drugoj komandi govori GCC prevodiocu da ne vrši povezivanje, već da samo generiše objektni fajl. Da bi se povezivanje u poslednjoj komandi uspešno izvršilo, potrebno je da u tačno jednom od dva fajla sa izvornim kodom postoji funkcija 'main'. Izvršavanje programa počinje sa ovom funkcijom.

Da li su gore korišćeni oblici imena fajlova obavezni?

Nisu. Imena ulaznih fajlova korisnik navodi kao argumente, tako da ona mogu biti proizvoljna. Imena izlaznih fajlova se određuju opcijom -o tako da su i ona proizvoljna. Međutim, uobičajena konvencija je da se fajlovi sa asemblerskim kodom imenuju sa ekstenzijom '.s', a da se fajlovi sa C kodom imenuju sa ekstenzijom '.c'. Takođe, konvenzija je da se prevođenjem fajla sa imenom 'neko_ime.s' ili 'neko_ime.c' dobija objektni fajl imenovan sa 'neko_ime.o'. Ime izvršnog fajla je takođe proizvoljno, ali je pod UNIX-om konvencija da imena izvršnih fajlova nemaju ekstenzije.

Šta će se dogoditi ako ne navedem ime izlaznog fajla?

Podrazumevano ponašanje as i gcc prevodioca je da se generiše izlazni fajl koji se zove 'a.out'.

Koje su još korisne opcije prilikom prevođenja?

GCC: opcija -Wall prikazuje razna upozorenja koja mogu biti korisna prilikom pronalaženja i ispravljanja grešaka. Opcija -g uključuje u izlazni fajl informacije potrebne za debagovanje programa (ovo je neophodno ako imate nameru da koristitie gdb). Opcija -ansi isključuje sve nestandardne ekstenzije gcc prevodioca (npr. C++ komentare), ova opcija je korisna kada se piše program koji treba da bude prenosiv. Osim toga, korisne su i opcije koje zaustavljaju proces prevođenja u određenoj fazi. Npr. opcija -E ispisuje na standardni izlaz rezultat preprocesiranja, ostale faze se ne obavljaju. Opcija -S prekida rad nakon prevođenja sa C-a na asembler, tj. program ostaje u asemblerskom obliku. Ne vrši se asembliranje i linkovanje. Izlazni fajl je podrazumevano istog imena kao i izvorni C fajl, s tim što se ekstenzija menja u '.s'. Opcija -c prekida rad nakon asembliranja, tj. sprečava linkovanje. Izlazni fajl je podrazumevano istog imena kao i C fajl, s tim što se ekstenzija menja u '.o'.

AS: opcija -gstabs uključuje u izlazni fajl informacije potrebne za debagovanje. Ovo je neophodno ako se planira korišćenje gdb-a.

Kako da automatizujem proces prevođenja?

Korišćenjem 'make' alata. Primer jednostavnog Makefile-a kojim se prevodi program sastavljen od jednog C i jednog asemblerskog izvornog fajla je:
program: asmfunc.o cfunc.o
	gcc -Wall -g -o program asmfunc.o cfunc.o
asmfunc.o: asmfunc.s
	as -gstabs -o asmfunc.o asmfunc.s
cfunc.o: cfunc.c
	gcc -Wall -g -c -o cfunc.o cfunc.c
Važno je primetiti da linije sa komandama počinju horizontalnim tabulatorom.

Gde mogu da pronađem još informacija o korišćenju prevodilaca?

Na web strani predmeta nalaze se linkovi ka online dokumentaciji raznih alata. Osim toga, tu su 'man' stranice kao i 'info' stranice na vašem računaru. Za brz i jednostavan uvod u korišćenje alata za prevođenje (ali i editora, debagera, profajlera itd.) korisno je pročitati skriptu o GNU programerskim alatima Aleksandra Samardžića. Link ka ovom dokumentu takođe postoji na strani predmeta.

Korišćenje dokumentacije
Čemu služe 'man' strane?

Ove strane sadrže osnovne informacije o komandama, funkcijama, sistemskim pozivima, konfiguracionim fajlovima, itd. pod UNIX sistemom ('man' je skraćeno od 'manual'). Informacije koje su u ovim stranama su ponekad dovoljno detaljne, da nikakva druga dokumentacija nije neophodna. Ovo je slučaj sa funkcijama i sistemskim pozivima. Međutim, kada su programi u pitanju, pojedini programi su toliko komplikovani da je nemoguće sve informacije o korišćenju smestiti u jednu stranu. Tada se obično samo neke osnovne informacije nalaze u 'man' strani, dok se detaljna dokumentacija obično dostavlja u nekom drugom formatu (HTML, pdf). 'man' strane obično ne sadrže primere upotrebe, ali ima izuzetaka. Man strane su podeljene na sekcije -- svaka sekcija sadrži strane iz odgovarajuće kategorije. Osnovne sekcije su obeležene brojevima 1,2,3... itd. Dodatne sekcije mogu imati i drugačije oznake. Sekcija 1 rezervisana je za UNIX komande i programe (npr, gcc, cp, make, itd.). U sekciji 2 se nalaze UNIX sistemski pozivi (fork(), write(), select()), dok se u sekciji 3 nalaze funkcije standardne C biblioteke (printf(), strlen(), isdigit()). U sekciji 5 nalaze se informacije o formatima fajlova, sekcija 8 sadrži informacije o administrativnim alatima i 'daemon' procesima, itd.

Kako se koriste 'man' strane?

Komanda:
man [sekcija] pojam
prikazuje formatiranu 'man' stranu koja odgovara datom pojmu. Ako se sekcija ne navede, tada se dati pojam traži redom u sekcijama 1,2,3,..., dok se u nekoj od njih ne pronađe. Na primer:
man printf
će pronaći u sekciji 1 stranu koja odgovara komandi printf. Ako želimo C-funkciju printf(), tada ćemo kucati:
man 3 printf
kako bismo zaobišli uobičajeni redosled pretraživanja. Sadržaj 'man' strane se može prelistavati strelicama na gore i dole, dok se strana napušta pritiskom na taster 'q'. Pretraga unutar 'man' strane se pokreće tako što se pritisne taster '/', nakon čega se kuca tekst koji se traži. Na kraju se pritisne ENTER i svi pronađeni uzorci traženog teksta od tekuće pozicije u strani do dna strane biće osenčeni tako da budu lako uočljivi.

Šta su 'info' strane?

'info' strane predstavljaju kolekciju dokumenata koji detaljno opisuju razne alate koji potiču iz GNU kolekcije alata. U pitanju su programerski alati (gcc, make, as, ld, gdb itd.), kao i mnoge standardne UNIX komande i alati koji su implementirani u okviru GNU projekta (bash, grep, sed, awk, gzip, itd.).

U čemu je prednost 'info' strana u odnosu na 'man' strane?

Za razliku od 'man' strana koje predstavljaju kolekciju pojedinačnih dokumenata koji odgovaraju raznim pojmovima, 'info' strane predstavljaju povezanu kolekciju dokumenata zasnovanu na hipertekstu. Drugim rečima, 'info' strane predstavljaju jednu celinu koja se može pregledati na sličan način kao da je u pitanju Web dokumentacija. Na svakoj strani se nalaze linkovi koji vas mogu odvesti ka drugim stranama koje su na neki način povezane sa temom. Na ovaj način se i dokumentacija za pojedinačni alat može podeliti u čitav skup stranica (sekcije, poglavlja,...), tako da je moguće napraviti veoma obimnu, a ipak preglednu dokumentaciju. Može se reći da su 'info' strane napredna alternativa 'man' stranama. Međutim, imajući u vidu da su 'info' strane nastale kao deo GNU projekta, u njima se nalaze informacije koje se tiču isključivo alata koji potiču iz tog projekta. Za sve ostalo 'man' strane su i dalje jedina vrsta konzolne dokumentacije.

Kako se koriste 'info' strane?

Komanda:
info
otvara osnovni meni u kome su izlistane sve teme koje postoje u 'info' dokumentaciji. Stavke u meniju su hiperlinkovi -- mogu se aktivirati tako što se kursor tasterima strelica dovede na zvezdicu ispred stavke i nakon toga pritisne ENTER. Slično se aktiviraju svi hiperlinkovi na koje se nailazi prilikom pregleda dokumentacije (svi hiperlinkovi imaju zvezdicu ispred). U svakom trenutku se u vrhu strane nalaze informacije o tome koja strana je sledeća, a koja prethodna u poretku stranica, kao i koja je strana nivo iznad tekuće strane (npr. ako iz neke podsekcije želite da se vratite u glavnu sekciju za neki alat). Prethodna strana se otvara pritiskom na taster 'p', sledeća se otvara pritiskom na taster 'n', dok se pritiskom na taster 'u' prelazi na nivo iznad u dokumentaciji. Pritiskom na taster 'm' korisniku se pruža mogućnost da pretražuje sekcije (unese prvih par karaktera i pritisne TAB, čime dobija listu svih sekcija koje tako počinju). Pritiskom na taster 'q' izlazi se iz dokumentacije. Ako znate naziv sekcije koja vas zanima, možete odmah ući u tu sekciju tako što kucate:
info [ime_sekcije]
Na primer:
info make
otvara sekciju koja opisuje make alat.