2012-06-20 8 views
8

Poszukuję sposobu wywołania funkcji C w innym stosie, tj. Zapisz bieżący wskaźnik stosu, ustaw wskaźnik stosu w innym miejscu, wywołaj funkcję i przywrócić stary wskaźnik stosu, gdy wróci.Wywołanie funkcji C z innym wskaźnikiem stosu (gcc)

Celem tego jest lekki system gwintowania dla języka programowania. Wątki będą działać na bardzo małych stosach, sprawdzają, kiedy potrzeba więcej stosu i dynamicznie zmieniają jego rozmiar. Jest tak, że tysiące wątków mogą być przydzielane bez marnowania dużej ilości pamięci. Podczas wywoływania do kodu C nie jest bezpiecznie używać małego stosu, ponieważ kod C nie wie o sprawdzaniu i zmianie rozmiaru, więc chcę użyć dużego stosu pthread, który jest używany tylko do wywoływania C (dzielony między wątki lekkie na ten sam pthread).

Teraz mogę napisać kodeksy kodu montażowego, które będą działały dobrze, ale zastanawiałem się, czy istnieje lepszy sposób, aby to zrobić, takie jak rozszerzenie gcc lub biblioteka, która już je implementuje. Jeśli nie, to domyślam się, że pochylę głowę w ABI i podręcznikach asemblerowych ;-) Ja tylko pytam o to z lenistwa i nie chcę wymyślać koła.

+0

Możesz zaimplementować własne "wątki" za pomocą zindywidualizowanych stosów za pomocą systemu klonowania. Jeśli używasz bezpośredniego wywołania systemowego zamiast pakowania libc, działa to prawie jak fork, z tym wyjątkiem, że możesz określić, które zasoby i przestrzenie nazw są współużytkowane. – technosaurus

Odpowiedz

2

Zakładając, że używasz wątków POSIX i systemu POSIX, możesz to osiągnąć za pomocą sygnałów. Skonfiguruj alternatywny stos obsługi sygnału (sigaltstack) i wyznaczy jeden specjalny sygnał czasu rzeczywistego, aby jego przewodnik był uruchamiany na alternatywnym stosie sygnałów. Następnie sygnał, aby przełączyć się na stos, i obsługi sygnału odczytać dane dla jakiej funkcji, aby wywołać, i jaki argument przekazać go, z danych lokalnych wątku.

Należy zauważyć, że takie podejście jest dość kosztowne (wielokrotne wywołania systemowe dotyczące zmiany stosów), ale powinno być w 100% przenośne dla systemów POSIX. Ponieważ jest on powolny, możesz chcieć, aby funkcje specyficzne dla archa-łuku wywoływano w zespole i używaj tylko mojego ogólnego rozwiązania jako rezerwowego dla architektury, w której nie napisałeś wersji zespołu.

+0

To interesujący pomysł, ale za drogi, ponieważ używa wywołań systemowych. Dzięki za odpowiedź. –

+0

Cóż, jeśli jesteś gotów napisać asm dla cpusu, o który się troszczysz, może to stanowić przyzwoitą rezerwę. Można również uznać stary API 'makecontext' (przestarzały w POSIX 2001, usunięty w 2008 r.) Jako pierwszy element zastępczy, ponieważ można go wykonać w całości w przestrzeni użytkownika. –

+0

Ogólnie rzecz biorąc, będzie działać ustawienie własnego stosu i posiadania kilku skrótów montażowych do zamiany kontekstów. Możesz jednak uruchomić "kontrole stosu", które wymuszają, że wskaźnik stosu znajduje się w określonym zakresie pamięci. Musisz zamienić ograniczenia stosu (gdziekolwiek są przechowywane na twojej platformie) wraz ze wskaźnikiem stosu. Na przykład w systemie Windows znajduje się w _TIB :: StackLimit i _TIB :: StackBase w segmencie GS. – doug65536