Najczęstsza komunikacja z kernelem, driverami jest właśnie przez interface pliku, deskryptor.
Gdzie wypełniamy strukturę w C.
static struct file_operations fops = {
.open = dev_open,
.read = dev_read,
.write = dev_write,
.release = dev_release,
};
I teraz dla przykładu jak chcielibyśmy zrobić komunikację jakąś dowolną.
To przy open() syscallu wywołuje się funkcją .open()
i tam robimy jakąś inicjalizacje np. ustawienie bitrate, nawiązanie połączeni, konfiguracja.
Potem przy read i write, możemy odczytywać kolejkę danych, które przychodzą od urządzenia lub przy write pisać do kolejki, gdzie kernel sobie wysyła w swoim tempie dane do urządzenia.
Kolejki są bardzo często stosowane czy to przy different clock domains.
W windowsie też często wygląda podobnie komunikacja z driverami kernela, używa się komunikacji za pomocą plików, ale jest trochę inniej wyglądająca ścieżka jak:
\\\\.\\MyDriver
\\DosDevices\\C:\\Users\\dupa\\plik.txt
hDevice = CreateFileA(RegistryPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
DeviceIoControl(hDevice, IO_GET_CLIENTADDRESS, (LPVOID)cmd.c_str(), (DWORD)cmd.size(), Buf, sizeof(Buf), &Bytes, NULL);
Więc to bardzo podobnie wygląda.
Skąd wiem? bo pisałem drivery pod linucha i windę.
Na linuxie open to na windowsie CreateFile, na linuxie read to na windowsie ReadFile i write to WriteFile.
A może jednak gorzej? Kiedyś robiłem taki test - w narzędziu top
przytrzymanie spacji (odświeżanie widoku) powodowało znaczny skok użycia CPU pod Linuxem, a pod FreeBSD nie. To było wyjaśnione tym że pod Linuxem tam się dzieją operacje plikowe które są wolniejsze niż proste systemowe calle. Nie wiem czy to tłumaczenie było słuszne, ale różnicę można było zaobserwować.
Operacje na plikach robi się syscallami więc to są proste systemowe calle, to jest to samo.
Operacja na pliku to wywołanie syscalla open i syscala read lub write.
Linux ma virtual file system, gdzie tam struct inode
to może być prawdziwy plik lub jakiś driver oba mają takie same interface to mamy tu doczynienia z polimorfizmem.
Są też inne metody komunikacji, ale ta jest dosyć prosta, swoich syscalli raczej się nie dodaje do systemu.
Komunikacja za pomocą plików jest bardzo popularna na każdym systemie.
Ale wszystko nie jest plikiem, pliki służą do komunikacji na windowsie i linuxie, linux ma prostą strukturę, a w windowsie trzeba szukać jaki path mają dane urządzenia, nie sprawdzisz tego przez file system.
Jądro windowsa to ntoskrnl.exe