Zarezerwuj stały obszar pamięci RAM jako urządzenie blokowe (z danym początkowym adresem fizycznym)


11

Było wiele pytań na temat dysków RAM i znam ramfs i tmpfs, które pozwalają na użycie ram jako urządzenia blokowego. Jednak moim zainteresowaniem jest użycie stałego zakresu adresów pamięci jako urządzenia blokowego.

Wynika to z konieczności używania nieulotnej pamięci RAM dostępnej w moim systemie. Mam 6 GB dostępnej pamięci RAM i 8 GB nieulotnej pamięci RAM. Dane wyjściowe / proc / iomem dają mi następujące informacje

100000000-17fffffff: System RAM

180000000-37fffffff: zarezerwowany

Tutaj region od 6 GB do 14 GB odpowiada nieulotnemu regionowi RAM, który jest oznaczony jako mapa pamięci E820 BIOS jako zarezerwowana. Moim głównym celem jest użycie tej pamięci NVRAM jako urządzenia blokowego w systemie Linux. Jest to przydatne do testowania systemów NVRAM. Czy jest już jakieś polecenie linux, które pozwoliłoby mi użyć tego regionu jako urządzenia blokowego, czy też muszę napisać własny sterownik urządzenia jądra, aby to ułatwić?


2
Ciekawe, dlaczego chcesz to zrobić?
mtak,

Zapewnia łatwy sposób testowania systemów plików zaprojektowanych dla nieulotnej pamięci RAM w systemie Linux.
qstack

Odpowiedzi:


2

Nie jestem ekspertem od sterowników urządzeń, ale oto kilka wskazówek dotyczących badań i rozwoju:

  1. jeśli pamięć jest oznaczona jako „zarezerwowana”, system operacyjny nie może jej dotknąć; będziesz musiał znaleźć sposób, aby BIOS oznaczył go jako dostępny dla systemu operacyjnego, lub użyj bezpośrednich ioctl niskiego poziomu, aby go kontrolować
  2. jeśli Linux mógłby zobaczyć pamięć, nadal nie byłoby łatwego sposobu, aby uniemożliwić Linuksowi użycie jej jako dowolnego innego bloku pamięci RAM; próbę można spróbować, oznaczając pamięć RAM jako „złą”, a następnie modyfikując jądro, aby nadal miało z niego specjalne zastosowanie (sprawdź dokumentację jądra, zmieniło się bardzo od czasu ostatniego włamania się do niego i ewoluuje) z wielką prędkością)
  3. biorąc pod uwagę powyższe jako wstępne (i nie definitywne ani wyczerpujące) studium wykonalności, powiedziałbym, że napisanie sterownika ramdisk blockdevice jest najbardziej rozsądną opcją w twoim przypadku i być może powinieneś wnieść go z powrotem do jądra Linuksa i / lub współpracować z ludzie już próbują tego (być może lepszym miejscem na to pytanie jest lista mailingowa jądra Linux , jeśli jeszcze tam nie napisałeś)

Niektóre inne istotne źródła:


1

Przed wprowadzeniem tmpfs/ initramfstam ramdiskładowano initrdobrazy, urządzenia blokowe o ustalonym rozmiarze o stałym rozmiarze, myślę, że są ciągłe, przynajmniej we wcześniejszych implementacjach.

Sam sterownik bloku nie ma parametrów adresu pamięci, tylko rozmiar, ale jądro używane do ładowania obrazów initrd pod wcześniej zdefiniowanym adresem (przez config), więc zajrzyj do kodu jądra main / init (pomogłbym zdziw się, jeśli ramdysk nie są już wspierane przez initrd ale ponieważ initramfs jest wokół, wiele lat, nigdy nie używany ramdysk już).

Źródłem kierowca był drivers / block / rd.c , jeśli widzę teraz jest poprawnie sterowniki / block / brd.c .

W przeciwnym razie szukając ramdysku znalazłem implementację, która wygląda interesująco:

Dysk w pamięci RAM - gra ze sterownikami blokowymi

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.