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. |
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.