Obsługa buforów procesorów

### Przegląd buforów procesorów

#### Uwaga od tłumacza! "Bufor" jest tutaj odpowiednikiem angielskiego słowa "Cache"!

Aby przyspieszyć prędkość działania, niektóre procesory z rodziny 68k są zdolne do buforowania dostępu do pamięci.
Odwołania do buforów wykonywane są zawsze przy użyciu adresów logicznych, włączając w to kod funkcji dostępu. Oznacza to, iż dostęp w Trybie Użytkownika i w Trybie Nadzorcy tworzy inne wpisy w buforach (więcej informacji na ten temat znajdziesz w dokumentacjach firmy Motorola).

Poniżej znajduje się przegląd możliwości buforowania procesorów z rodziny 68k:

- 68000 brak
- 68010
  - Instruction Prefetch
    dwa słowa prefetch, jedno słowo dekodujące rejestr
  - Tryb Pętli
    uruchamiany jest, gdy za instrukcją składającą się z jednego słowa występuje DBcc i nie występują inne instrukcje, aż do zakończenia pętli
- 68020
  - Instruction Prefetch
    jedno długie słowo
  - Instruction Cache
    16 linii po 16 bajtów = 256 bajtów
    może zostać włączony lub zamrożony przez CACR
- 68030
  - Instruction Prefetch
    jedno długie słowo
  - Instruction Cache
    16 linii po 16 bajtów = 256 bajtów
    może zostać włączony lub zamrożony przez CACR
  - Data Cache
    16 linii po 16 bajtów = 256 bajtów
    może zostać włączony lub zamrożony przez CACR
    zawsze WriteThrough
    wybierany tryb Write Allocation
- 68040
  - Instruction Prefetch
    jedno długie słowo
  - Instruction Cache
    256 linii po 16 bajtów = 4096 bajtów
    może zostać włączony przez CACR
  - Data Cache
    256 linii po 16 bajtów = 4096 bajtów
    może zostać włączony przez CACR
    wybierane tryby CopyBack/WriteThrough przez MMU
- 68060
  - Instruction Prefetch
    jedno długie słowo
  - Instruction Cache
    512 linii po 16 bajtów = 8192 bajtów
    może zostać włączony, zamrożony i zmniejszony o połowę przez CACR
  - Branch Cache
    może zostać włączony przez CACR
    nie wpływają na niego ustawienia MMU!
  - Superscalar Dispatch
    może zostać włączony przez CACR
  - Data Cache
    512 linii po 16 bajtów = 8192 bajtów
    może zostać włączony, zamrożony i zmniejszony o połowę przez CACR
    wybierane tryby CopyBack/WriteThrough przez MMU
  - Push Buffer
    może zostać wyłączony przez PCR
  - Store Buffer
    może zostać włączony przez CACR
    Strony pamięci nie mogą być szeregowane "bezbuforowo" (dokładnie)

#### Zarządzanie buforami w WHDLoad

Najważniejszą rzeczą jest zrozumienie, że bufory procesorów 68030-68060 są kontrolowane przez Rejestr Kontroli Buforów (Cache Control Register (CACR)) i MMU (zakładając, że WHDLoad używa i kontroluje MMU)!
W CACR bufory zostają globalnie włączone lub wyłączone. Używając pojedynczych stron MMU (4 kilobajty z WHDLoad) zostanie zaznaczone jak mają być buforowane.
Na 68030 strona pamięci może być buforowalna lub nie. Na 68040/68060 może być buforowalna w trybach WriteThrough, buforowalnym CopyBack, niebuforowalnym (niedokładnym) lub niebuforowalnym szeregowym (dokładnym).

Jeżeli MMU nie jest wykorzystywane przez WHDLoad, bufory kontrolowane są tylko przez CACR.

#### Domyślne ustawienia buforów

Domyślnie obszary WHDLoad, .slave i ExpMem oznaczone są jako buforowalne poprzez CopyBack. Obszar BaseMem oznaczony jest jako niebuforowalny, a Data i Instruction Cache są włączone w CACR. Program umieszczony w obszarze BaseMem uruchamia się bez buforów, lecz WHDLoad i pliki .slave wykorzystują bufory w celu zwiększenia efektywności.

#### Kontrola buforów z poziomu Programisty

Występują dwie funkcje resload kontrolujące bufory: resload_SetCACR i resload_SetCPU. Resload_SetCACR to starsza procedura i może być w pełni zastąpiona przez resload_SetCPU (WHDLoad wewnętrznie mapuje argumenty resload_SetCACR i wywołuje resload_SetCPU). Zalecane jest korzystanie z resload_SetCACR dla wszystkich tych, którzy nie wiedzą wszystkiego o buforach i ich zachowaniu się w systemie Amigi. Wykorzystując resload_SetCACR Instruction i Data Cache mogą zostać osobno włączone lub włączone. resload_SetCACR wpływa tylko na buforowalność obszaru BaseMem.

