Do tematu: Podsystem wejścia-wyjścia

Do tematu: Struktury danych

struct tty_ldisc

Jest to struktura zdefiniowana w pliku include/linux/tty_ldisc.h. Zawiera głównie wskaźniki do funkcji - operacji, które można wykonywać na dyscyplinie linii.

int magic numer "magiczny", dla tej struktury jest to stała TTY_LDISC_MAGIC. Do czego służą numery "magiczne"
int num numer dyscypliny linii
int flags to pole może mieć wartość 0 albo LDISC_FLAG_DEFINED, co oznacza odpowiednio, że ta dyscyplina linii nie jest albo została zarejestrowana w jądrze.
Funkcje wołane "z góry", czyli przez funkcje systemowe
int (* open)( struct tty_struct *) otwiera dyscyplinę linii
void (* close)( struct tty_struct *) zamyka dyscyplinę linii
void (* flush_buffer)( struct tty_struct * tty) opróżnienie bufora np. po wypisaniu znaków z bufora na ekran.
int (* chars_in_buffer)( struct tty_struct * tty) zwraca liczbę znaków w buforze
int (* read)( struct tty_struct *) czytanie z dyscypliny linii. Funkcja wywoływana przez funkcję tty_read (czytającą z terminala)
int (* write)( struct tty_struct *, struct file * file) pisanie do dyscypliny linii. Funkcja wywoływana przez funkcję tty_write (piszącą do terminala)
int (* ioctl)( struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg) ustawianie parametrów dyscypliny linii
void (* set_termios)( struct tty_struct * tty, struct termios * old) Jeśli zmieniły się ustawienia terminala, to jest wywoływana ta funkcja i dyscyplina linii zmienia sobie odpowiednie pola.
int (* select)( struct tty_struct * tty, struct inode * inode, struct file * file, struct select_table_struct *wait) wywoływana przez funkcję select dla terminala. Patrz: file_operations - select
Funkcje wołane "z dołu", czyli przez sterownik terminala
void (* receive_buf)(struct tty_struct *, const unsigned char * cp, char * fp, int count) przyjmowanie bufora od sterownika. Przyjmując bufor od sterownika, dyscyplina linii przetwarza znaki po kolei, obsługując różne znaki specjalne.
int (* receive_room)(struct tty_struct *) dyscyplina linii zwraca sterownikowi ilość wolnego miejsca w swoim buforze
void (* write_wakeup)(struct tty_struct *) ta funkcja jest wywoływana przez funkcję do_tty_hangup, po opróżnieniu buforów dyscypliny linii i sterownika, przed zamknięciem dotychczasowej dyscypliny linii i przełączeniem jej na N_TTY. Zapisujemy ostatnie rzeczy i kończymy pracę. Po zakończeniu tej funkcji budzone są procesy czekające na zapis i odczyt z terminala. Dla N_TTY tej funkcji nie ma, bo następuje potem przełączanie na N_TTY, a więc ta funkcja nie miałaby sensu.

Numery dyscyplin linii

W Linuxie jest kilka stałych oznaczających różne dyscypliny linii. N_TTY to dyscyplina linii taka, z jaką spotykamy się korzystając na co dzień z terminali. Przetwarza ona znaki ścierające, końca linii, umożliwia wysyłanie za pomocą klawiatury sygnałów do procesów. Jest ona zaimplementowana w pliku drivers/char/n_tty.c. Inne dyscypliny linii mają różny od niej charakter. N_PPP, N_STRIP, N_SLIP to implementacje protokołów sieciowych. Ich implementacja znajduje się w katalogu drivers/net w plikach ppp.c, strip.c, slip.c.

Jądro ma tablicę ldiscs struktur tty_ldisc indeksowaną numerami dyscyplin linii, i jeśli rejestruje daną dyscyplinę linii, to pod odpowiednim numerem umieszcza tam strukturę odpowiadającą rejestrowanej dyscyplinie linii. Na przykład dla N_TTY jest struktura tty_ldisc_N_TTY (plik drivers/char/n_tty.c). Tablica ldiscs jest zdefiniowana w pliku drivers/char/tty_io.c.


Autorka: Anna Petryk