Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

VM podsistem

[es] :: Kernel i OS programiranje :: VM podsistem

[ Pregleda: 2848 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

random
Vladimir Vrzić
Beograd

Član broj: 85
Poruke: 3866
*.dial.InfoSky.Net

Sajt: www.last.fm/user/vrza


+4 Profil

icon VM podsistem09.01.2003. u 19:22 - pre 208 meseci
Onako iz kurioziteta, a i da pomognem da se razvije novi forum, interesuje me sledeće: kako je u različitim operativnim sistemima (Linux, Windows, BSD) i na različitim arhitekturama implementirana virtuelna memorija (da li je izdeljena na stranice, segmente ili kombinovano, kako je organizovan swap fajl/particija i slično)?
int rand(void);

Those who do not understand Unix are condemned to reinvent it, poorly.

Upali lampicu — koristi Jabber!
 
Odgovor na temu

Nikola Krivokapic
Beograd

Član broj: 7267
Poruke: 49
*.cg.yu



Profil

icon Re: VM podsistem09.01.2003. u 22:30 - pre 208 meseci
Koncept je slican kod svih unixoidnih osova pa cu se potruditi da detaljnije objasnim kako je to regulisano u linuxu.

Izabrane stranice smjestene su na disk u okviru swap dijela,koji moze postojati na disku u obliku fajla ili particije.Moze biti deifinisano vise swap dijelova a njihov broj odredjuje MAX_SWAPFILES makro koji je obicno postavljen na 8.U swap dijelu se nalazi vise "page slotova" koji sadrze stranice i velicina page slota je 4096 bajtova.Prvi taj slot u swap dijelu sadzi nesto informacija o samom swap dijelu.Te informacije se nalaze u dvijema strukturama swap_header unije(info i magic strukture).Zanimljiva je info struktura koja sadrzi sljedeca polja:
info.bootbits
info.version
info.last_page
info.nr_bedpages
info.padding[125]
info.badpages[1]
Ako nekog zanima mozemo objasniti funkciju svakog polja.
E sad svaki swap dio na disk ima svoj swap_info_struct deskriptor u memoriji,koji takodje ima polja koja opisuju swap dio.Po meni je najvaznije flags polje,koje je unsigned int typa i sadrzi dva subpolja:
SWP_USED
Postavljeno je ako je odredjeni swap dio aktivan,a ako nije stavljena je 0.
SWP_WRITEOK
Ovo je kao permission,ako je postavljena 3 ako je moguce pisati u swap dio a 0 ako nije.Na swap se moze pisati samo ako je SWP_USED postavljeno na 1 to jest ako je aktivan taj swap dio.
To bi bilo kratko objasnjenje kako je to regulisanona linuxu,ako sam nesto pogrijesio ili lose objasnio ispravite me,pitajte.
Kod windowsa postoje swap fajlovi koji se u windows 98 zovu Windows Swap Fajlovi a u 2000 i XP Windows Page Fajlovi.Velicina moze da varira.Swap fajl u windows 98 sistemu se nalazi u root direktorijumu windowsa pod nazivom WIN386.SWP.
FreeBSD implementira na slican nacin virtuelnu memoriju pomocu swap fajlova.Na sistemu mozemo vidjeti koji su fajlovi trenutno aktivni pomocu komande swapinfo.
To je od prilike to.Ovdje je opisana samo x86 arhitektura.
Ako neko zna vise o windows i freebsd virtuelnoj memoriji neka se raspise,ja moram sad da zurim da jedem nesto:)pozdraf
VANDIT
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-2.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: VM podsistem12.01.2003. u 13:47 - pre 208 meseci
Meni se više čini da nije to bilo pitanje.

Pored toga, pošto govorimo o IA32 (šteta što kod nas nemamo mnogo prilike za upoznavanje sa drugim arhitekturama), Intel koristi izraz ,,virtuelna memorija'' ne za memoriju koja se emulira pomoću diskova i slično, već za dodatan sloj koji obezbeđuje virtuelne adrese. Dodatak ,,Present'' i ,,Dirty'' flagova u definiciji segmenata i stranica je samo jedna pogodnost koja je omogućila da se trenutno ne korišćene stranice/segmenti ne nalaze u fizičkoj memoriji.


Za Linux znam da segmente ne koristi (koliko IA32 dopušta da se ne koriste -- znači 4Gb je mapirano u jedan veliki segment), a straničenje se naravno koristi.

Na IA32 je nemoguće izbeći upotrebu segmentiranja (makar i postojao jedan segment; opet, ne može biti jedan, pošto postoji zaseban segment za kod u koji se ne može pisati, zaseban za podatke itd. ali svi su mapirani na 0--4Gb), ali pretpostavljam da se u modernim sistemima retko koristi (suviše je komplikovano dinamički menjati LDT i GDT, ili mi se makar čini) osim pomenutog ,,nesegmentiranog'' načina.

Čini mi se da je ovo i uobičajen trend: straničenje je dovoljno da se obezbedi dovoljna zaštita, a mnogo se lakše implementira.

