[asembler] pliki COM

0

czesc. podobno w plikach com kod programu przesuniety jest w stosunku do poczatku segmentu o 100h bajtow. I teraz takie pytanie : czy windows nadal uzywa segmentacji pamieci ? chyba nie... a pliki com nadal istnieja... wiec jak to jest ? poza tym mam pytanie co do ladowania programow do pamieci z segmentacja, czy kazdy program ma byc ladowany do odzielnego segmentu ?

pzdr, opx

0

Windows pracuje w trybie wirtualnym v86 => http://pl.wikipedia.org/wiki/Tryb_wirtualny tak więc wszystko działa jak należy :)
A jeżeli chodzi o drugie pytanie, to każdy program działa w innym segmencie ? inaczej by się nadpisywały. Segmenty można ustalać co 16 bajtów więc nie jest to żadna przeszkoda.

0

Ad2. Nie, kazdy program jest w segmencie 100h, z tym, ze kazdy program ma swoja przestrzen adresowa i tak na prawde moze byc (a wlasciwie na 100% jest) gdzie indziej, mimo to widzi jakby byl w 100h.

0

hmm a przypadkiem 100h to nie jest częśc offsetowa :P natomiast segment jest dowolny? wystarczy uruchomić dowolny debuger... np. windowsowy debug.exe ? :>

0

No tak, 100h to jest offset, ale co za problem zamist 0:100h zrobic 10h:0 czy jakie tam ma przesuniecie segment :)

0

czyli mam rozumiec ze windows wkorzystuje segmentowanie i stronicowanie ? czy stronicowanie moze byc wykorzysywane jednoczesnie z segmentowaniem ? czy nie sa to raczej dwa oddzielne sposoby podzialu pamieci ? pozaty mam pytanie co to znaczy ze poczatek segmentu moze byc ustalany co 16 bajtow ( czyli na wstepie pamieci nie jest podzielona (zsegmentowana) dopiero to jak podzieli ja OS ) ? mam rozumiec ze jesli tak jest to system operacyjny mimowszystko ustala kolejne uzyteczne segmenty liniowo bo jesli by tak nie bylo to byloby to strasznie marnotrawienie pamieci, bo np jedna przestrzen adresowa segmentu nie moglaby sie zmiescic w jakiejs przestrzeni adresowej bo np. tam gdzie konczyl bys sie owy segment zaczynalby sie nastepny... chyba ze jest tak ze tak naprawde jest to zrobione jakos wirtualnie ze wcale nie musza te segmenty byc upakowane liniowo a i tak pamiec jest wykorzystywana cala. Dalej mam pytanie w zwiazku z adresowaniem 16 bitowym w trybie rzeczywistym lub wirtualnym... skoro adresowanie jest 16 bitowe to program ma dostep tylko do 1MB pamieci i teraz dwa pytania czy tylko do pamieci swojego kodu czy tez do pamieci ktory jest poza kodem i drugie pytanie co jesli program jest dluzszy niz 1MB ?

0

Ale namotales :)

czyli mam rozumiec ze windows wkorzystuje segmentowanie i stronicowanie ?

Segmentacja dziala zawsze, z tym, ze w rmode jest ustawiona na sztywno (tam segmenty maja rozmiar 64b i ich poczatek jest co 16b [jak pomylilem wartosci to krzyczec] przez co one na siebie "nachodza") a w pmode programista osa sam moze sobie zrobic segmenty jakie i gdzie chce. Stronicowanie Windows tez wykorzystuje po to aby stworzyc oddzielne przestrzenie. W v86 natomiast MMU (stronicowanie) wciaz dziala, lecz adresuje sie tak jak w rmode, wyglada to mniej wiecej tak:

[jakas operacja na wskazniku] -> segmentowanie w stylu 80186 -> LDT (jesli jest, ale w windows bodaj jest) -> GDT (stronicowanie pmode) -> MMU (stronicowanie).

czy nie sa to raczej dwa oddzielne sposoby podzialu pamieci ?

Sa, ale moga dzialac rownolegle, pierw segmentacja, potem stronicowanie (jak w przykladzie).

pozaty mam pytanie co to znaczy ze poczatek segmentu moze byc ustalany co 16 bajtow ( czyli na wstepie pamieci nie jest podzielona (zsegmentowana) dopiero to jak podzieli ja OS ) ?

