2011-09-13 11 views
12

Obecnie uczę się o systemach operacyjnych, w których używa się pułapek, aby ułatwić wywołania systemowe w jądrze systemu Linux. Znalazłem tabelę pułapek w pułapce .c oraz implementację wielu pułapek w obrębie wpisu.Implementacja wywołań systemowych/pułapek w jądrze Linuksa źródło

Jednakże, jestem instruowany, aby znaleźć implementację dwóch wywołań systemowych w jądrze systemu Linux, które wykorzystują pułapki do wykonania wywołania systemowego. Chociaż mogę znaleźć definicję samych pułapek, nie jestem pewien, jak mogłoby wyglądać "wywołanie" jednej z tych pułapek w jądrze. Dlatego staram się znaleźć przykład tego zachowania.

Zanim ktokolwiek zapyta, tak, to jest praca domowa.

Jako notatkę używam GitHub przeglądać źródła jądra, gdyż kernel.org jest w dół: https://github.com/torvalds/linux/

+2

Dobre pytanie o zadanie domowe :) – James

+6

Użyj http://lxr.linux.no/, aby przeglądać źródło linux. Zaoszczędzi ci mnóstwo czasu;) – rumpel

+0

@rumpel: nigdy o nim nie słyszałem ... wygląda całkiem zwyczajnie. czy jest tu coś specjalnego, czego nie ma w vim + 'ctags'? –

Odpowiedz

0

mi polecił znaleźć implementacja dwóch wywołań systemowych w jądrze Linuksa które wykorzystują pułapek wdrożyć wywołanie systemowe

Każde wywołanie systemowe wykorzystuje pułapki (przerwanie 0x80 jeśli dobrze pamiętam), więc „jądro” bit zostanie włączona w PSW, a uprzywilejowane operacje będą dostępne dla procesora .

Jak wspomniano system połączeń podano w entry.S pod sys_call_table: i wszyscy zaczynają się od przedrostka „SYS”.

można znaleźć funkcję nagłówka wywołań systemowych w: include/linux/syscalls.h, można go znaleźć tutaj: http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h

Używaj LXR (w komentarzu wyżej już wymienionych) w ogóle w celu przeglądaj kod źródłowy.

Tak czy inaczej, funkcja są realizowane za pomocą SYSCALL_DEFINE1 lub inne ciekawe nagrody wersje makro, patrz http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c

+1

Istnieją również wywołania zwrotne, które nie wymagają przerwania. Nie jestem pewien, w jaki sposób są one zaimplementowane, więc będziesz musiał google, przepraszam. – RedX

+0

@RedX Masz rację ogólnie, ale jestem całkiem pewny, że system wywołuje w Entry.S poniżej 'sys_call_table' są zaimplementowane z przerwaniem (Po krótkim przeczytaniu kodu) –

+2

@RedX Istnieją instrukcje SYSENTER/SYSEXIT w x86 o których prawdopodobnie myślisz: http://articles.manugarg.com/systemcallinlinux2_6.html – SoapBox

0

Jeśli szukasz rzeczywistej wywołania systemowego, a nie realizacja wywołania systemowego, może chcesz sprawdź niektóre biblioteki C. Dlaczego jądro zawiera wywołanie systemowe? (Nie mówię tu o realizację połączeń systemu , mówię np rzeczywiste chdir połączeń na przykład. Jest chdirwywołanie systemowe, który to wniosek o zmianę katalogu i jest chdirwywołanie systemowe, które faktycznie to zmienia i musi znajdować się gdzieś w jądrze). OK, może niektóre jądra zawierają także kilka numerów systemowych, ale to już inna historia :)

W każdym razie, jeśli dobrze odpowiem na twoje pytanie, nie szukasz implementacji, ale rzeczywiste połączenie. GNU libc jest dla mnie zbyt skomplikowane, ale możesz spróbować przeglądać źródła dietlibc. Kilka przykładów:

chdir.S

syscalls.h

7

Dla architektury x86 SYCALL_VECTOR (0x80) przerwania służy tylko dla wersji 32-bitowych. Możesz zobaczyć układ wektora przerwań w arch/x86/include/asm/irq_vectors.h.trap_init() funkcja z traps.c jest ten, który ustawia obsługi pułapki zdefiniowany w entry_32.S:

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

Dla 64-bitowych jąder, nowy SYSENTER (Intel) lub syscall (AMD) intructions są używane ze względu na wydajność. Funkcja syscall_init() z arch/x86/kernel/cpu/common.c ustawia "handler" zdefiniowany w entry_64.S i ma tę samą nazwę (system_call).

Dla użytkownika przestrzeni kosmicznej możesz przyjrzeć się this page (nieco przestarzałe dla nazw funkcji/plików).

Powiązane problemy