Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Käyttöjärjestemäriippumaton koodi ja Oma käyttis. (ASM)

jurna [25.04.2005 16:16:49]

#

Nyyppä olen tällä saralla :)

..Ja täälläkin tästä on keskusteltu ja moneen kertaan. olen lukenut, mutta jotkut asiat ovat muodostaneet kysymyksiä päähäni..

Haluan ymmärtää käyttöjärjestelmäriippumatonta koodia enemmän. Olen lukenut käyttöjärjestelmän suunnittelua koskevaa kirjallisuutta jonkin verran ymmärtääkseni täysin "käyttöjärjestelmäriippumattoman ohjelmoinnin" käsitteen. Olen yrittänyt tiivistää ja tiivistää ajatuksiani mutta turhaan.

Olenko hakoteillä jos ajattelen tällaista käyttöjärjestelmä toimintamallia (ts. sen lataamista ja aloitusvaihetta):

DISKETTI:

Sektorit 0-1: Bootloader
Sektorit 2-3: System loader
Sektorit 4-??: Käyttöjärjestelmän ydin
Sektorit ??-??: Komentotulkki

RAM MUISTI:

(yksinkertaistettuna)

<2M = Bootloader ja systemloader.
2M-3M = kerneli
3M-?? = komentotulkki

(HUOM, typistetty esimerkki selvyyden vuoksi. Eli Boot- ja systemloaderin koko tässä on aika pieni) ja rammiin sijoitukset ovat mielivaltaisia.

Kirjoitan disketille 0 uralle 512t osan bootloaderia, 2 uralle lopun osan bootloaderista jne..
Kun tietokone käynnistetään, BIOS lukee tältä medialta (disketti) tämän 512t koodia (0-sektorilta) ja iskee sen keskusmuistin alkuun(?) josta välittömästi alkaa suorittamaan sitä ensimmäisestä käskystä (siirtää PC:tä osoittamaan tähän). Tämä 512t muistissa suoritetaan. Tämä koodi sisältää koodin, jolla BIOS:in keskeytys palveluilla ladataan loppu bootloader -ohjelmasta eli disketin sektori 2, ja sijoitetaan se edellisen perään RAMMIIN. Sijoitetusta koodista jatkeaan (toinen osa bootloaderia). Tämä koodi lataa BIOS keskeytyksillä disketin sektorit 2-3 RAMMIIN bootloaderin jatkoksi (ladattu osa on SYSTEMloaderi). Suoritetaan tämä SYSTEMloaderi koodi jossa alustetaan vaikka ensin keskeytysvekstoritauluun käyttöjärjestelmän keskeytyskäsittelijöiden osoitteet (nämä keskeytyskäsittelijät ladataan vasta ytimen yhteydessä koska kuuluvat osaksi ytimeen). Sitten SYSTEMloader vaihtaa suojattuun tilaan. Sen omilla rutiineilla (koska suojatussa tilassa BIOS keskeytyksiä ei voida käyttää) ladataan 4-?? sektorit disketiltä RAMMIIN (vaikka 2M kohdalle) jotka sisältää käyttöjärjestelmän ytimen (kernel). Tämän jälkeen ladataan vielä komentotulkki joka on disketillä heti ytimen jälkeen. Oletetaan että ydin vie keskusmuistista 1M tilaa kaikkine tarpeineen, joten sijoitamme komentotulkin RAMMIIN 3M kohdalle. Sitten systemloader lataa disketiltä komentotulkin (joka on oma ohjelma) rammiin ytimen jälkeen.

Mitä sitten?

BOOTLOADER:

-(first 512t, 0-sektori disketillä) Kutsuu BIOS keskeytyksiä ja lataa niillä disketin 2. sektorin(1) muistiin
-(sec. 512t, 1-sektori disketillä) lataa systemloaderin RAM-muistiin disketin sektoreilta 2-3

SYSTEMLOADER:

-Alustaa keskeytysvektoritaulun käyttöjärjestelmän keskeytyksille.
-Vaihtaa suojattuun tilaan (32bit)
-Pienet rutiinit disketiltä lukemiseen joilla..
-Lataa medialta (disketti) käyttöjärjestelmän ytimen RAMMIIN

YDIN (kernel):

-Sisältää käyttöjärjestelmän keskeytyskäsittelijät
-Käyttöjärjestelmän palveluproseduureja
-Muistinhallinnan
-Laiteajurit
ym..

KOMENTOTULKKI (konkreettinen käyttöliittymä käyttikseen):

-Esim DOSsissa oleva command.com.
-Tulkitsee käyttäjän syöttämän merkkijonon ja tunnistaa käskyn ja parametrit. Suorittaa käskyn.
Pyytää mahdollisesti kerneliltä palveluita ja palvelut kernelissä suorittavat käyttöjärjestelmäkeskeytyksiä, tulos lähetetään komentotulkille joka käsittelee sen ja tulostaa (tai tekee jotain muuta) komentotulkkiin käyttäjän nähtäväksi. Ääh vaikea selittää.


Sitten vielä ekstra pohtimista:

1. Pohtikaa tuota yllä olevaa. Olenko täysin hakoteilllä?

2. Onko DOS (ja sen muunnelmat ja kloonit) käyttöjärjestelmiä? (IO.sys, MS_DOS.sys, COMMAND.COM) = pelkästään kasa keskeytyksiä ja palvelurutiineja. Pelkästään eräajo eli yksiajo käyttis..

