Wątek przeniesiony 2017-03-06 18:21 z C/C++ przez kq.

Jak się komunikuje kernel space z user space w linuxie

0

Witam
Od paru dni zapoznaję się z kernel API linuxa, z programowaniem driverów po stronie kernela. Na początku zanim zacząłem padło stwierdzenie w mojej pracy że kernel space komunikuje się z user space za pomocą plików. No to sobie pomyślałem, że to działa tak, że mamy device driver w kernel space (czyli moduł kernelowy) który pisze do jakiegoś pliku. Ten plik to tzw. char device i jest on w katalogu linuxa /dev. Następnie z user space ja czytam z tego pliku. Teraz jednak po przeczytaniu coraz więcej materiałów, rozdziałów w książkach musze stwierdzić, że to jest nieprawdą. Po prostu implementujemy bibliotekę - device driver w kernel space (musimy zaimplementowac pewne metody jak write, mmap, read tzw. file_operations). Ten device driver w tym kernel space nosi potocznie nazwę char device driver. Jak już go zaimplementujemy to go do kompilujemy, linkujemy, instalujemy w linuxie i w ten sposób pojawi się nam w katalogu /dev. Następnie z user space'a po prostu wywołujemy metody tego drivera, nie tak dosłownie bo nie przez kerneldDeviceDriver->open, mmap itd. Ale po prostu np. fd = open(/dev/deviceDriver), mmap(fd, ...), write(fd, ...) itp.. Czyli innymi słowy nie ma 3 plików : driver w kernel space, plik pośredniczący, driver w user spejsie, tylko są dwa: driver w kernel space'ie i user space. Czy mam rację i dobrze to rozumuje?

1

Tak samo jak w windowsie: syscallami.

Skoro bawisz się w low-level, możesz przy okazji zrobić jakiś linuxowy hello-world w asemblerze. Dla leniwych: https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux#syscall_2.

Syscall to takie cudo, które powoduje e dzieje się magia, i z userspace kod magicznie skacze w przestrzeń kernela i rozpoczyna wykonywać specjalną funkcję obsługującą sycalle.
Mała uwaga: "syscall" to ogólna nazwa na technikę ("system call", wywołanie systemu), która może być implementowana za pomocą opkodu "syscall" (nowe systemy) albo "int 0x80" (starsze systemy linuxowe) albo "int 0x2e" (staaaare windowsy).

Tak czy inaczej, co dokładnie robią te syscalle? W sumie to wszystko, bez nich nie działałoby nic :P. Bo owszem, bez syscalli można sobie policzyć wszystko, ale już żeby dane gdziekolwiek zapisać (albo przeczytać), potrzebujemy kernela.
No i przykładowo to np:

  • sys_read (czytanie z szeroko pojętego pliku)
  • sys_write (pisanie do szeroko pojętego pliku)
  • open (otwieranie pliku)
  • close (zamykanie pliku)
  • select, clone, fork, exit, execve, dup, getuid...

Dzięki temu program może komunikować się ze światem/dyskiem/internetem/innymi procesami, a nie żyć w swoim małym samotnym userspace.

A jaki to ma związek z driverami? Bo jeśli program otwiera plik z dysku, to kernel odpytuje sterownik filesystemu i zwraca wynik. A jeśli program otwiera "plik" np. Twojego własnego sterownika i czyta z niego, to kernel odpytuje Twój sterownik co ten program odczytał, i zwraca wynik.

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