Bezwzględny wskaźnik do procedury

0

Witam,
pisze 2 programy, pierwszy będzie czyms typu serwera a drugi klienta. Serwer odczytuje dane z pliku mapowanego i je przerabia, drugi natomiast wysyła te dane i czeka na odpowiedź. Chodzi mi o jak najlepszy przesył danych binarnych i jak najszybsze ich przerobienie (może lepiej korzystać z Pipes?). Pytanie jest takie - jak przesłac wskaźnik do procedury/funkcji z klienta tak aby serwer mógł ją wykonać? W Asmie podaje sie bezwzględny adres początku procedury,m w Delphi nie mam pojęcia jak się za to wziąć. Prosiłbym o pomoc
Pozdrawiam,
Patryk Kicinski

0

Jeżeli klient nie będzie miał dokładnie tej samej funkcji pod tym samym adresem co serwer (a jeżeli nie jest to jedna aplikacja, to naprawdę wątpliwe, aby miał), Twój sposób się nie sprawdzi.
Łatwiej będzie wysłać po prostu nazwę tego, co serwer ma zrobić.

0

to nie byłoby zbyt bezpieczne
najlepiej przesyłaj identyfikator procedury a w programie zrób mapowanie identyfikatorów na funkcje

0

Moze opisze mój problem. Chce w ramach nauki Asma zrobić kilka dll'ek symulujących działanie poszczególnych elementów komputera. Dla symulacji dysku twardego wedle mojego pomysłu, muszę przesyłac takie elementy jak np. uchwyt (który nie wiem czy działać będzie, raczej nie), czasami przesyłac będe musiał wskaźnik na klasę, a czasami na funkcję. Zmienne/stałe nie są problem. Problem sie pojawia przy procedurach - a według specyfikacji działania procesora powinna być możliwość przesłania całej procedury w formie wskaźnika (jako bezpośrednie odwołanie do pamięci, stamtąd i tak działanie wróci do naszego programu). Prosiłbym więc o przemyślenie problemu, w przeciwnym razie złym pomyslem przesłanie całej procki przez plik mapowany nie jest - ale wiązaloby sie z przeslaniem i procedur dodatkowych, importowanych itd co moze okazac się niemozliwe.

0

Wciąż nie mam pojęcia, co robisz i dlaczego, ale z całą pewnością masz to źle zaprojektowane.
Piszesz coś w stylu VMki?

0

Program, który nie ma najmniejszego sensu (przynajmniej na razie go nie widzę), głównie ćwiczenie programowania i rozwiązań różnych. Każda DLLka odpalana będzie małym zewnętrznym programem, który będzie się do niej odwoływał (mapowanie), a one połączone będą czymś w rodzaju sterownika - przekazującego wchodzące do niego procedury do poszczególnej części programu. Dzięki temu stworze (pod Windowsem xD) własny ekran który będe obsługiwał (DLLka SCREEN), osobno będzie moduł liczący (DLLka na zasadzie koprocesora) itd. Rodzielaniem zajmowac się będzie sterownik. Odpalając główny program będzie on wykonywał kod znajdujący się w jakimś pliku - najpierw symulacja bootowania, potem odpalania poszczególnych skrypcików (w formie bitowej)-przesyłanie poszczególnych polecen do sterownika głównego, stamtąd do poszczególnych modułów, tak w skrócie.

Taki program, jak myślałem nad nim, będzie przesyłał informacje w formie liczbowej, bez różnicy czy to liczba, czy wskaźnik na daną. I czasami przesłać musiałbym wskaźnik do jakiejś prawdziwej procedury z Delphi.

Mam nadzieje, że nie zamieszałem. Program jak widac za dużego sensu nie ma, będzie to zlepek bibliotek, które może kiedys gdzieś ktos wykorzysta raczej osobno. Przy aktualnych procesorach to tylko głupie tracenie mocy obliczeniowej, ale wspaniałe ćwiczenie.

0

Zakładając, że masz dostęp do pamięci innych DLLek, mógłbyś technicznie wysłać adres procedury korzystając z @ (@procedura zwróci Ci wskaźnik na jej początek) i odpalić ją za pomocą TProcedure(pobrany_adres)(); (czy jak tam będzie wyglądać jej deklaracja).
Ale imho lepszym ćwiczeniem byłoby napisanie rzeczywistej VMki jakiegoś Twojego wymyślonego bajtkodu, która implementowałaby kompilator JIT wraz z optymalizatorem. To jest dopiero zabawa ;)

0

Nie jestem po informatyce, tez nie bardzo sie interesuje informatyką z teoretyczxnego punktu widzenia, ale jak sprawdziłem to cos mniej a wiecej takiego pisze :))

Metoda z wykorzystaniem wskaźników tak jak pokazujesz jest ok ale działa tylko w obrębie jednego programu. DLLki nie korzystają z jednej pamięci w komputerze, tylko w celach bezpieczenstwa każdy program otrzymuje własną część pamięci i tam ładuje DLLki, program i wszystko. Stąd wzkaźnik na procedurę czy z DLLki czy z programu będzie działał tylko w jednej instancji a nie w całym systemie. W ASMie jest jeden opcode, nie moge teraz sobie przypomnieć który, dodający właśnie do naszego względnego wskaźnika ( @procedura ) adres sektora danych - co w teorii powinno być już bezwzględne, ale ze względu na moją znikomą wiedze z ASMa, ciezko mi to zastosować. Wiec na chwile obecną nie mam pojęcia jak przesłać wskaźnik na procke między procesami

1

A nie mógłbyś przesłać nazwy, a potem skorzystać z GetProcAddress?
Można by do tego potem dorzucić jeszcze jakąś mapę nazwa-adres, aby nie trzeba było wołać do API za każdym razem.

0

Hm w teorii masz rację :D to mogłoby działac - pomysł wiec zapamiętam, dziękuję :) Natomiast nadal zostaje pytanie - jak w sposób czysto fizyczny przesłac wskaźnik, może kiedyś się komuś to też przyda :)
ta procka ASM to lei - jeszcze poćwicze cos na niej

0

FPC od 2.7.1 posiada tzw.farpointery, mógłbyś tam pokombinować - ale nic, poza to że istnieją, nie wiem.

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