2014-05-21 5 views
6

Oto wezwanie ioctl w przestrzeni użytkownika:Skąd Linux wie, z której funkcji wywołać ioctl?

int ioctl(int fd, int cmd, ...); 

O ile mi wiadomo, kiedy chcemy perfrom operacji IO, możemy zdefiniować własne ioctl funkcję z zestawem wniosków (polecenia), przypisywać naszą ioctl do file_operations struktury, jak to:

struct file_operations fops = { 
.read = device_read, 
.write = device_write, 
.ioctl = device_ioctl, // device_ioctl is our function 
.open = device_open, 
.release = device_release, 
}; 

a funkcja device_ioctl jest definiowany różnie w stosunku do przestrzeni interfejs użytkownika:

static long device_ioctl(struct file *f, unsigned int cmd, unsigned long arg) 

Myślę, że w oparciu o deskryptor pliku, jądro może uzyskać odpowiednią strukturę plików i wywołać urządzenie ioctl.

To tylko przypuszczenie, bo nie mogę go znaleźć ogólną definicję funkcji gdzie jądro wybiera odpowiedni ioctl funkcję na podstawie deskryptora fd przeszedł do rodzajowego ioctl interfejsu? Są tylko 3 ioctl definicje mogę znaleźć, ale widocznie to są tylko definicje tych urządzeń, a nie jądra: ioctl

+1

proszę dać mi znać, co te kropki (**. **) oznaczają tutaj i jak to działa jako wskaźnik funkcji? Jestem ciekawy wiedzieć. – indranil

Odpowiedz

5

Look w kodzie źródłowym Linux, fs/ioctl.c (http://lxr.free-electrons.com/source/fs/ioctl.c)
Nie widać syscall do ioctl:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) 

To z kolei połączeń do_vfs_ioctl(), która zwraca vfs_ioctl (), który następnie wywołuje funkcję unlocked_ioctl zdefiniowaną dla tego systemu plików w strukturze file_operations.
To będzie zarejestrowana funkcja device_ioctl.

+0

Wreszcie. Dzięki. – Amumu

2

device_ioctl jest wskaźnik funkcji. Jądro przyjmuje po prostu fd jako indeks do tablicy struct file_operations i wywołuje .ioctl odpowiedniego elementu. Jądro nigdy nie musi wiedzieć, czym jest ta funkcja, do której urządzenia się odnosi.

Jest to podstawą "Wszystko jest plikiem", czyli motorem Unixa.

+0

Dzięki. Wiem, że to wskaźnik funkcji. Ale gdzie jest miejsce, w którym zaimplementowano ogólny "ioctl" w przestrzeni użytkownika, aby poprawnie wybrać funkcję w tablicy operacji file_operations? – Amumu

+0

@Aumumu, to _nie_ w przestrzeni użytkownika. Przestrzeń użytkownika 'ioctl' jedynie wywołuje wywołanie systemowe ioctl, przekazując parametry. Jest to ogólny "ioctl" w _kernel space_, który przegląda tablicę 'struct file_operations'. – Shahbaz

+0

@Shabaz Odnoszę się do 'ioctl' zwykle używanego w aplikacji użytkownika jako przestrzeń użytkownika' ioctl'. Tak wiem, że wybiera odpowiedni "ioctl" w przestrzeni jądra. Zastanawiam się jednak, gdzie jest zaimplementowany ogólny "ioctl" w przestrzeni jądra. Szukałem, i to tylko daje 3 definicje, a wszystkie te 3 definicje to 'ioctl' kierowców: http://lxr.free-electrons.com/ident?i=ioctl – Amumu

0

Jądro będzie wiedzieć, która funkcja ioctl zadzwonić z powodu deskryptora pliku . Aby móc wywołać ioctl() z przestrzeni użytkownika, będziesz musiał otworzyć plik, aby uzyskać fd, typowo a/dev/[some_device], którego sterownik zaimplementuje strukturę file_operations, jak zauważyłeś.

1

Po wywołaniu ioctl przekazujesz deskryptor pliku. Masz deskryptor pliku z otwarciem pliku urządzenia jak /dev/tty0:

$ ls -l /dev/tty0 
crw--w---- 1 root tty 4, 0 Mar 6 10:47 /dev/tty0 
$ 

Liczba 4 tutaj jest głównym numer urządzenia, które są kodowane do modułu sterownika jądro do użycia.

+0

Czy wiesz, gdzie w kodzie jądra wybiera odpowiednie urządzenie 'ioctl' oparte na fd? – Amumu

Powiązane problemy