2012-07-23 14 views
7

Pracuję nad małym systemem wbudowanym. Kiedy mój Linux uruchamia się w przestrzeni użytkownika, wiem, gdzie są moje urządzenia w pamięci fizycznej. Chcę je odwzorować na wirtualne adresy przestrzeni użytkownika. Obecnie robię to za pomocą modułu jądra. Używam vmalloc/kmalloc (w zależności od rozmiaru), a następnie używam ioremap_page_range na tych zwracanych wirtualnych adresach do mapowania moich adresów fizycznych. Nie sądzę, że jest to właściwy sposób postępowania. Przede wszystkim przydzielam pamięć, a następnie proszę jądro, aby zmapować tę wirtualną przestrzeń adresową na inną fizyczną przestrzeń adresową. (Początkowo zmapowany fizyczny-> wirtualny w vmcall/kmalloc jest trochę bezużyteczny, ponieważ nie dbam o te fizyczne strony.To zdecydowanie nie jest dobre.)Mapowanie adresów fizycznych na adresy wirtualne linux

Zamiast tego istnieje lepszy sposób odwzorowania znanej pamięci fizycznej na użytkownika proces kosmiczny. (Wiem, inny niż mój proces przestrzeni użytkownika, nikt nie zamierzam dotyk że pamięć.)

Dzięki

Odpowiedz

5

Co próbujesz zrobić korzysta co nazywa pamięć IO. Mogę tylko zachęcić do zapoznania się z Linux sterowniki urządzeń (LDD) książkę a dokładniej w rozdziale 9.

Do „przydzielić” tego obszaru, trzeba zadzwonić

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name) 

. Przed sterownik do niego dostęp, trzeba przypisać mu adres wirtualny, odbywa się to z wezwaniem do

void *ioremap(unsigned long phys_addr, unsigned long size) 

Aby upewnić się, że kierowca będzie wtedy pracować na różnych architekturach/platform, należy użyć trochę akcesor funkcja do takich obszarów (ioread8/16/32 lub iowrite8/16/32 i wszystkie ich warianty).

3

W moduł jądra, remap_pfn_range() może być użyty do konwersji adresu fizycznego do wirtualnego adresu. Poniższy link będzie pomocny.

How remap_pfn_range remaps kernel memory to user space?

+0

Muszę zrobić mmap zanim zrobię remap_pfn. Jednak nie chcę tego robić. Nie mam urządzenia związanego z tą pamięcią. Tak więc chcę bezpośrednio odwzorować tę pamięć fizyczną na adres wirtualny. Dzięki –

0

W module Kernel, remap_pfn_range() może być użyty do konwersji adresu fizycznego na adres wirtualny. Jeśli nie masz rzeczywistych urządzeń, możesz: 1) utworzyć wirtualne urządzenie i, 2) użyć mmap do tych wirtualnych urządzeń, aby uzyskać dostęp do tej samej pamięci jądra poprzez remap_pfn_range wirtualne mapowanie tego procesu. 3) Zazwyczaj w dedykowanych środowiskach możesz dodatkowo przypiąć te fizyczne strony, aby nie zostały one zabrane z procesu. 4) Udostępniasz te fizyczne adresy także w różnych procesach, ale będą one musiały obsługiwać synchronizację, niezależnie przez inne mechanizmy IPC, co do każdego procesu, który będą wyglądać jak różne adresy.

Powiązane problemy