Info: - Kirjallisen materiaalin versio 0.1 on julki nettisivulla. - Demo 1 on julkaistu ja sitä pääsee tekemään. Näytin pikaohjeistuksen. Ensimmäinen palautus oli tullut jo ennen luentoa, mikä oli sangen nopeaa toimintaa... - Demo 2 julkaistaan ensi viikolla. - Demotilaisuudet starttaavat huomenna iltapäivällä. Tiistain 31.5.2011 toteuma: --------------------------- Ryhdyttiin käymään läpi x86-64 -prosessorin arkkitehtuuria (arkkitehtuuri tarkoittaa tässä siis rekisterien ja mahdollisten käskyjen joukkoa; tämä kuvataan 5-osaisessa manuaalissa, jossa on yhteensä tuhansia sivuja; esimerkki on haasteellinen, mutta uskon että poimittujen esimerkkien kautta voidaan hahmottaa perusideat sekä saada valmius opetella lisää, mikäli tarve jossain vaiheessa sellaista vaatii.) Katsottiin hiukan luetteloa rekistereistä ja erilaisista rooleista, erityisesti huomion alla käyttäjän näkemät rekisterit. Lupailin jossain vaiheessa kurssia listata vastaavasti myös ainoastaan käyttöjärjestelmän käytössä olevia rekistereitä. Esimerkiksi kaikissa prosessoreissa on jonkinlainen käskyosoitin (instruction pointer, IP) ja jonkinlainen lippurekisteri (FLAGS). Esim. vähennyslaskun lopputuloksen ollessa negatiivinen prosessori "nostaa tuloksen negatiivisuutta osoittavan lipun" eli jättää tietyn bitin lippurekisterissä ykköseksi. [Esimerkki ehdollisesta hyppykäskystä jonkin lipun (=jonkin FLAGS-rekisterin bitin) perusteella nähtiin jo viime viikon luennolla. Asiaan kenties palataan hetkeksi; palataankin tosiaan, koska suoritusjärjestystä ei ole ihan täysin loppuun asti vielä käsitelty.] Lähestyttiin symbolisen konekielen notaatiota. AT&T ja Intel -notaatiot eroavat operandien järjestyksen osalta. Tällä kurssilla käytetään yksinomaan AT&T -syntaksia, jossa lähdeoperandi on vasemmalla puolella ja kohde oikealla. Siis notaation mielessä bitit kopioituvat "vasemmalta oikealle" ja laskennan tulokset tallentuvat oikeanpuolimmaiseksi merkittyyn kohteeseen. Aloitettiin miettimällä yksittäisten konekielisten käskyjen tekemiä toimenpiteitä siinä järjestyksessä kuin ne edellisen luennon esimerkkiohjelman assembler-käännöksestä löytyivät, miettimättä kuitenkaan vielä laisinkaan kokonaisuuden toimintaa. Aloitettiin sattumanvaraisesti eräästä siirtokäskystä. Sitten nähtiin myös vähennyslasku. Vastaan tuli muutama erilainen osoitusmuoto: - Yksinkertaisimmillaan kahden rekisterin välinen operaatio - Mahdollista myös että operandit "epäsuorasti" viitattuja kohteita eli muistipaikkoja jotka löytyvät rekisterissä olevan osoitteen perusteella - Todettiin että ohjelmalla on oma muistiavaruus, x86-64:ssä yksinkertainen nollasta alkava joukko osoitteita, joista osa kartoittuu (automaattisesti, prosessorin elektroniikan hoitamana) fyysiseen muistiin ja osa on kartoittamatonta aluetta, jonka käyttö vahingossa on estetty väkipakolla. - Käyttöjärjestelmän eräs tärkeä tehtävä on muistinhallinta (engl. memory management), eli mm. kartoittaa fyysinen muisti eri ohjelmien käyttöön, yhteistyössä prosessorilaitteen kanssa. (asiaan palataan hieman tarkemmin) - Ai niin, ohimennen sanoen, eräs tärkeä käyttöjärjestelmän tehtävä on ylipäätään käynnistää ohjelmat. (tähänkin asiaan palataan tarkemmin). Miten paikalliset muuttujat ja aliohjelmat voidaan näppärästi hoitaa - suorituspino ja pinokehys. (Alustavasti; täydennettävä vielä hiukan.)