Przepis na włączenie dodatkowej pamięci (VRAM) do obiegu systemu.
1. Wymagania
Do przeprowadzenia eksperymentu niezbędne są
XFree86
Mtd w modułach
Karta graficzna z nadmiarem niepotrzebnej nam pamięci
2. Przygotowanie
Aby przygotować się do eksperymentu, należy okres lic gdzie w przestrzeni adresowej PCI znajduje się pamięć VRam karty graficznej. Można to zrobić na kilka sposobów:
uruchomić program lspci (lspci -v) i poszukać opisu urządzenia "VGA compatible controler". Powinien pojawić się przynajmniej jeden wpis o pamięci karty i jej położeniu w przestrzeni adresowej. U mnie jest na przykład tak:
01:00.0 VGA compatible controller: nVidia Corporation Vanta [NV6] (rev 15) (prog-if 00 [VGA])
Flags: bus master, 66Mhz, medium devsel, latency 248, IRQ 10
Memory at d6000000 (32-bit, non-prefetchable) [size=16M]
Memory at d4000000 (32-bit, prefetchable) [size=32M]
Expansion ROM at [disabled] [size=64K]
Capabilities: [60] Power Management version 1
Capabilities: [44] AGP version 2.0
Są dwa potencjalne miejsca w których należy szukać bufora VRAM. W tym wypadku jeden z wpisów określa położenie w pamięci rejestrów karty. Żeby poznać więcej szczegółów, należy spojrzeć na kolejny podpunkt.
W /var/log/ lub w okolicach, pojawia się plik XFree86.log, lub XFree86.0.log. Przeglądając go, można trafić na linijkę informującą o położeniu bufora ramki:
meehow:~# cat /var/log/XFree86.0.log |grep framebuffer
(**) NV(0): Depth 24, (--) framebuffer bpp 32
(--) NV(0): Linear framebuffer at 0xD4000000
Widać wiec, ze bufor ramki znajduje się pod fizycznym adresem 0xd4000000. Znając wielkość pamięci karty graficznej jesteśmy gotowi do eksperymentu.
3. Konfiguracja MTD
MTD, czyli Memory Technology Devices to wspaniale narzędzie ułatwiające współpracę linuksa z pamięciami Flash, urządzeniami typu DoC (Disk On Chip). Przydatne jest tez w naszym przypadku.
Jeden z elementów tego systemu obsługuje urządzenia RAM. Intencja autorów było w rzeczywistości unikniecie często spotykanej na starszych płytach sytuacji, gdzie Cache drugiego poziomu obsługiwał tylko część podłączonej pamięci. Dostęp do takiej pamięci jest dużo wolniejszy, dlatego często zalecano użytkownikom sztuczne ograniczenie dostępnego linuksowi ramu za pomocą parametru mem= przekazywanego kernelowi. Pozostała część pamięci można wykorzystać właśnie jako urządzenie RAM w MTD.
Potrzebny nam jest moduł slram.o (opcja CONFIG_MTD_SLRAM), oraz mtdcore.o mtdchar.o i mtdblock.o (ten ostatni przyda się, jeśli na dodatkowej pamięci zechcemy zainstalować jakiś system plików).
4. Kilka obliczeń na początek
XFree86 odczytuje informacje o położeniu burofa ramki z konfiguracji PCI karty graficznej. Stąd wniosek, iż jeśli sztucznie ograniczy się jej ilość, sterownik będzie korzystał tylko z jej części, znajdującej się na początku. Należy wiec policzyć sobie, ile pamięci przekażemy dla XFree86. Reszta będzie na nasz użytek.
Ilość potrzebnej pamięci zależy bezpośrednio od największej używanej rozdzielczości. Najprościej (ale i prawdopodobnie z błędami) będzie pomnożyć szerokość przez wysokość ekranu, a wynik pomnożyć jeszcze raz przez ilość bajtów przypadających na jeden punkt na ekranie (dla obrazów 24-bitowych jest to najczęściej nie 3 a 4 bajty na punk). Należy oczywiście pamiętać, ze jeżeli korzysta się jednocześnie z konsoli na framebufferze, jej rozmiar tez uwzględnić przy rachunkach (liczy się jego rozdzielczość w punktach).
Załóżmy, ze dla XFree86 oddamy 4MB pamięci graficznej (0x00400000 bajtów). Jeśli bufor ramki zaczyna się pod adresem 0xd4000000, to pamięć dla nas zacznie się od (0xd4000000 + 0x00400000) 0xd4400000. Wiemy juz, gdzie ona leży i wiemy ile możemy jej przydzielić.
5. Poprawka w XF86Config
Pozostał jeden drobny szczegół do poprawienia. XFree86 przy starcie sam spróbuje wykryć, ile pamięci ma karta graficzna. Jest to teraz jak najbardziej nie na rękę. Należy wiec w sekcji Device dopisać linijkę
VideoRam 4096
(jeśli przeznaczyliśmy serwerowi 4MB pamięci). Należy dopilnować, aby serwer działał (o ile musi) korzystając z poprawionej konfiguracji.
*UWAGA* Sterowniki binarne do kart nVidii ignorują ten parametr i zawsze same określają wielkość pamięci video na karcie. Dlatego tez nie da się ich tutaj wykorzystać.
6. Narodziny urządzenia MTD
Wszystko juz gotowe. Można wiec rozpocząć:
meehow:~# modprobe slram map=VRAM,0xd4400000,+0x00c00000
Znaczek plus przy liczbie 0x00c00000 oznacza, że określa ona wielkość bloku pamięci, a nie adres końcowy.
Moja karta graficzna ma 16MB pamięci, 4MB przeznaczyłem dla XFree86, reszta (12MB - 0xc00000) przeznaczona zostanie na urządzenie MTD. Rzut okiem, czy odnieśliśmy sukces:
meehow:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00b00000 00010000 "VRAM"
Brawo! Urządzenie mtd0 dostępne. Jak się do niego dostać? Bardzo prosto. Jeśli chcemy odwoływać się do niego, jak do urządzenia znakowego, musimy załadować moduł mtdchar (modprobe mtdchar) i utworzyć odpowiednie urządzenie za pomocą komendy mknod. W moim wypadku:
meehow:~# mknod /dev/mtd0 c 90 0
Jeśli zaś chcemy, aby zachowywało się jak urządzenie blokowe, na którym można zamontować system plików, to ładujemy mtdblock (modprobe mtdblock) i tworzymy odpowiednie urządzenie blokowe:
meehow:~# mknod /dev/mtdblock0 b 31 0
To wszystko. Urządzenie działa i jest gotowe do pracy.
7. Co ja z tym zrobię?
Wymyślając te metodę wpadły mi do głowy dwa rozwiązania. Pierwsze z nich, to założenie jakiegoś systemu plików, np:
meehow:~# mkfs.ext2 /dev/mtdblock0
Lub utworzenie partycji swap i dodanie jej do systemu:
meehow:~# mkswap /dev/mtdblock0
Setting up swapspace version 1, size = 12582912 bytes
meehow:~# swapon /dev/mtdblock0
Życzę miłego eksperymentowania
Michał Schulz