jak se hello world taha do pameti, to zalezi na operacnim systemu a/nebo loaderu. Napriklad v CP/M nebo v MSDOS (v pripade programu.com) se napred program natahne do pameti od adresy 0x100 a pak se spusti od te same adresy. Na ni vetsinou byva skok na zacatek inicializacnich rutin programu.
V linuxu je to zajimavejsi. program se napred spusti a teprve potom se natahne :-). Zjednodusene receno se program namapuje do urciteho mista pameti (coz je prakticky zavolani jednoho syscallu, ktery zinicializuje swapovaci tabulky). Pak se skoci na zacatek tohoto bloku. Pokus o cteni nebo vykonani kodu ve frame pameti, kde neni namapovana zadna fyzicka stranka vede k vyjimce (interrupt), ktera je obsouzena kernelem. Ten do prislusneho frame namapuje fyzickou stranku pameti (kde ji vezme je namet na dalsi kapitolu). Pokud se ukaze, ze tento frame je namapovany na urcity file (text programu), jednoduse se tato cast programu precte z disku a zapise do pameti. Pokud naopak tato adresa mela obsahovat globalni promenne, tato stranka se vynuluje, pripadne zinicializuje.
Jak printf zacerni/zabeli/vystinuje urcity pixel? Jednoduse nijak. Printf tady neni proto, aby se staral o takovehle veci. O tohle se stara VGA v pripade textoveho rezimu, pripadne X server v pripade grafickeho rezimu (embeded graficke programy ted nechame stranou). Printf je funkce libc. Prevezme parametry, na jejich zaklade vygeneruje output string a s nim zavola funkci puts nebo fwrite. Tyto dve posledni funkce vedou na zavolani syscallu kernelu, ktery uz to posle na VGA nebo pres nejake presmerovani do X nebo jineho grafickeho serveru.
Jak se prepina kontext mezi soucasne bezicimi aplikacemi? To je zalezitost kernelu, to muzes maximalne lehce ovlivnit, ale tezko se do toho hrabe.
Jak se predavaji parametry a navratove hodnoty (predpokladam, ze mas na mysli parametry funkci) - vetsinou na stacku, navratova hodnota se pravdepodobne predava v registru (pokud se nejedna o strukturu). Je to zajimava otazka, tohle je jedna z veci, ke kterym je debuger uzitecny. Tady bude taky dost zalezet na parametrech kompilatoru.
Ja samozrejme nerikam, ze debuger neni vubec k nicemu, obcas pouzivam ddd, ale pouzivam ho tak jednou za rok.
Pokud chces vedet ktere knihovny se tahaji z urcitemu programu, tak na to je ldd. Tohle je napriklad ten programek na faktorial, ale stejne to bude pro jakykoliv C program, kde nepotrebujes jine knihovny nez libc.
root@moonlight:/tmp# ldd ./f
linux-gate.so.1 => (0xb7738000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb756e000)
/lib/ld-linux.so.2 (0xb7739000)
co je to linux-gate.so.1 nemam tuseni, pravdepodobne je to interface na volani kernelu. ld-linux.so.2 je loader a libc.so.6 obsahuje vsechny standardni C funkce jako printf, qsort a podobne.