Używam jądra Linux 3.3 na Xilinx's Microblaze z pełnym MMU. zadanie, które wykonuję, wymaga ode mnie zrozumienia: muszę utworzyć plik tekstowy (bufor) i zlokalizować fizyczny adres tego bufora i nie chcę, aby jądro zapisało ten plik w nieciągłych regionach pamięci.uzyskać fizyczny adres bufora pod Linuksem
Powód, dla którego potrzebuję tego, ponieważ mam silnik DMA, który przesyła dane ze wstępnie ustawionego adresu pamięci fizycznej, więc muszę wymusić na Linuxie utworzenie pliku bufora w tej dokładnej lokalizacji pamięci, tak aby podczas zapisywania danych do tego file jej natychmiast przekazywane przez silnik DMA do innego rdzenia Hardware
Więcej szczegółów:.
mój system ma 512 MB DDR3 RAM podłączony do systemu za pośrednictwem „kontroler Multi pamięci portu Xilinx” (MPMC) adres bazowy tego kontrolera pamięci to 0x90000000, wszystkie jednostki w systemie uzyskują dostęp do pamięci za pośrednictwem tego kontrolera, w tym MicroBlaze, jednostki DMA, której używam specjalnego interfejsu o nazwie Native Perso Nality Interface (NPI) do komunikacji z pamięcią na bardzo niskim poziomie, dzięki czemu osiąga bardzo wysoką prędkość.
Jednostka NPI DMA została pierwotnie zaprojektowana do użycia pod bardzo prostym osadzonym jądrem o nazwie "xilkernel", która nie obsługiwała pamięci wirtualnej, ani MMU nie była częścią MicroBlaze, więc programista mógł zobaczyć, gdzie będzie kod OS i wybierz adres pamięci fizycznej, taki jak 0x91800000, jako adres źródłowy, z którego będzie przesyłane DMA, następnie programista może umieścić plik pod tym dokładnym adresem i uruchomić system, gdy potrzebujemy do migracji projektu, aby użyć Linuksa zamiast xilkernel natknęliśmy się na ten problem, mam pliki na zewnętrznym urządzeniu pamięci masowej, do którego mogę uzyskać dostęp jako urządzenie blokowe z Linuksa i potrzebuję przenieść każdy plik do pamięci głównej (DDR3 RAM) i sprawić, aby plik DMA był przesyłany strumieniowo. obecnie strumienie DMA ze stałego adresu, ale w razie potrzeby mogę je wygenerować.
Spójrz na ten plik PDF rozdziału wyjaśniającego, w jaki sposób jądro Linux zarządza pamięcią wirtualną i fizyczną. Podaje przykłady mapowania i przypinania pamięci fizycznej dla różnych scenariuszy. http://lwn.net/images/pdf/LDD3/ch15.pdf –
@bromanous Czy opracowałeś to urządzenie samodzielnie, czy jest to rdzeń IP innej firmy, którego nie możesz zmodyfikować? Jeśli możesz go zmodyfikować, bardzo polecam skonfigurować oprogramowanie adresowe DMA, aby móc korzystać ze standardowych funkcji DMA, o których mówi tian_yufen. –
@BenjaminLeinweber, tak, mam kod źródłowy dla jądra DMA i mogę skonfigurować adres, z którego pochodzą strumienie DMA i ustawić go jako parametr ogólny. – bromanous