[asembler] kilka pytan poczatkujacego

0

hej
jestem tutaj nowy wiec przede wszystkim witam spolecznosc

a teraz biznes :-) czyli kilka pytan o asma a moze w sumie bardziej o podstawy dzialania kompow:

  1. w systemach 16-bit mozna zaadresowac maks 1 mb pamieci: segmentowy rejestr (tak to sie chyba zwie) moze miec maks 216 wartosci (65536) * 16 (bo tyle jest bajtow w kazdym segmencie, ktora sie nie powtarza w innych segmentach czyli 1 mb. A jak to wyglada w systemach 32 bit i 64 bit? Czy segmenty sa poprzesuwane odpowiednio o 32 i 64 bity? czytalem gdzies ze systemy 32 bit maja adresowalne 232 bajty pamieci, ale skad to 232? wg analogii z 16-bit powinno byc 232 * 16(lub 32 jesli segmenty sa przesuwane co 32 bajty)?

  2. co to XMS i EMS? w czym one pomagaja?

  3. pamiec konwencjonalna miala ok 640kb, ale odjac od tego nalezy jakies przerwania i pamiec biosa itp prawda? czyli wychodzi jej ostatecznie duzo mnie?

  4. jesli programy maja dostepne tylko pierwsze 640kb pamieci, to znaczy ze ich kod i dane musza sie znajdowac w tych granicach? czy jak uruchomie wiele programow, to kod kolejnego moze jakos nadpisac kod poprzedniego, jesli juz sie nie mieszcza? to samo z danymi, czy mozna nadpisac dane innego programu (potencjalnie kod ktory ma sie wykonac?)

  5. asembler pod windows - czy moge sie swobodnie odnosic do kazdego adresowalnego bajta pamieci i swodobnie pisac sobie co mi sie tam podoba?

za wszelkie odpowiedzi dziekuje
jesli nie macie nic przeciwko, to zeby nie zakladac nowego tematu moglbym pisac tutaj kolejne pytania? bo na pewno beda bo mam zamiar to lyknac chociaz w teorii a pewnie wiele nie bede wiedziec

pozdrawiam

0
poczatkujacy asm napisał(a)
  1. w systemach 16-bit mozna zaadresowac maks 1 mb pamieci: segmentowy rejestr (tak to sie chyba zwie) moze miec maks 216 wartosci (65536) * 16 (bo tyle jest bajtow w kazdym segmencie, ktora sie nie powtarza w innych segmentach czyli 1 mb. A jak to wyglada w systemach 32 bit i 64 bit? Czy segmenty sa poprzesuwane odpowiednio o 32 i 64 bity? czytalem gdzies ze systemy 32 bit maja adresowalne 232 bajty pamieci, ale skad to 232? wg analogii z 16-bit powinno byc 232 * 16(lub 32 jesli segmenty sa przesuwane co 32 bajty)?

32Bit to w trybie chronionym. Tutaj wchodzi raczej mechanizm stronnicowania - pamięć wirtualna podzielona na bloki po 4 kB badź MB. Zapoznaj się z manualami intela, konkretnie 1 i 3 i
http://pl.wikipedia.org/wiki/Stronicowanie_pamięci

  1. co to XMS i EMS? w czym one pomagaja?

http://pl.wikipedia.org/wiki/XMS
http://pl.wikipedia.org/wiki/EMS_(informatyka)

  1. pamiec konwencjonalna miala ok 640kb, ale odjac od tego nalezy jakies przerwania i pamiec biosa itp prawda? czyli wychodzi jej ostatecznie duzo mnie?

Zależy... Tyle to masz w trybie 16bit bez rozszerzeń pamięci...

  1. jesli programy maja dostepne tylko pierwsze 640kb pamieci, to znaczy ze ich kod i dane musza sie znajdowac w tych granicach? czy jak uruchomie wiele programow, to kod kolejnego moze jakos nadpisac kod poprzedniego, jesli juz sie nie mieszcza? to samo z danymi, czy mozna nadpisac dane innego programu (potencjalnie kod ktory ma sie wykonac?)

Miały dostępne... od wielu lat każdy system operacyjny pracuje w 32bit trybie chronionym. Każdy program ma własną, niezależną przestrzeń adresową - 4GB. Wcześniej owszem, programy widziały siebie wzajemnie, co więcej mogły nadpisywać nieswoją pamięć - jeden wadliwy program mógł wysypać wszystkie inne. Teraz każdy program ma oddzielną pamięć wirtualną, mapowaną na pamięć fizyczną.

  1. asembler pod windows - czy moge sie swobodnie odnosic do kazdego adresowalnego bajta pamieci i swodobnie pisac sobie co mi sie tam podoba?

Nie. Pod Windows pracujesz jak już wspomniałem w trybie chronionym. Segmenty mają limit 2GB /dla ring3, dla ring0 jest całe 4GB/, wyjątek to FS, segment o specjalnym znaczeniu, przechowuje tylko jedną strukturę. masz dostęp tylko do przydzielonych stron pamięci - Twój program, zaladowane biblioteki, stos, sterta, trochę struktur kontrolnych i dodatkowo doalokowane strony...

jesli nie macie nic przeciwko, to zeby nie zakladac nowego tematu moglbym pisac tutaj kolejne pytania?

Jasne :-)

0

napisales ze teraz kazdy program ma swoje 4GB pamieci wirtualnej mapowanej na fizyczna
czy to oznacza ze jeden program nie moze przekroczyc tych 4 GB? a jak przekroczy to sie wysypuje? np powiedzmy taka wirtualna maszyna javy - nie wiem czy to mozliwe ale moze taki jakis javowy kombajn jakis np websphere z uruchomionymi mnostwem aplikacji i mnostwem podlaczonych do nich uzytkwonikow moze wymagac wiecej niz te 4 GB - jesli moze to co w takiej sytuacji sie dzieje? java.lang.OutOfMemoyException?

aha, jakos ze dopiero sie ucze, to wszystkie informacje ktore czytam dotycza takiego starego asma, w trybie rzeczywistym zdaje sie, z tymi ograniczeniami
moglbys mi powiedziec jak te 4 GB mozna obliczyc? skad to sie bierze?

wielkie dzieki za odpowiedz

tak na marginesie to fajnie tak sobie o tym poczytac, mozna sie dowiedziec jak na prawde dziala taki program, mimo ze napisany w czymstam innym

pozdrawiam

0

Programy 32bit widzą 32bit przestrzeń adresową - 2^32 to właśnie 4GB /tzn. każdy oddzielny proces widzi oddzielną przestrzeń/. Program sam sobie pamięci nie używa dowolnie, wywołuje odpowiednią funkcję z systemu przyznającą konkretny obszar, niezależnie czy to asm czy jakiś HLL, dopiero na tak przydzielonej pamięci może operować. Użycie obszaru nie przydzielonego kończy się wyjątkiem, program się wysypuje. System może przydzielać tyle pamięci ile jest wolnych stron w danej przestrzeni adresowej. Więcej się nie da. A, że maszyna wirtualna może więcej? Tak jak stronnicowanie w rzeczywistym systemie zrzuca z RAMu nieużywane w danej chwili przydzielone strony do pliku tak maszyna wirtualna zrzuca dane, które nie są w danej chwili potrzebne na dysk robiąc miejsce na inne.

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