W pmode dzieli to OS, w rmode jest na sztywno ustawione, w v86 jest mix :)

Dalej mam pytanie w zwiazku z adresowaniem 16 bitowym w trybie rzeczywistym lub wirtualnym... skoro adresowanie jest 16 bitowe to program ma dostep tylko do 1MB pamieci i teraz dwa pytania czy tylko do pamieci swojego kodu czy tez do pamieci ktory jest poza kodem i drugie pytanie co jesli program jest dluzszy niz 1MB ?

Prawdopodobnie Windows go utnie :)

Z tym marnotrawieniem nie chce mi sie dochodzic o to chodzi ale to jest tak, ze dzieki stronicowaniu wirtualnie pamiec jest liniowa, a fizycznie dziurawa jak pofragmentowany dysk, po to jest MM w systemie zeby tym zarzadzac :)

0

Przepraszam za taka niechlujnosc.

  1. Skoro segmenty na siebie nachodza to dlaczego programy na siebie nie nachodza ?

Stronicowanie Windows tez wykorzystuje po to aby stworzyc oddzielne przestrzenie.

Co dla ciebie znaczy stworzyc oddzielne przestrzenie ?

  1. Co tak w ogole daje nam stronicowanie ( wydaje mi sie ze to ze dane moga byc rozproszone po calej pamieci a stronicowanie robi cos takiego ze sklada je do kupy jakos i daje nam w postaci stron ) ? niby czytalem na wikipedii ale niestety niedokonca to rozumiem...

  2. co to jest LDT , GDT , MMU ?

  3. I w koncu nie wiem jak to jest z tym adresowaniem 16 bitowym... czy 1MB mozna wykorzystac tylko odwolujac sie do wlasnego kodu programu ? no i co jesli program jest dluzszy ?

  4. W programie napisanym w jezyku ASM mozna dzieki takim dyrektywa jak segment w pewnym nazwanym segmencie stworzyc kod albo dane ... jak wtedy takie segmenty sa upakowane w pamieci czy faktycznie dane sa oddzielnych segmentach jesli tak to czy te segmenty leza jeden obok drugiego ?
    Co jesli chcemy sie odwolac do danych z jakiegos segmentu a segment lezy poza ta dana nam przestrzenia adresowa 1MB jak sie do niego odwolac ?

Dziekuje za wszystkie odpowiedzi...

0
  1. Skoro segmenty na siebie nachodza to dlaczego programy na siebie nie nachodza ?

Bo kazdy program ma swoja przestrzen adresowa, czyli w programie A pod adresem np 1000h jest co innego niz w programie B pod tym samym adresem.

  1. Co tak w ogole daje nam stronicowanie ( wydaje mi sie ze to ze dane moga byc rozproszone po calej pamieci a stronicowanie robi cos takiego ze sklada je do kupy jakos i daje nam w postaci stron ) ?

Dzieki stronicowaniu mozemy zmapowac pamiec np tak, ze adres 1000h wskazuje tak na prawde na adres 0 (przyklad).

  1. co to jest LDT , GDT , MMU ?

Powiedzmy, ze LDT i GDT sluza do segmentacji w pmode a MMU odpowiada za stronicowanie.

  1. I w koncu nie wiem jak to jest z tym adresowaniem 16 bitowym... czy 1MB mozna wykorzystac tylko odwolujac sie do wlasnego kodu programu ?

Jesli program jest 16 bitowy to tak.

Co jesli chcemy sie odwolac do danych z jakiegos segmentu a segment lezy poza ta dana nam przestrzenia adresowa 1MB jak sie do niego odwolac ?

Po to jest system operacyjny zeby tego uniknac.

0

W dawnych czasach było tak:
Miałeś 16 bitowe rejestry, a pamięci miałeś max 1 MB i już.
16 bitami możesz zaadresować tylko 64kB. 20 bitowy adres fizyczny [u]procesor[/u] obliczał następująco: SEGMENT*16 + OFFSET.
SEGMENT i OFFSET to 16 bitowe rejestr np. DS i AX.
I stąd segmenty mogą zaczynać się co 16 bajtów, segment ma 64k (adresowane offsetem).
Stronicowanie dotyczy pamięci wirtualnej i z założenia jest dla ciebie niewidoczne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1