------------------- Zarzćdzanie pamięcić w AmigaDOS -----------------  i co z tego wynika dla szarego usera, oraz (bardziej) dla programisty (kodera jeőli wolicie). Artykuî ten dedykuję grupie InvestatioN. Wstęp. programów pada. Chciaîem teţ usystematyzowaç krćţćce wsród "Dlaczego napisaîem ten tekst ?" uţytkowników informacje o pamięci zapytacie pewno, przecieţ to juţ jest Amigi. tak znane.. Niestety nie jest znane. Dowód ? Gdyby byîo znane, i gdyby Tekst ten ma 2 częőci - 'Szary programiőci się do tego stosowali na Uzytkownik' i 'Programista'. Częőç mojej A2000 uruchamiaîyby się pierwsza to porady praktyczne, jak wszystkie programy. A tym czasem pracowaç aby efektywnie wykorzystaç 20-30% zwîaszcza tych 'scenowych' to co juţ w komputerze jest.  ********************************** strona 2 ************************************ Częőç druga traktuje o tym jak programistów (patrz częőç druga). programista powinien z pamięci Pamięç CHIP to pamięç w której korzystaç aby jego program dziaîaî zapisywane byç mogć zarówno dane i poprawnie na wszystkich (takţe programy koprocesorów (graficznego i przyszîych) Amigach. dűwiękowego) jak i kod dla procesora gîównego. Ma ona to do siebie, ţe jeőli zarówno procesor jak i któryő z Szary uţytkownik. koprocesorów zgîaszajć równoczeőnie ţćdanie dostępu do tej pamięci, to Z poziomu systemu operacyjnego procesor gîówny musi czekaç. mamy niewielki wpîyw na sposób Dlaczego tak jest to zrealizowane ? rozdzielania pamięci między Gdyţ operacje we/wy np generacja programami. Ale zacznijmy od dobrze obrazu muszć byç realizowane bez znanej kaţdemu (a moţe nie ?) teorii zakîóceń. Pamięç typu CHIP ma kaţdy pamięci w Amidze. Podziaîy sć dwóch model Amigi - patrz tabelka na końcu rodzajów. Po pierwsze jest znany artukuîu. Do pamięci typu FAST ma podziaî na pamięç CHIP, FAST i SLOW, dostęp wyîćcznie procesor gîówny. z drugiej strony jest podziaî na Dane czy kod w niej zapisane nie mogć pamięç lokalnć i autokonfigurowanć, byç odczytane przez koprocesory ale ten interesuje wîaőciwie tylko (wyjćtek - koprocesor arytmetyczny o  ********************************** strona 3 ************************************ ile istnieje w systemie). Jednakţe standardowć MC68k. Mogć takţe dzięki temu procesor ma występowaç konflikty pomiędzy tć nieograniczony dostęp do tej pamięci pamięcić, a zainstalowanć wczeőniej i nie musi na nic czekaç. Dzięki pamięcić FAST. Przy zakupie karty temu po zainstalowaniu pamięci FAST, najlepiej sprawdziç to obserwuje się czasami nawet doőç doőwiadczalnie. znaczne ( do ~30%) przyspieszenie dziaîania komputera. Niestety nie Istnienie pamięci typu SLOW jest, jest ona instalowana standardowo w jakby to powiedziaî biolog, ţadnym modelu oprócz chyba jedynie endemiczne dla Amigi 500. Jest to A2500, i w ţadnym teţ modelu nie moţe pamięç znajdujćca się na wkîadanym znajdowaç się bezpoőrednio na pîycie pod znajdujćcć się w dnie Amigi (na gîównej, a na doîćczanym Zachodzie nazywanć "zapadnić" - autokonfigurujćcym module czy karcie. trapdoor) klapkę, zazwyczaj 512 Na kartach szybszych procesorów kilobajtowym rozszerzeniu. Przez spotyka się czasami pamięç typu FAST system jest ona widziana jako pamięç o 32-bitowej architekturze, FAST, natomiast posiada wszystkie przeznaczonć do wspóîpracy z danym cechy charakteryzujćce pamięç CHIP, procesorem. Zazwyczaj nie jest ona îćcznie z wymuszaniem oczekiwana dostępna po przeîćczeniu komputera na procesora. Moţe byç zresztć bardzo  ********************************** strona 4 ************************************ îatwo na pamięç CHIP przeîćczona naleţy umiesciç polecenie (odpowiednie schematy byîy "Sys:System/FastMemFirst" (jeőli nie zamieszczane w polskiej prasie mamy zainstalowanego standardowego komputerowej). Dla tych którzy w tym Workbencha, podajemy odpowiednć miejscu zakrzyknć oskarţycielsko, ţe őcieţke do tego programu na dysku przecieţ nie jest ona widziana przez systemowym). O ile w konfiguracji koprocesory, odpowiadam - jest znajduje się pamięç FAST, programom widziana tylko ţe pod zupeînie innym które zgîaszajć ţćdanie przydzielenia adresem niţ widziany przez procesor pamięci bez wyszczególnienia jej $C00000 (w Amigach z Fat Agnusem). rodzaju, przydzielana będzie ona w obrębie FAST-u, co oszczędza cennć z Aby podczas pracy pamięç byîa powodu maîej jej iloőci pamięç CHIP. poprawnie i oszczędnie rozdzielana, tzn. aby to co musi byç w cennej Podczas pracy pamiętaç naleţy pamięci CHIP byîo w pamięci CHIP, a takţe, ţe w AmigaDOS praktycznie pozostaîe dane w pamięci FAST, jako wszystkie dziaîania zajmujć pewnć drugć linię w Startup-Sequence (ą) iloőç pamięci. Np: struktura (ą) W pierwszej linii powinno się tam znajdowaç polecenie 'SetPatch', a w przypadku Amigi z KickStartem 1.3 i 1 MB CHIP 'SetPatch r'.  ********************************** strona 5 ************************************ IntuitionMessage (informacja o się napisaç) przykîadem jest tu zdarzenaich typu skorzystanie z menu program Aegis VideoScape, który po czy tupnięcie na gadgecie zakończeniu pracy nie zwalnia okoîo przekazywana do programu przez system 100 KB. operacyjny) ma kilkadziesićt bajtów, i istnieje dopóki program dla którego Zjawiska takie prowadzć do tak byîa przeznaczona nie zgîosi jej zwanej fragmentacji pamięci. Tym wykorzystania. Podobnie biblioteki i którzy się z tym jeszcze nie zetknęli fonty. Z driverami urzćdzeń wyjasnię na przykîadzie. Powiedzmy, (devs:*.device) oraz handlerami ţe mamy Amigę z 2 MB pamięci CHIP. Z (L:#?-Handler) sprawa jest podobna z tego 1100 KB zajmuje system i tym ţe praktycznie niemoţliwe jest aktualnie uruchomione zadania. zwolnienie zajmowanej przez nie Pozostaîe 900 KB tworzy jeden cićgly pamięci. Jedynym wyjőciem jest blok wolnej pamięci. Uruchamiamy przeîadowanie systemu. Jest to takţe jakiő większy program, np: GNUPlot. wîaőciwie jedynym sposobem odzyskania Zajmuje on okoîo 500 KB. Następnie pamięci zajętej przez niestarannie otwieramy okno Workbencha z kilkoma napisany program, który nie zwalnia większymi ikonkami (takimi po 10-20 jej po zakończeniu pracy. KB). Zajmuje ono, powiedzy 30 KB. Kanonicznym (klinicznym, chciaîo by Wychodzimy z GNUPlot-a. Sytuacja  ********************************** strona 6 ************************************ przedtawia się następujćco. ? Przecieţ wolnej pamięci byîo 870 Workbench pokazuje okoîo 870 KB KB, a program ma tylko 600 KB. wolnej pamięci. Próbujemy zatem Owszem. Tylko, ţe aby program mógî uruchomiç jakiő naprawdę duţy program się uruchomiç, system operacyjny musi - taki którego plik wykonywalny ma zarezerwowaç cićgîy obszar pamięci 600 KB. Tupiemy dwukrotnie na jego odpowiadajćcy dîugoőci pliku z ikonę. I nic się nie dzieje, poza programem. (˛) A takiego obszaru krótkim bîyőnięciem ekranu, i zarezerwowaç nie moţe, gdyţ informacjć na listwie tytuîowej: rozîoţenie wolnej pamięci przedstawia "Error while opening nazwa_programu: się następujćco : 500 KB wolnego (tu 103" (ą). Dowolny spis numerów byî GNUPlot), 30 KB zajęte przez okno bîedów objaőni, ţe bîćd numer 103 to i ikonki, oraz 270 pozostaîej wolnej "Insufficient free store" - pamięci. W ţaden sposób nie da się z niewystarczajćca iloőç wolnej tego wykroiç cićgîego bloku na 600 pamięci. Ale dlaczego tak się dzieje KB. (ą) Tak wyglćda to w AmigaDOS 1.3 . Jak zachodzi to w 2.0 i wyţej nie wiem. (˛) Przyznaję, ţe trochę to uproőciîem dla większej przejrzystoőci. W rzeczywistoőci w pamięci muszć znaleűç się cićgîe obszary wielkoőci poszczególnych hunków programu.  ********************************** strona 7 ************************************ To jest oczywiőcie przypadek w musiaîy pozostaç w pamięci przez miarę prosty, wystarczy tylko zamknćç caîy czas, np: sterowniki okno, aby odzyskaç zajęte 30 KB i móc urzćdzeń, drivery typu MultiDOS, uruchomiç potrzebny program. DMouse czy rezydowane polecenia Niestety w czasie pracy taka maîo DOS-u. Jeőli uruchomimy np. skomplikowana sytuacja zachodzi MultiDOS-a po jakiő czasie od rzadko, i nie jest moţliwe tak proste rozpoczęcia pracy, jego *.device i zdefragmentowanie pamięci. Osobiőcie MultiDOSFileSystem lćdujć w pamiętam sytuacje, gdzie przy wolnej okolicach poîowy pamięci i pamięci rzędu 150KB wielkoőç pozostanć tam aţ do resetu, bez największego bloku wynosiîa 15 KB. ţadnej moţliwoőci usunięcia. Co robiç aby tego uniknćç ? Podam tu (ą) kilka rad stosujćc które, moţna efektywniej gospodarowaç pamięcić: o gospodarowanie pamięcić bardzo uîatwia dowolny program pokazujćcy o na poczćtku pracy naleţy stale iloőç wolnej pamięci, i co uruchamiaç te procesy które będć waţniejsze największy wolny (ą) MultiDOS-a  moţna oczywiőcie wyîćczyç (polecenie PCKillAll  lub 'Assign MDx: remove ') ale nie zwalania to zajmowanej przez niego pamięci.  ********************************** strona 8 ************************************ obszar. Osobiőçie uţywam D-Fast-a jeőli plik z programem będzie autorstwa Duddie'ego, ale istnieje większy niţ posiadana iloőç jeszcze co najmniej kilka tego pamięci CHIP, moţe uniemoţliwiç to typu programów. jego uruchomienie. Ogólnie szkody sć większe niţ zyski. o w jakimő czasopiőmie przeczytaîem kiedyő takć 'poradę' o programy, które wymagajć duţych - aby uzyskaç duţy cićgîy blok iloőci pamięci, a szczególnie pamięci, naleţy za pomocć programu duţych bloków pamięci, nie naleţy do obsîugi hunków plików pakowaç ţadnym programem typu wykonywalnych wymusiç îadowanie PowerPacker, czy Turbo Imploder. caîego programu do pamięci CHIP. Poniewaţ procedury rozpakowujćce Nie naleţy się stosowaç do takich potrzebujć duţych bloków pamięci, rad! Faktem jest, ţe po takim powoduje to jej fragmentację. potraktowaniu program pozostawi Czasami upakowywanie uniemoţliwia duţy wolny blok pamięci FAST (o uruchomienie programu - 400 ile jć oczywiőcie posiadamy). kilobajtowy program spakowany Ale! Pamięç CHIP jest cenniejsza TurboImploderem potrzebuje okoîo 1 od FAST (szczególnie jeőli mamy MB wolnej pamięci aby się jej tylko 512 KB), a poza tym uruchomiç (po rozpakowaniu  ********************************** strona 9 ************************************ wprawdzie jć zwalnia niemniej bez o Standardowy 'gumowy' ramdysk niej się nie uruchomi). RAM: i wszelkiego rodzaju 'gumowe' raddyski typu VD0: czy o przy dîuţszej pracy z RRD: (pracujćce sektorowo) przy pamięcioţernym programem, dîuţszej pracy bardzo intensywnie najlepiej podarowaç sobie fragmentujć pamięç. Wady tej nie Workbencha, i pracowaç z CLI lub ma standardowy RAD: poniewaţ caîć Shellem. Wprawdzie dla osób potrzebnć mu pamięç rezerwuje od nieprzyzwyczajonych jest to nieco razu. bardziej kîopotliwe, ale zapewniam, ţe na dîuţszć metę W tym miejscu chciaîbym wspomnieç bardziej wydajne. Workbench jeszcze o rzadko spotykanej w wprawdzie bardzo uîatwia pracę, mikrokomputerach pamięci wirtualnej. ale ma tendencję do fragmetowania Cóţ to jest ? Otóţ to jest taka pamięci wîasnymi strukturami. pamięç której fizycznie nie ma, ale Jest wprawdzie zazwyczaj mo- system operacyjny myőli ţe ona jest. ţliwe odzyskanie pamięci przez Nie ma tej pamięci jako fizycznych niego zajętej, nie zawsze jednak, koőci pamięci. Jest natomiast na nie mamy wpîywu na jej frag- twardym dysku duţy plik, w którym mentację. znajduje się zawartoőç pamięci  ********************************** strona 10 *********************************** wirtualnej. W momencie w którym pamięci wirtualnej sć rzędu procesor zgîasza ţćdanie dostępu milisekund, czyli duţo większe. Coő adresu znajdujćcego się w pamięci za coő. wirtualnej, pewiem specjalizowany ukîad, zwany MMU wczytuje do pamięci Aby komputer mógî korzystaç z fizycznej odpowiedni obszar pamięci wirtualnej musi posiadaç dysk zawierajćcy ţćdany adres i kieruje twardy oraz specjalizowany ukîad o tam operację odczytu czy zapisu. którym wspominaîem juţ wczeőniej - Wielkoőç pamięci wirtualnej jest MMU. Nazwa ta jest akronimem od ograniczona przez moţliwoőci MMU i 'Memory Management Unit' - Jednostka wielkoőç twardysku. Wynosi ona zarzćdzania pamięcić. Zadaniem tego zazwyczaj od kilkudziesięciu do ukîadu jest sterowanie dostępem do tysięcy MB(ą). Niestety o ile czasy pamięci. W komputerze z MMU fizyczny dostępu do pamięci fizycznie adres obszaru pamięci nie muszć istniejćcej wynoszć zazwyczaj 60-100 odpowiadaç adresom pod jakimi pamięç nanosekund, o tyle czasy dostępu do ta istnieje fizycznie. Procesor w (ą) Komercyjny pakiet do obsîugi pamięci wirtualnej, GigaMem, umoţliwia utworzenie cićgîej przestrzeni adresowej wielkoőci 1 GB (tak, jeden gigabajt).  ********************************** strona 11 *********************************** komputerze z MMU moţe widzieç obszar MC68k nie daje niestety moţliwoőci pamięci ktory nie istnieje jako jego uţycia. Przeznaczony do fizyczne koőci - wîaőnie pamięç wspóîpracy z procesorami Motorola wirtualnć. ukîad MMU 68851 dziaîa jedynie z procesorami 68010 i 68020 (ą). Niestety koniecznoőç posiadania Naleţy zaopatrzyç się w lepszy MMU, oraz twardego dysku znacznie procesor, kupujćc tak zwanć 'kartę ogranicza moţliwoőç korzystania z turbo'. Zazwyczaj majć one MMU od pamięci wirtualnej. Bez dodatkowych razu wbudowane lub moţliwoőç jego nakîadów korzystaç z niej mogć tylko zainstalowania. Przy kupnie pamiętaç posiadacze A2500 i A3000 z twardym warto, űe procesory 68030 i 040 majć dyskiem. Posiadacze innych typów MMU zintegrowane ze sobć w jednej Amigi muszć szarpnćç się najpierw na koőci (˛). Zakupiç wreszcie naleţy twardy dysk. Pozostaje problem MMU. program do obsîugi tej pamięci (ą) Niestety zastosowany w A1200 procesor pozbawiony jest tej moţliwoőci. (˛) Istniejć takţe tańsze, uproszczone wîaőnie przez odjęcie m.in MMU wersje tych procesorów oznaczone 68EC030 i 68EC040 . Jeőli juţ decydujemy się na taki zakup, naleţy upewniç się którć wersję kupujemy.  ********************************** strona 12 *********************************** (takiego oprogramowania nie warto MMU wpisauje do cache 'okolicę' piratowaç bo będzie więcej kîopotów aktualnie wykonywanego rozkazu. jak poţytku). Jak więc widaç, pamięç Procesor pobierajćc do wykonania wirtualna nie jest niestety tania. kolejne rozkazy, odwoîuje się nie do 'normalnej' pamięci, a wîaőnie do Istnieje jeszcze coő takiego jak znacznie szybszej cache. Znacznie pamięç cache (po polsku "pamięç szybszy dostęp do tej pamięci notatnikowa"). Nie jest ona widziana powoduje przyspieszenie jego pracy. przez system operacyjny tak, jak W procesorze 68030 zastosowano wyţej wymienione. W komputerach z jeszcze bardziej rozbudowane procesorami Motorola, pamięç cache rozwićzanie. Posiada on DWIE pamięci znajduje się w procesorze (w cache. Z jednej korzysta tak jak to odróţnieniu od np. komputerów z opisaîem, do skîadowania rozkazów, procesorami serii 80x86, gdzie natomiast druga zawiera obszar do przynajmniej częőç cache znajduje się którego procesor odwoîuje się na pîycie gîównej). Jest to, aktualnie przy zapisie czy odczycie zazwyczaj niewielki obszar pamięci o danych. W ten sposób przyspieszenie duţo krótszym czasie dostępu, niţ jest jeszcze większe (w tabelce pamięç 'zewnętrzna' w stosunku do obecnoőç 2 pamięci cache zaznaczyîem procesora. W najprostszej postaci, '2*xxx'). Oczywiőcie wszelkie zmiany  ********************************** strona 13 *********************************** cache sć przepisywane do pamięci do procedur systemu operacyjnego gîównej w sposób dla procesora zarzćdzajćcych pamięcić, ale jest to niezauwaţalny. moţliwoőç dodatkowa (ą). Do grupy drugiej zaliczyç moţna Programista. przede wszystkim C i assmblery. Takţe Pascala, Modulę-2, Oberona, A jak to wyglćda od strony chociaţ wîaőciwie Pascal i dalsze programisty ? wymienione języki powinny naleţeç do pierwszej grupy. Jednakţe obecne Zaimplementowane na Amidze języki implementacje Pascala przejęîy jawne programowania podzieliç moţna na dwie mechanizmy zarzćdzania pamięcić od grupy. Do pierwszej z nich naleţć języków typu C, i wspóîczesny Pascal przede wszystkim AMOS i BASIC. Sć to (Turbo Pascal, HiSpeed Pascal) języki nie posiadajćce wîasnych zaliczyîbym do drugiej grupy. W jawnych mechanizmów zarzćdzania językach tych programista ma peînć pamięcić. Moţna w nich odwoîywaç się kontrolę nad przydzielaniem pamięci (ą) Podziaî ten przyjćîem ad hoc. Nie znam ţadnego tego typu podziaîu stosowanego w literaturze, czy praktyce informatycznej.  ********************************** strona 14 *********************************** dla programu i danych. Szczególnie widoczne jest to w C, objaőnię więc na przykîadzie w tym języku. W C nie ma róţnicy czy deklarujemy tablicę poprzez:  char tablica [40]; /* tablica znakowa, po prostu string */     /* i odwoîujemy się do niej przez */     foo = tablica [i];  czy zdefiniujemy tablice poprzez  char * baz;     baz = malloc (sizeof(char [40]));     /* odwoîujćc się do niej przez: */     foo = (*baz) [i]; /* jedna moţliwosç */   foo = *(baz+i); /* druga moţliwoőç */   free (baz);   ********************************** strona 15 *********************************** Ten drugi sposób jest nawet W C mamy trzy procedury lepszy, bo moţemy wewnćtrz programu obsîugujćce pamięç. Sć to: ustaliç potrzebnć wielkoőç tablicy, malloc(), calloc() i free(). W K&R która w metodzie pierwszej jest (ą) podana jest jeszcze procedura ustalana na staîe w tekőcie programu. cfree(), jednakţe jej istnienie W ten sposób obejőç moţna jednć z wad zaleţy od implememntacji języka. języków kompilowanych, Jeőli jej nie ma, uţywamy free(). niemoţnoőç dynamicznego okreőlania Pozostaîe sć obowićzkowymi elementami wielkoőci tablic. W ogóle mechanizm biblioteki standardowej języka, i wskaűników w C jest wspaniaîy.. dostępne byç muszć. kiedy się juţ go zrozumie, co niestety nie zawsze jest proste. malloc zdefiniowana jest jako: Ogólnie pamięç dla programu char * malloc (unsigned long) /*K&R*/ przydzieliç moţna za pomocć a) mechanizmów wîasnych języka, i w uţywanym przeze mnie kompilatorze b) standardowych procedur systemu ma postaç: operacyjnego. b) tyczy takţe języków nie posiadajćcyh wîasnych mechanizmów void * malloc (unsigned long)  zarzćdzania pamięcić, np. Pascal.  ********************************** strona 16 *********************************** (niezgodnoőç ta wynika z tego, ţe w pamięci, zwraca ona wskaűnik typu czasach gdy powstawaî K&R, nie void lub char (zaleţnie od wszystkie kompilatory miaîy implementacji) na pierwszy bajt zdefiniowany typ void. Nie ma to ţćdanego bloku. Jeţeli malloc zwróci większego znaczenia w praktyce wartoőç NULL, oznacza to niemoţnoőç programistycznej). przydzielenia ţćdanego bloku. Wskaűnik ten zazwyczaj trzeba Po wywoîaniu malloc() z parametrem zrzutowaç do potrzebnego typu, np: oznaczajćcym wielkoőç ţćdanego bloku (ą) K&R  - Kernighan  & Richtie  - "The C Programming Language " by Dennis M . Kernighan and Brian W . Richtie - polski tytuî "Język C ", ksićţka opisujćca pierwotny standard języka C  , napisana przez ludzi którzy C  stworzyli. Takţe znana jako 'biaîa księga ', lub 'Stary Testament '. Okreőleniem tym nazywa się takţe standard języka C opisany w tej ksićţce, w odróţnieniu od ANSI C opisanego w "The C programming Language 2nd Edition " (zwanej oczywiőcie 'Nowym Testamentem '). Ksićţki te sć ostatecznć wyrocznić przy wszelkich wćtpliwoőciach dotyczćcych języka C .  ********************************** strona 17 ***********************************  struct foo * bar;     if (!(bar = (struct foo *) malloc (sizeof(struct foo)))) {   fprintf (stderr,"%s\n","Cannot allocate memory."); /*komunikat bîedu*/   exit (100); /*awaryjne zakończenie programu, kod wyjőcia 100*/  };   .   . /* tutaj coő się robi z bar */   .   free (bar);    Uţyîem tutaj takţe procedury free(). calloc() (o nim za chwilę) jest Ma ona postaç niepotrzebny, free() zwalnia go i przekazuje do dyspozycji systemu  free (void *)  operacyjnego. Nie naleţy nigdy odwoîywaç się do pamięci która Kiedy juţ obszar pamięci zostala juţ zwolniona, powoduje to przydzielony przez malloc() lub zazwyczja zawieszenie się komputera.  ********************************** strona 18 *********************************** Procedura calloc(), definiowana jako:  void * calloc (unsigned long, unsigned long)  Sîuţy zazwyczaj do rezerwowania Programista nie ma zazwyczaj pamięci na tablice lub inne niestety wpîywu na rodzaj pamięci konstrukcje w których powtarza się przydzielanej przez malloc() i kilka takich samych elementów. calloc(). W amigowskich Pierwszy jej parametr to iloőç kompilatorach C zazwyczaj istnieje potrzebnych obiektów, drugi, to moţliwoőç wymuszenia typu pamięci wielkoőç pojedynczego obiektu. przy deklarowaniu zmiennej, jest to calloc() jako wynik zwraca wskaznik jednak realizowane w sposób zaleţny na pierwszy bajt pierwsego elementu, od kompilatora. Aby jednakţe mieç lub NULL (podobnie jak malloc() ). peînć kontrolę nad przydzielaniem Aby zwolniç pamięç zarezerwowanć pamięci, wystarczy uţyç procedur przez calloc, uţywamy free(), lub o AmigaDOS-u. Najwaţniejsze z nich to: ile istnieje w danej implementacji, AllocMem, FreeMem i AllocAbs z cfree(): biblioteki exec, oraz AllocRemember i FreeRemember z biblioteki  cfree (void *);  Intuition.  ********************************** strona 19 *********************************** UWAGA: Wszystkie procedury systemowe przydzielajć zawsze obszar o wielkoőci równej wielokrotnoőci liczby 8. Czyli jeőli űćdamy obszaru 81 bajtów, przydzielony zostanie obszar 88 bajtów. Najwaţniejsza z nich to procedura AllocMem:  MemoryBlock = AllocMem (ByteSize, Requirements)   D0 -198 D0 D1     ULONG * MemoryBlock; (spotkalem sie tez z definicjć nie ULONG *   a CPTR)   ULONG ByteSize;   ULONG Requirements;  Dla AllocMem Requirements sć kombinacjć następujćcych wyraţeń: MEMF_PUBLIC MEMF_LARGEST MEMF_CHIP MEMF_CLEAR MEMF_FAST  ********************************** strona 20 *********************************** W niektórych kompilatorach w pliku nagîówkowym . (include'y dla 2.0 i wyţej) Poniewaţ sć to procedury systemu spotkaç moţna jeszcze: operacyjnego, doîćczyç (w Aztec C) naleţy takţe nagîówek . MEMF_LOCAL Programujćcy w assemblerze odpowiednie pliki odnaleţç i doîćczyç Odpowiednie definicje znajdujć się muszć samodzielnie. UWAGA: w standardowych assemblerowych include'ach procedury systemowe majć przedrostek _LVO, czyli mAllocMem wywoîywaç naleţy jako  jsr _LVOAllocMem(ExecBase)  a nie  jsr AllocMem(ExecBase)  Jak widaç, procedura zwraca oraz tryb allokacji. Tryb ten wskaűnik unsigned long do okreőlamy jako kombinację jednego z zaallokowanego bloku. Parametry wyţej podanych. wejőciowe to wielkoőç ţćdanego bloku, Czyli:  ********************************** strona 21 ***********************************  foo = AllocMem (4096,MEMF_PUBLIC|MEMF_CLEAR|MEMF_LARGEST);  oznacza ţćdanie przyznania czterokilobajtowego bloku pamięci dowolnego typu, wypeînionej zerami, w obrębie największego wolnego bloku. Poszczególne tryby oznaczajć bowiem: MEMF_CHIP - przydzielona pamięc będzie typu CHIP MEMF_FAST - ----''---- FAST lub SLOW MEMF_PUBLIC - wymusza przydzielenie pamięci jakiegokolwiek dostępnego typu MEMF_LARGEST - przydzielona pamięç będzie w obrębie największego dostępnego bloku MEMF_CLEAR - przydzielona pamięç będzie wypeîniona zerami przed przekazaniem do programu o MEMF_LOCAL za chwilę.  ********************************** strona 22 *********************************** Jeőli w programie potrzebujemy po absolutnych adresów w pamięci (wedîug prostu bloku pamięci do celu który C= i wszystkich technicznych nie wymaga aby byî to jakiő jej publikacji jedynym adresem do którego szczególny typ, naleţy uţywaç trybu moţna i moţna będzie odwoîywaç się MEMF_PUBLIC. Prawidîowo bezpiecznie jest adres ExecBase równy skonfigurowany komputer będzie 4). Ţćdania przydzielenia pamięci kierowaî takie ţćdanie do pamięci typu MEMF_LOCAL jest dodatkowym FAST (o ile jć posiada), a dopiero trybem wymuszajćcym przydzielenie potem do CHIP. Jeőli naprawdę takiego obszaru, który podczas potrzebujesz pamięci FAST, sprawdű w gorćcego startu systemu ('maîy programie czy ona istnieje, a nie reset') nie będzie odîćczony od przyjmuj tego za pewnik. Inaczej systemowej listy pamięci. Wîasnoőci uţytkownicy 'goîych' A500, A1200, tej nie ma zazwyczaj A2000 będć klćç Cię dîugo i pamięç autokonfigurowana, szczególnie starannie. Niestety większoőç gdy znajduje się na karcie z demosów i innych scenowych tego typu dodatkowym procesorem. Pamięç w tym programów robi nawet czasami duţo trybie przydzielaç naleţy jeőli majć gorszć rzecz. Îamie tam byç umieszczone programy czy dane zasadę caîkowitej relokowalnoőci majćce przetrwaç reset (np. wirusy, programu oraz odwoîuje się do czy rezydenty antywirusowe).  ********************************** strona 23 *********************************** UWAGA: MEMF_LOCAL dziaîa wyîćcznie w systemie 2.04 i wyţej. Do zwalniania pamięci zarezerwowa- zwolni blok pamięci zaallokowany tak nej przez AllocMem sîuţy procedura jak w przykîadzie do AllocMem. FreeMem: Iloőç wolnej pamięci sprawdzamy za  FreeMem (MemoryBlock,ByteSize)  pomocć procedury AvailMem:  -210 A1 D0     Size = AvailMem (Requirements)   ULONG * MemoryBlock   D0 -216 D1   ULONG ByteSize     ULONG Size;  Jak widaç w odróţnieniu od znanego  ULONG Requrements;  z C free() , tu trzeba podaç DWA parametry: adres zaallokowanego obszaru i jego wielkoőç. Procedura Requirements przyjmujć te same nic nie zwraca, np: wartoőci jak przy AllocMem. Funkcja zwraca w Size wielkoőç wolnej pamięci  FreeMem (foo,4096);  ţćdanego typu. Na przykîad:  ********************************** strona 24 ***********************************  foo = AvailMem (MEMF_FAST);  przypisze zmiennej foo wielkoőç wolnego obszaru pamięci FAST. Procedura AllocAbs  MemoryBlock = AllocAbs (ByteSize,Location)   D0 -204 D0 A1     ULONG * MemoryBlock;   ULONG ByteSize;   ULONG Location;  Sîuţy do wymuszenia allokacji procedury które w normalnej sytuacji bloku pamięci pod ţćdanym adresem, a zwracajć wartoőci, zwraca NULL jeőli nie tam gdzie system wskaţe. W ţćdanie programu jest niemoţliwe do odróţnieniu od AllocMem, nie podaje wykonania. Obfite stosowanie się tutaj ţćdanego typu pamięci a AllocAbs na adresach jedynie adres pod którym blok ten ma 'nieobowićzkowych' dla wszystkich się znajdowaç. Jak wszystkie Amig (w zasadzie na pewno pamięç  ********************************** strona 25 *********************************** będzie tylko w pierwszych 512 np. 30 obszarów, albo szczególnie kilobajtach CHIP od adresu 0. gdy nie wiemy ile tego program Rozmieszczenie FAST i SLOW zaleţy od zarezerwuje (bardzo częste przy typu Amigi i jej konfiguracji) jest obsîudze drzew binarnych czy list), prawie pewnć gwarancjć, ţe na którymő allokujemy pamięç uţywajćc modelu program się nie uruchomi. AllocRemember, i system pamięta za Kanonicznym przypadkiem jest tu nas co zaallokowaliőmy. Nie trzeba uznanie, ţe pod adresem $C00000 jest robiç list czy innych tablic z pamięç SLOW, co jest prawdć tylko na adresami bloków do zwolnienia. A500 z 1 MB. Na praktycznie kaţdej Zwalniamy wszystko raz a dobrze innej konfiguracji program padnie. uţywajćc FreeRemember. AllocRemember uţywamy podobnie jak AllocMem(), z tć Procedury AllocRemember i maîć róţnicć, ţe najpierw w progamie FreeRemember z biblioteki intuition trzeba zadeklarowaç wskaűnik do sîuţć do allokowania większych iloőci struktury Remeber, w której system obszarów (gîupio brzmi, nie ?). To zapamięta gdzie i ile pamięci znaczy, jeőli w programie allokujemy rezerwowaliőmy.   oszczędzaj pamięç oszczędzaj ... pamięç osczędzaj.... aha! pamięç    ********************************** strona 26 *********************************** Procedura AllocRemember():  MemBlock = AllocRemember (RememberKey,Size,Flags);   D0 -396 A0 D0 D1       CPTR MemBlock;   struct Remember * RememberKey;   ULONG Size;   ULONG Flags;  RememberKey to adres zmiennej (wskaűnika) do wskaűnika struktury Remember. Jeőli allokujemy po raz pierwszy, musi byç wskaűnikiem do NULL. Pozostaîe parametry jak dla AllocMem. Procedura FreeRemember() zwalnia wszystkie obszary zaallokowane przez AllocRemember():  ********************************** strona 27 ***********************************  FreeRemember (RememberKey,ReallyForget);   -408 A0 D0     struct Remember * RememberKey;   BOOL ReallyForget;  RememberKey jak dla AllocRemeber(). Remember, natomiast dla FALSE system Natomiast ReallyForget to parametr zdeallokuje tylko strukturę Remeber, boolowski (TRUE/FALSE). Jeőli będzie a pamięç trzeba będzie zwolniç równy TRUE, zwolnione będzie ręcznie. wszystko, tzn. i pamięç i struktura Krótki przykîad: || || || || \ || / \ || / \||/ \||/ \/ \/  ********************************** strona 28 ***********************************  #define MAXLINE 4096;     struct Remember * remember = NULL;     char * line;     line = (char *) AllocRemember (&remember,MEMF_PUBLIC,MAXLINE);   .   .   .   FreeRemember (&remember,TRUE);  I to juţ raczej wszystko co mam do rzeczy), ale zdecydowaîem napisania o pamięci w Amidze. się umieőciç te dane w artykule dla Jeszcze tylko dwie sprawy. Dane o peînieszego obrazu. istnieniu trybu allokacji MEMF_LOCAL mam z dyskusji programistów Amigi na I jeszcze sprawa dedykacji. sieci Usenet. Niestety byîo to doőç Grupie InvestatioN dlatego, poniewaţ dawno, i mogîem się pomyliç co do ze znanych mi polskich produkcji jakichő szczegóîów (albo i grubszych wîaőnie ich kod pada najczęőciej (wg  ********************************** strona 29 *********************************** mojego doőwiadczenia) na Mam nadzieję, ţe ten tekst pomoţe im niestandardowych konfiguracjach w przyszîoőci utrzymaç zgodnoőç z pamięci. Klinicznym przypadkiem byîa systemem. tu wybieraczka do Fat Agnusa #12. FLATLINE/True Genius || || || || \ || / \ || / \||/ \||/ \/ \/  ********************************** strona 30 *********************************** Tabelka konfiguracji pamięci we wszystkich modelach Amigi. +-------+-----------------+-----------------+-----------------+-----+-------+ | Model | CHIP | SLOW | FAST | | | | Amigi +--------+--------+--------+--------+--------+--------+ MMU | cache | | |Standard| Max |Standard| Max |Standard| Max | | | +-------+--------+--------+--------+--------+--------+--------+-----+-------+ | A1000 | 256 KB | 512 KB?| N/A | N/A | 0 KB | 8 MB | - | N/A | | A2000 | 1 MB | 1(2) MB| N/A | N/A | 0 KB | 8 MB | - | N/A | | A2500 | 1 MB | 1(2) MB| N/A | N/A | 2 MB? | 8 MB | + |2×256 B| | A3000 | 1 MB | 2 MB | N/A | N/A | 1 MB | 16 MB | + |2×256 B| | A3000T| 1 MB | 2 MB | N/A | N/A | 4 MB | 16 MB | + |2×256 B| | A4000 | 2 MB | 4 MB | N/A | N/A | 2 MB | 16 MB | +? |2×256 B| | A500 | 512 KB | 1(2) MB| 0 KB | 1.8 MB | 0 KB | 8 MB | - | N/A | | A500+ | 1 MB | 2 MB | 0 KB | 1.8 MB?| 0 KB | 8 MB | - | N/A | | A600 | 512 KB?| 2 MB | N/A | N/A | 0 KB | 8 MB | - | N/A | | A1200 | 2 MB | 2 MB | N/A | N/A | 0 KB | 9 MB | - | 256 B | | CDTV | 1 MB | 1 MB | 0 KB | 1.8 MB?| 0 KB | 9 MB? | - | N/A | | CDł˛ | 2 MB | 2 MB | N/A | N/A | 0 KB | 8 MB | - | 256 B | +-------+--------+--------+--------+--------+--------+--------+-----+-------+  ********************************** strona 31 *********************************** Oznaczenia: wymianie koőci na ECS moţna zamontowaç 1 MB. Nie jest to N/A - nie dostępne w tym modelu (mam jednak tak proste jak nadzieję, ţe puryőci językowi standardowe rozszerzenie, i wybaczć mi uţycie tego raczej nierealne w polskich angielskojęzycznego warunkach. oznaczenia). A2500 - Tych 2 MB FAST nie jestem Co do przypadków typu 1(2) MB - pewien. System wprawdzie nie wszystkie oficjalne publikacje mówić, uniemoţliwia dodawania ţe w tych Amigach moţe byç tylko 1 MB mniejszych kawaîków, lecz CHiP. Z drugiej strony kiedy byîem wszystkie karty roszerzeń (a latem w Berlinie, szukajćc karty A2500 to A2000 z firmowć FAST-u, kilka razy próbowano mi kartć) umoţliwiajć dodawanie sprzedaç rozszerzenie CHIP do 2MB. jedynie po 2 MB. "Nieoceniony" Magazyn Amiga Przypadki oznaczone '?' : (patrz uwagi o CDTV) do którego odwoîaîem się jako do A1000 - tak podajć publikacje ostatniej instancji, podaje fachowe, chociaţ wiem, ţe po "2 MB RAM" bez dokîadnej  ********************************** strona 32 *********************************** specyfikacji. Rubryki 512 KB CHIP. Osobiőcie 'cache' i 'MMU' podajć dane widziana przeze mnie 600-tka dla wersji z procesorem miaîa 1 MB. 68030. CDTV - Tego prawdę mówićc sam nie A4000 - Zaleţne jest to od procesora jestem pewien. Z braku w który wyposaţona jest dobrego opisu CDTV oparîem A4000. Istniejć wersje z się na danych z Magazynu  68EC030, 68EC020, 68030 i Amiga 1/92. Niestety zawarte 68020. W tabelce dane dla tam dane sć, rzekîbym peînego 68030. sprzeczne, cytuję: "[...] Pamięç: 1 MB RAM (jak A500+ - Co do SLOW widziaîem na przypuszczam wedîug innych wîasne oczy rozszerzenia 512 űródeî CHIP), roszerzalne do KB. Reszta, z wyjćtkiem uwag 2.3 wewnętrznie (SLOW sćdzćc o FAST patrz uwagi o CDTV. po iloőci) i do 8.5 MB zewnętrznie (??, sćdzćc z A600 - w literaturze spotkaîem się treőci innych opisów zarówno z opisami podstawowej 'zewnętrznie' oznacza FAST), wersji zarówno z 1 MB jak i 512 KB ROM, 1 MB pamięci  ********************************** strona 33 *********************************** wideo (???) [...] Zîćcza - pasowaîo to od 500-tki. [...] zîćcze na kartę RAM 64 Niemniej dowodów na jego KB (????) [...]" koniec nieistnienie nie mam, cytatu, wszystkie komentarze powtarzam więc co byîo w w nawiasach moje. W tym 'fachowej' gazecie. momencie bijćc się z îomotem w piersi przyznaję, ţe po Commodore Amiga, Amiga Kickstart, takim czymő caîy gîupi Amiga Workbench, Autokonfiguracja sć jestem. Nigdy teţ nie zarejestrowanymi znakami towarowymi widziaîem w zachodniej prasie Commodore Electronics Ltd. ogîoszenia o roszerzeniu FAST w CDTV, a nie sćdze ţeby  * Edycja: Piter *