2013-04-05 13 views
7

Czasami, gdy musimy wywołać wywołanie systemowe w systemie jądra, wywołujemy pomocnika lub powiązane funkcje jądra, zamiast tego wywołujemy funkcję "syscall". Nadal się zastanawiam, czy możemy wywołać wywołanie systemowe w przestrzeni jądra? Jeśli nie, to powstrzymuje nas przed zrobieniem tego.Czy możemy wywołać wywołanie systemowe w przestrzeni jądra?

Moje pytanie jest trochę dziwne.

+0

Nie, nie możesz. Wywołanie systemowe jest z definicji interfejsem między jądrem a krajem użytkownika –

+0

Wiedziałem. To, co robimy, nazywa się pomocnikiem lub innymi funkcjami. Jestem ciekawa, czy możemy to zrobić, czy nie. – liuyruc

+0

A wywołanie systemowe jest prawdopodobnie także punktem planowania; więc nie chcesz wywoływać jego funkcji w dowolnym punkcie jądra. Ogólnie, kodowanie jądra jest bardzo trudne. Powinieneś wyjaśnić znacznie więcej, co i dlaczego chcesz to zrobić ... –

Odpowiedz

9

Właściwie, wbrew powszechnemu przekonaniu (i niektóre odpowiedzi tutaj), odpowiedź brzmi: tak, można, ale w zależności od której OS:

  • W Linuksie można nazwać niemal wszystkie wywołania systemowe, jeśli możesz znaleźć eksport ich jądra (wykonaj "cat/proc/kallsysms | grep sys_" dla przykładu). Istnieje niewielka "sztuczka", aby obejść ochronę w większości systemów (tych, które akceptują tryb użytkownika *), ustawiając segment danych (KERNEL_DS). Nie jest to dokładnie zalecane, ale z pewnością ma sens, jeśli potrzebujesz dostępu do plików z jądra (np. SELinux).

  • W systemie Windows większość połączeń Nt * w jądrze jest również dostępna jako wywołania Zw * - wykonaj "dumpbin/exports C: \ windows \ system32 \ ntoskrnl.exe | findstr Zw (lub Nt)" dla przykład.

  • W systemie Mac OS X technicznie nie powinno być dozwolone, chociaż istnieją sprytne hacki, aby ominąć to.

Choć wywołania systemowe są rzeczywiście interfejs pomiędzy trybem użytkownika i jądra, są zaskakująco sporo przypadków, w których produkcja nawet godne kod robi to - ale poprzez staranne przestrzeganie zastrzeżeniami.

+1

Jednak narzeka "Nieznany symbol sys_socket", kiedy insmod. –

+0

Może to być spowodowane tym, że symbol jest tylko GPL. Linux jest kiedyś taki. spróbuj cat/grep od góry, a jeśli widzisz wyeksportowany symbol (T), i nadal nie możesz do niego linkować, to jest prawdopodobne. Nie wszystkie wywołania syscalls są koniecznie eksportowane. Również z gniazdami w szczególności są inne problemy, ale nie komplikujmy - spróbujmy najpierw – Technologeeks

Powiązane problemy