#### Kontrola buforów z poziomu Użytkownika

Jeżeli programista wykonał wszystko prawidłowo, użytkownik nie musi nic zmieniać odnośnie ustawień buforów, gdyż zostało to dokonane przez plik .slave.
Niemniej jednak, mogą wystąpić dwie sytuacje, gdy konieczna jest ręczna zmiana ustawień buforów. Pierwsza z nich, aby spowolnić program (na przykład, może się to objawiać błędami w grafice) oraz druga, aby przyspieszyć program.

Aby tego dokonać, można wykorzystać opcję NoCache. Wyłącza ona wszystkie bufory i zaznacza całą pamięć jako niebuforowalną szeregową (dokładną). Jeżeli komputer posiada 32-bitową pamięć Chip, nadal wszystko będzie szybsze niż na oryginalnej A500.

Aby przyspieszyć zainstalowany program, niektóre opcję mogą zostać uaktywnione, aby włączyć bufory. Powodują one nadpisanie ustawień dokonanych przez plik .slave. Na 68020 opcja Cache może zostać ustawiona. Na 68030 opcja DCache może zostać użyta (zawiera ona już w sobie opcję Cache). Na 68060 istnieje więcej opcji BranchCache, StoreBuffer i SuperScalar. Opcja ChipNoCache/S może wpłynąć na poprawę efektywności na 68040 i 68060.

#### Buforowalność pamięci Chip

Buforowalność może zostać ustawiona nie tylko przez sam procesor (CACR) i ustawienia MMU, ale również przez zewnętrzne urządzenia. Na szynie adresowej procesor sygnalizuje próbę zbuforowania obszaru. Urządzenia zewnętrzne mogą sygnalizować procesorowi (jeżeli adres został nałożony na adres szyny podczas próby dostępu do pamięci), że dany obszar nie może zostać zbuforowany.
Mechanizm, podczas którego urządzenie zewnętrzne sygnalizuje procesorowi, że pamięć nie może zostać zbuforowana, wykorzystywany jest (ZTCW) na wszystkich Amigach i we wszystkich kartach procesorowych od 68030 wzwyż (z racji, że posiadają Data Cache). Wpływ ma to na całą pamięć Chip oraz przestrzeń IO (Cia/Custom/RTC), która nie może zostać zbuforowana przez Data Cache. Istotne jest, aby unikać niezgodności buforów, z powodu, dla przykładu, aktywności DMA.
Reakcja procesora na sprzęt, który odmawia zbuforowania obszaru jest różna na różnych procesorach. Na 68030 nie wpływa na efektywność pracy - dane nie zostaną zbuforowane. Na 68040 odczyt obszaru zostanie wykonany na pełnej prędkości, lecz zapis obszaru (CopyBack) zostanie usunięty i uruchomiony ponownie bez buforowalności, co spowoduje około pięciokrotne (w zależności od procesora i innych urządzeń) spowolnienie dostępu (w porównaniu do niezbuforowanego dostępu). Na 68060 odczyt i zapis zostanie usunięty i uruchomiony ponownie. Odczyt będzie około 3 razy wolniejszy, a zapis do około 5 razy.
Wspomniane rzeczy odnoszą się do dostępu do danych. Dostęp do instrukcji zazwyczaj pozostaje bez zmian i jest buforowalny wewnątrz pamięci Chip. Istnieją pewne urządzenia (prawdopodobnie uszkodzone), które nie zezwalają instrukcjom na bycie buforowanymi w pamięci Chip. Na takich urządzeniach opcja ChipNoCache/S powinna zostać użyta, aby uniknąć największych spowolnień.

Można sprawdzić to zachowanie na własnym sprzęcie poprzez uruchomienie Speed.Slave znajdującego się katalogu `src/memory-speed` w archiwum dla developerów.

#### Write Allocation

Write Allocation kontroluje bufory na procesorze 68030 w sytuacji, gdy występuje utrata buforów podczas operacji zapisu. Write Allocation musi zostać włączony, gdy fragmenty zainstalowanego programu uruchomione są w trybie Użytkownika. Jeżeli zainstalowany program uruchomiony jest w trybie Supervisor Mode Write Allocation, Write Allocation może zostać wyłączony, co może wpłynąć na minimalną poprawę efektywności.

#### Branch Cache

Branch Cache (bufor gałęziowy) dostępny jest tylko na 68060. Jest to rodzaj Instruction Cache dla tzw. instrukcji gałęziowych. W odróżnieniu od Instruction Cache ustawienia MMU nie mają wpływu na Branch Cache! Oznacza to, że nawet jeżeli odpowiednia strona pamięci zaznaczona jest jako niebuforowalna, instrukcje gałęziowe będą buforowane (jeżeli tylko Branch Cache jest włączony).

W celu uzyskania dalszych informacji przeczytaj Motorola Microprocessors User Manuals. Jeżeli masz jakieś uwagi dotyczące tego tematu skontaktuj się ze mną.