funkcja pozwalajaca na sterowanie urzadzeniem, interfejsem, ustawiania
parametrów.
EVIOCGNAME – zwraca nazwe urzadzenia (parametr do ioctl();)
Moduły:
moduły to inaczej sterowniki (coś ala Windows’owe sterowniki) w linuxie. Mogą one
obsługiwać nie tylko urzadzęnia – mogą się komunikować z urządzeniem,
odczyt/zapis w systemie pliku, obsługa protokołow.
Najogólniej służą do obsługi komunikacji niskopoziomowej.
Pliki urządzeń:
Pliki urządzeń to nic innego jak urządzenia oznaczone jako pliki w katalogu /dev. Dla
przykładu /dev/hda to inaczej Primary Master Disk. Tak naprawdę nie istnieją one
nigdzie na dysku, w pamięci procesora. Jest to jedynie konwencja, że do każdego
podstawowego urządzenia – części systemu możemy dostać się z jednego drzewa
katalogow (root). Można czytać/zapisywać ale nie otwierać.
Pliki urządzeń vs pliki zwykłe
Pliki urządzeń – czytanie / pisanie / brak otwierania (ogólnie to strumieniowanie z
/do urządzeń)
Pliki zwykłe – czytanie /pisanie / otwieranie etc
read():
??
file_operations:
struktura która jest częścią systemu plików. Zawiera wskaźniki do wielu funkcji które
mogą być wykonane na urządzeniu. Każde urządzenie ma przypisany zbiór operacji
na nim. Jeśli jakaś funkcja jest niedostępna dla urządzenia ma wskaźnik ustawiony na
NULL. Przykładowe funkcje z tej struktury to: read, write, ioctl, open, release.
Liczby major i minor:
Wszystkie urządzenia kontrolowane przez ten sam sterownik urządzenia mają tą
samą liczbę major. Liczby minor są używane do odróżnienia urządzeń i ich
kontrolerów. Liczba major jest to offset w tablicy sterowników urządzeń, tłumaczy
kernelowi jaki typ urządzenia to jest (czy jest to dysk twardy czy jakiś port
szeregowy). Natomiast liczby minor mówią kernelowi o specialnych
charakterystykach urządzenia. Dla przykładu drugi dysk twardy ma inną liczbę minor
od pierwszego. COM1 ma minor inny niż COM2 etc etc.
Copy_to_user:
??
User space / Kernel space:
Pamięc systemowa w linuxie może zostać podzielona na dwia obszary: Kernel space i
User space. Kernel Space jest to obszar w którym jądro systemu operacyjnego
uruchamia i obsługuje usługi, serwisy. Krótko mówiąc w tym obszarze znajdują się
najbardziej wrażliwe i najważniejsze usługi systemu operacyjnego.
W obszarze User space znajdują się wszystkie procesy i inne usługi utworzone /
uruchomione przez samego użytkownika (wszystko NIE-‐Kernelowskie).
Chodzi o to aby te dwie powłoki / obszary nie zależały od siebie, były od siebie
„odseparowane“ – chodzi o bezpieczeństwo. (pewno jakimś sposobem da się tam
coś pogodzić ale pomija się to ).
Register_chrdev():
Służy do rejestracji funkcji obsługi urządzenia znakowego w systemie. Pierwszy
parametr to numer (major) pod jaki ma zostać zapisane urządzenie: jeśli 0 – będzie
dynamicznie przydzielony numer. Drugi parametr to nazwa urządzenia (dla
ułatwienia, nie ma to nic wspólnego z nazwami z /dev), trzeci patametr to struktura
file_operations – która opisuje operacje związane z urządzeniem.
Funkcja rejestruje aż do 256 numerów minor. Pierwszym minorem jest 0.
Unregister_chrdev():
Odwrotna sytuacja co do poprzedniej funkcji. Ta funkcja usuwa rejestr urządzenia
z linuxa. Ważne aby nazwa „name“ była ta sama co zakładana w funkcji
register_chrdev(). Zwalnia również liczbe major do którego było zarejestrowane
urządzenie.
Jak odczytać nazwę urządzenia?:
Utworzyć otwardy deskryptor pliku:
lopen = open("/dev/input/event1", O_RDONLY);
następnie użyć funkcji ioctl i parametru EVIOCGNAME:
ioctl(lopen, EVIOCGNAME(sizeof(name)), name);
C.D.N: