Wskaźnik na strukture w innym programie.

0

Czy jest możliwe odwołanie się od adresu pamięci wykorzystywanej przez inny program?

Mam program A w którym znajduje się tablica struktur. Chciał bym do programu B przekazać adres tej tablicy (np przy pomocy socketu czy ZMQ) i odczytać jej wartości. Niestety gdy tak robiłem to odczytane wartości były całkowicie inne. Wartości mogły być inne przez błąd w kodzie czy po prostu tak się nie da przekazywać wartości?

1

To jest zależne od systemu. W żadnym nowoczesnym tak się nie da, chyba, że zastosujesz jakieś narzędzia do współdzielenia pamięci lub czytania pamięci innego procesu.

2

Chciał bym do programu B przekazać adres tej tablicy (np przy pomocy socketu czy ZMQ) i odczytać jej wartości

Adresu tak przekazać nie można, bo każdy proces ma osobną przestrzeń adresową.
Przekaż dane.
A jeśli jest ich bardzo dużo, poczytaj o współdzieleniu pamięci - ale to jest zależne od systemu, a nie napisałeś jaki cię interesuje.

1

Adresy w programie są inne niż adresy hardware.
Obecnie wszystkie procesory mają umiejętność hardwerowego ustalania pod jakim adresem jest dany fragment pamięci (strona).
Ergo pod każdy proces pod tym samym fragmentem adresem będzie widział co innego.

0

Asembler nie będzie rozwiązaniem? Tzn. przetłumaczenie adresu lokalnego (drugiego procesu) na globalny i odwołanie się do niego z poziomu asma?

1

Nie. Przypominam, że kod binarny, tłumaczony 1:1 do instrukcji asemblera jest wynikiem kompilacji.

0

@Juhas a co niby by to dało? Poczytaj chociaż https://pl.wikipedia.org/wiki/Pamięć_wirtualna ;] Nie da się tak latwo odwołać do pamięci innego procesu.

1

OK, no nie jestem pewien. Jeśli w grę wchodzi Windows, wydaje się, że mamy do tego już przygotowane rzeczy w WinAPI:
https://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx
http://www.codeproject.com/Articles/4865/Performing-a-hex-dump-of-another-process-s-memory

Na linuxy nie patrzyłem, więc nie wiem. Co do tych linków powyżej, to nie próbowałem, ale te rozwiązania wydają się być obiecujące.

Jeszcze to:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684320

i zapis:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681674

I kolejny ciekawy artykuł:
http://nullprogram.com/blog/2016/09/03/

1

Ale nie chodzi o to, że się nie da, tylko że nie możesz mieć w obu procesach wspólnego obszaru pamięci, w którym umieszczasz sobie zmienne i są one z automatu współdzielone. Możesz mieć "wspólną pamięć", ale to jest pojęcie z zakresu IPC, a nie po prostu obszar pamięci. Ponadto dostęp do takiego obiektu IPC musi być synchronizowany.

1

OK, no nie jestem pewien. Jeśli w grę wchodzi Windows, wydaje się, że mamy do tego już przygotowane rzeczy w WinAPI:

Ale nie tędy droga. Komunikacji międzyprocesowej (IPC) nie robi się przez ReadProcessMemory.

0

Ale ja nie mówię o typowej komunikacji. Pytanie postawione brzmiało: "Czy jest możliwe odwołanie się od adresu pamięci wykorzystywanej przez inny program?". I na to odpowiadam. A, że należałoby zadać pytanie: "Co chcesz osiągnąć", to już inna kwestia :)

0

Odpowiedź brzmi: tak. Jeśli nie przez IPC, to przez mmapa i fork. Jak nie przez mmapa to przez ptrace. Jak nie przez ptrace to w /proc/{pid}/mem masz obiekt typu plikowego reprezentujący pamięć procesu. Tyle by było z Linuksa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1