pobierz adres fizyczny bufora pod Linuksem

Używam jądra Linux 3.3 na Microblaze Xilinx z pełnym MMU. zadanie, które wykonuję, wymaga ode mnie następujących informacji: muszę utworzyć plik tekstowy (bufor) i zlokalizować adres fizyczny tego bufora i nie chcę, aby jądro zapisywało ten plik w nieciągłych obszarach pamięci.

powód, dla którego tego potrzebuję, ponieważ mam silnik DMA, który przesyła dane z ustalonego adresu pamięci fizycznej, więc muszę zmusić Linuksa do utworzenia pliku bufora w tym samym miejscu w pamięci, aby podczas zapisywania danych do tego pliku jego natychmiast przesyłane przez silnik DMA do innego rdzenia sprzętowego

Więcej szczegółów:

mój system ma 512 MB pamięci RAM DDR3 podłączonej do systemu za pośrednictwem wieloportowego kontrolera pamięci (MPMC) „Xilinx”. Podstawowym adresem tego kontrolera pamięci jest 0x90000000, wszystkie jednostki w systemie uzyskują dostęp do pamięci za pośrednictwem tego kontrolera, w tym MicroBlaze, The DMA Jednostka, którą posiadam, używa specjalnego interfejsu o nazwie Native Personality Interface (NPI) do komunikowania się z pamięcią na bardzo niskim poziomie, co skutkuje bardzo wysoką prędkością.

Ta jednostka NPI DMA została pierwotnie zaprojektowana do wykorzystania pod bardzo podstawowym wbudowanym jądrem o nazwie „xilkernel”, która nie obsługiwała pamięci wirtualnej, żadne MMU nie było częścią MicroBlaze, więc programista mógł zobaczyć, gdzie będzie rezydował kod OS i wybrać pamięć fizyczną adres taki jak 0x91800000 jako adres źródłowy, z którego będzie przesyłany strumień DMA, wtedy programista może umieścić plik w tym dokładnym adresie i uruchomić system

kiedy musieliśmy przeprowadzić migrację projektu do używania Linuksa zamiast Xilkernela, natrafiliśmy na ten problem, mam pliki na zewnętrznym urządzeniu pamięci masowej, do których mogę uzyskać dostęp jako urządzenie blokowe z Linuksa i muszę przenieść każdy plik do pamięci głównej (DDR3 RAM) i spraw, aby plik DMA przesyłał strumieniowo plik. obecnie strumienie DMA z ustalonego adresu, ale w razie potrzeby mogę go uogólnić.

questionAnswers(2)

yourAnswerToTheQuestion