Međutim, čini mi se da bi u nekim aplikacijama implementiranje VM-a preko segmenata, i njihov ,,swap'' na disku bilo bolje rešenje. Svakako, jedno naročito zanimljivo rešenje je da u ,,multitasking'' operativnom sistemu svaki proces dobija svoje segmente, i da se oni u potpunosti swapuju na disk kada zatreba memorije drugim procesima. Ali, ne znam da postoji nijedan pravi OS koji to ovako implementira.

Ali, ni ja ne znam potpun odgovor, ali verujem da svi moderni operativni sistemi koriste isti princip kao i Linux (možda se dodaje neki manji segment za jezgro, ali svi ostali procesi rade sa globalnim adresama).

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Nikola Krivokapic
Beograd

Član broj: 7267
Poruke: 49
*.cg.yu



Profil

icon Re: VM podsistem12.01.2003. u 16:07 - pre 208 meseci
Hm,90 pregleda a niko neželi da se uključi u raspravu...
VANDIT
 
Odgovor na temu

random
Vladimir Vrzić
Beograd

Član broj: 85
Poruke: 3866
*.f.bg.ac.yu

Sajt: www.last.fm/user/vrza


+4 Profil

icon Re: VM podsistem13.01.2003. u 16:56 - pre 208 meseci
Hvala tOwk, u tom pravcu je moje pitanje bilo upućeno. Ja sam zapravo mislio da se koristi segmentno-stranična organizacija VM (virtuelni adresni prostor procesa je podeljen na segmente, a segmenti su podeljeni u stranice, čime se i dalje olakšava swapovanje, ubrzava prevođenje virtuelnih adresa i smanjuje fragmentacija fizičke memorije, a opet dobijaju prednosti segmentne organizacije). Ako nije tako, već kao što ti kažeš -- jedan segment po procesu -- kako se onda [na Linuxu] obezbeđuje da proces ne može da piše po svom txt i data segmentu, već samo po steku, tj. heap-u? I kako dolazi do segmentation violation situacije, ako segmenata nema?
int rand(void);

Those who do not understand Unix are condemned to reinvent it, poorly.

Upali lampicu — koristi Jabber!
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: VM podsistem14.01.2003. u 10:39 - pre 208 meseci
Objašnjenje je veoma jednostavno.

Kao što sigurno znaš, zaštitu memorije je na x86 arhitekturi moguće obezbediti i kroz straničenje (,,page fault'': na Linux-u se koristi zasebni virtuelni adresni prostor/virtuelna memorija za pojedinačni proces). Kako ne postoji SIGPAGEV :), a SIGSEGV se definiše U SUS/POSIX specifikaciji (na http://www.opengroup.org/mem_o...4009965/basedefs/signal.h.html) kao ,,Invalid memory reference'', jasno je da se taj signal koristi za ove potrebe. Sigurno je tekst ,,Segmentation violation'' ostao iz nekih ranijih dana.

A lepo si i sam primetio: ,,kako se onda obezbeđuje da proces ne može da piše po svom txt i data segmentu, već samo po steku''? Mislim da je upravo to ono što omogućava sve drage nam ,,buffer-overflow-e'' gde se zatim nekako i pokrene taj kod koji bi se morao nalaziti u stek segmentu (ili kojem već, ali ne zajedno sa kodom). Da to nije slučaj, i da svi ti segmenti nisu mapirani na iste adrese, zaštita od prekoračenja bafera bi se, čini mi se, lakše obezbedila (tj. na hardverskom nivou, ali jasno je koliko je to složeno uraditi pomoću baratanja segmentima, dinamička izmena veličine segmenata itd.).

Zbog toga Linux (i većina ostalih x86 OS-eva) spada u tip operativnih sistema koji brinu samo o svojoj sigurnosti: korisnički program ne može naštetiti jezgru niti drugim programima (osim ako je naravno pokrenut u ring0, ali onda ga ne zovemo ,,korisničkim''), već samo sebi i na njemu je odgovornost da bude dobro napisan.

E sad, prethodna dva pasusa nisu zasnovana na pravom znanju, već na pogađanju šta bi moglo biti šta, i zato ih ne uzimajte zdravo za gotovo. U analizi ima dosta nedostataka, ali zaista ne poznajem sve detalje konkretne implementacije (Linux-a) da bih mogao biti siguran.

Dodaću još nešto karakteristično za IA32. Scenario koji si opisao (virtuelni adresni prostor procesa je podeljen na segmente, a segmenti su podeljeni u stranice) je nemoguć na ovoj arhitekturi. Prvenstveno zbog toga što ,,virtuelni adresni prostor'' podrazumeva upotrebu straničenja (tj. on se i obezbeđuje pomoću stranica), a segmentiranje se uvek vrši ,,na'' virtuelnom adresnom prostoru (ako smatramo da kada nema straničenja onda on predstavlja ,,linearni adresni prostor'').

Priznajem da je prošlo dosta vremena od kada sam ja poslednji put čitao o ovome u Intel Pentium System Developers' referencama, pa sam možda malo pomešao terminologiju (možda treba zameniti ,,linearni'' i ,,virtuelni'') koju oni koriste, ali se nadam da je ostalo ispravno. Ukoliko nije, slobodno me ispravite.

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

[es] :: Kernel i OS programiranje :: VM podsistem

[ Pregleda: 2848 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.