3. Miksi täytyy käyttää keskeytysvektoritaulukkoa ja sen muistialuetta RAM muistissa, miksi en voisi luoda uutta vektoritaulukkoa (ja keskeytysjärjestelmää) jonnekin päin keskusmuistia puhuttaessa omien keskeytyskäsittelijöiden luonnista? Miksi pitäisi edes käyttää mihinkään keskeytyksiä?
(tiedän periaatteen että ympäristö, kuten prosessorin rekisterit ja liput talletetaan ja palautetaan keskeytyksen jälkeen mutta.. Onko tätä pakko toteuttaa keskeytys periaatteella)

4. Miten laiteohjaimet toimii? Ovatko ne kasa keskeytyksiä (joiden käsittelijöiden osoitteet tallennetaan keskeytysvektoritauluun) vai kasa joitakin itsenäisiä prosesseja tai ohjelman pätkiä jossakin päin RAMmia.

5. Miten BIOS:in tai DOS:in keskeytyksen osaavat ohjata eri laite malleja (valmistajien takemiä) disketti, näyttökortti ja muita oheislaitteita oletuksena? eivätkö näiden ohjaukset ole valmistajasta ja mallista kiinni? Onko jokin standardi?

6. Mitä on Cygwin, bochs?

7. Käyttöjärjestelmää luodessa miten pitäisi sijoittaa mitkäkin osaset (käyttöjärjestelmän ytimen, datataulukot, laiteajurit, keskeytyskäsittelijät, prosessien codedatat ym.) minnekin päin muistiavaruutta? Mitä kannattaa ottaa huomioon?

8. Mitenkä kerneli pystyy estämään käynnissä olevien prosessien eli ohjelmien muistin käyttämistä niin, että ne eivät voisi mielivaltaisesti kirjoittaa esim. kernelin päälle mitään. Tämähän edellyttäisi sitä että kernelin on tavallaan tulkittava jokainen opkoodi suoritettavan prosessin (ohjelma) koodista erikseen ja katsoa mitä se tekee ja jos se on sallittava toimenpide, niin kerneli päästää prosessorin suorittamaan sen. Onko näin? Tämähän tarkoittaisi että käyttiksessä ohjelman suoritukseen tulisi ylimääräinen välikäsi ja linkki (joka olisi tämä kernel) joka näinollen hidastaa toimintaa ja ohjelman suoritusta.

ville-v [25.04.2005 18:05:50]

#

Ensinnäkin komentotulkki kuuluu kerneliin. Toiseksi, mitä tarkoitat pohdinnalla kaksi?

Grey [25.04.2005 19:05:55]

#

Olen itsekin miettinyt tuollaista. En tosin ole mitään toteuttanut, paitsi suunnitteluasteella. Dokumenttejakaan en ole niin paljoa lukenut kuin sinä, vaan enemmänkin tehnyt päättelytyötä siitä miten asioiden kannattaa toimia. Huvittavaa kyllä, mutta olen onnistunut sitä kautta suunnittelemaan rakenteita joita on ollut jo käytössä muualla ja olen sellaisen seikan huomannut vasta jälkikäteen, eli aika hyvin minulta.

Kuitenkin, koska huomaan kiinnostuneeni tästä asiasta, niin voisimme varmaan pitää yhteyttä yksityiselläkin linjalla? Kuten mailitse esim. Yhteystietoni löytyvät profiilista. Voimme esim. jakaa omia näkemyksiämme asioista ja yhdistää ne. Ehkäpä saisimme jotakin aikaan, kun kummallakin tuntuu olevan käyttökelpoisia suunnitelmia ^__^

-Grey-

Metabolix [25.04.2005 20:15:01]

#

1. Et ole.

2. On käyttöjärjestelmiä.

4. Yleensä kyseessä on rajapinta, jonka ideana on että käyttäjä voi esim. printterin mallista riippumatta antaa sille saman komennon, ja ohjain tekee tarvittavat toimenpiteet laitteelle sopivalla tavalla. Eli jonkinlainen funktiokasa.

5. Perusasioihin löytyy standardi, eli levykeasemat ja näytönohjainten perusnäyttötilat (ainakin 320x200x256 ja tekstitila) toimivat samalla tavalla. Pidemmälle liikuttaessa tulevat kehiin nuo edellä mainitut ohjaimet.

6. Cygwin on jonkinlainen Linux-kerneliä vastaava DLL, jonka avulla Linuxia voidaan käyttää Windowsista käsin. Voi sitä varmaankin kutsua myös Linux-emulaattoriksi. Bochs on astetta laajempi emulaattori, joka käsittääkseni emuloi x86-konetta ja laitteistoa.

7. En tiedä, mutta sanoisin, että kernel ja muu muuttumaton tavara kannattaa sijoittaa alkupuolelle ja ohjelmat, jotka voivat joskus sammua, sinne, missä on tilaa.

jurna [29.04.2005 19:38:36]

#

Lisää kysymyksiä:

En oikein tajua GDT, IDT ja LDT:n merkitystä. Tiedän sen, että esim. GDT sisältää deskriptoreita jotka sisältävät segmentin muistialueen ja rajat ja oikeudet (kirjotus, luku ym.)

Eikös maalaisjärjellä ajatellen muistin sivutus ole helppo toteuttaa esim GDT ta LDT taulua käyttäen. Eli sivutetaan koko 4G muisti vaikkapa 500kt sivuihin niin, että jokaiselle sivulle on oma deskriptori GDT taulussa. Tai sitten en tiedä toimiiko niin, jos jokaiselle sivulle luodaan oma GDT taulu ja sivua vaihdettaessa muutetaan vain GDTR rekisteri osoittamaan oikeeseen GDT tauluun. En oikein muutenkaan ymmärrä sivutuksen toimintaperiaatetta vielä joten pyydän anteeksi :=)

Mitä eröa on GDT ja LDT tauluissa? Mikä näiden yhteys ja käyttötarkoitus toisiinsa nähden on?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta