To, o co prosisz, nazywa się DMA. Musisz napisać sterownik, aby zarezerwować tę pamięć.
Tak, zdaję sobie sprawę, że powiedziałeś, że nie chcesz, aby system operacyjny interweniował, a sterownik staje się częścią systemu operacyjnego, ale przy braku rezerwacji sterownika jądro uważa, że cała pamięć należy do niego. (Chyba że powiesz jądru, aby zignorowało blok pamięci, zgodnie z odpowiedzią Aarona).
Rozdział 15 (PDF) „ Linux Device Drivers, 3 / e ” autorstwa Rubini, Corbet i Kroah-Hartmann obejmuje DMA i powiązane tematy.
Jeśli chcesz wersję HTML, znalazłem drugą wersję rozdziału w innym miejscu w Internecie. Uważaj, że druga edycja ma już ponad dekadę, ponieważ pojawiła się, gdy jądro 2.4 było nowe. Od tego czasu dużo pracy poświęcono podsystemowi zarządzania pamięcią jądra, więc może już nie mieć zastosowania.
Jeśli chcesz, aby system operacyjny całkowicie go zignorował, musisz zrobić dziurę w pamięci, używając „
memmap
.” Zobacz to odniesienie . Na przykład, jeśli chcesz 512 M na barierze 2 GB, możesz umieścić „memmap=512M$2G
” w wierszu poleceń jądra.Musisz to sprawdzić,
dmesg
aby znaleźć ciągłą dziurę do kradzieży, aby nie tupać na żadnym urządzeniu; specyficzne dla twoich płyt głównych + kart.To nie zalecanym sposobem robienia rzeczy - patrz odpowiedź na Warrena Younga, jak prawidłowo zrobić (sterowniki jądra + DMA). Odpowiadam na dokładnie zadane pytanie. Jeśli planujesz zrobić to dla użytkowników końcowych, będą cię nienawidzić , jeśli zrobisz to im ... zaufaj mi, to jedyny powód, dla którego znałem tę odpowiedź.
Edycja: Jeśli używasz grub2 w / grubby (np. CentOS 7), musisz upewnić się, że uciekasz przed $ . Powinien być
\
wcześniej jeden$
. Przykład:źródło
uint8_t *ptr = 0x8000000
z moim przykładem? Albo to może segregować ... Hę, naprawdę nie wiem. Znów znałem odpowiedź, ponieważ byłem użytkownikiem końcowym źle zaprojektowanej karty PCI, w której musiałem ręcznie przydzielić bufor poniżej znaku 4G, a następnie powiedzieć sterownikowi, gdzie jest ta przestrzeń; może nie być to możliwe z obszaru użytkownika.MMAP_FIXED | MMAP_ANON
. Bez tutaj niestandardowego urządzenia DMA do zabawy, nie mogę powiedzieć, czy faktycznie robi to, czego chciał OP, ale moje pudełko CentOS szczęśliwie dało mi 8 MB bloku przy 512 MB, kiedy powiedziałemmemmap=8M$512M
w GRUB. Nie wymaga nawet dostępu do roota, jak się obawiałem. Ale nawet jeśli robi to dobrze, nadal myślę, że prawdopodobnie będziesz potrzebował sterownika do obsługi przerwań i tym podobnych.mmap()
strony są zerowane, zanim kod obszaru użytkownika je zobaczy. Robi się to dla bezpieczeństwa, aby dane nie wyciekły z jednego procesu do drugiego. Kolejny powód do korzystania ze sterownika, ponieważ może być konieczne zachowanie zawartości bufora DMA w czasie ładowania sterownika. Aha, nawiasem mówiąc, dowolnie umiejscowionemmap()
wywołanie kończy się powodzeniem nawet bezmemmap
opcji rozruchu jądra, przynajmniej tak długo, jak długo nikt nie używa pamięci znajdującej się w miejscu, o które prosiłeś. Opcja rozruchu niewątpliwie zwiększa szanse na sukces, ale nie jest to absolutnie konieczne.Aby zarezerwować blok pamięci z jądra w systemie Linux opartym na ARM, możesz również użyć
reserved-memory
węzła w pliku drzewa urządzeń (dts). W dokumentacji jądra (patrz tutaj ) jest przykład:źródło
Najpierw wpisz to polecenie, aby sprawdzić bieżące ustawienie:
Aby zmienić ustawioną wartość, edytuj
/etc/sysctl.conf
. Poszukaj linii:Jeśli nie istnieje, utwórz go (wraz z żądaną wartością). Dopuszczalne są następujące wartości:
8M jest wyjątkowo konserwatywny; może wygodnie siedzieć przy 16M. Po zmianie wartości uruchom to i nie jest konieczne ponowne uruchamianie:
źródło