Skip to content
MaximeCheramy edited this page Feb 12, 2012 · 5 revisions

Généralités

Un terminal virtuel est un émulateur de terminal. C'est ce qui fait le lien entre les périphériques d'entrée (clavier, série, ...) et les périphériques de sortie (écran, série, ...).

Les principales fonctionnalités sont :

  • L'édition de ligne : c'est pouvoir utiliser backspace pour supprimer des caractères tant qu'on a pas validé par l'appuie sur la touche Entrée. Désactivable en passant en mode Canonique.
  • L'échoing : pour afficher à l'écran chaque touche appuyée. Désactivable.
  • Contrôle d'accès : pour bloquer certains processus qui essayent de lire le terminal sans être au premier plan par exemple.
  • Configuration : vitesse, parité, etc.
  • Envoi de signaux : c'est de là que partent les signaux suite à la combinaison de certaines touches (ex: Ctrl+C).

Les terminaux sous TacOS sont inspirés de ceux de Linux (en plus simple), donc pour en apprendre d'avantage, le mieux c'est de lire http://lwn.net/images/pdf/LDD3/ch18.pdf

Les terminaux dans TacOS

Le couple (clavier, console) et la liaison série sont des exemples de drivers de type tty. Lors de l'arrivée d'une donnée (ex: l'appui d'une touche), la donnée est envoyée dans un buffer du tty via la fonction tty_insert_flip_char (le nom peut porter à confusion, il n'y a pas de flip buffer dans TacOS contrairement à Linux). Et lors d'une écriture sur le terminal, les données sont envoyées directement à la fonction write ou put_char du driver.

Driver TTY

Pour créer un driver tty, il faut :

  • Faire un alloc_tty_driver avec le nombre d'instances.
  • Configurer tout ce qu'il faut, en particulier le write, pas besoin de read car le driver doit faire un appel à tty_insert_flip_char.
  • Terminer par un tty_register_driver.

Configuration

La configuration d'un terminal se fait à l'aide de la structure termios :

struct termios {
	tcflag_t c_iflag; /**< Input modes. */
	tcflag_t c_oflag; /**< Output modes. */
	tcflag_t c_cflag; /**< Control modes. */
	tcflag_t c_lflag; /**< Local modes. */
	cc_t c_cc[NCCS];  /**< Control chars. */
	speed_t c_ispeed; /**< Speed (serial). */
};
  • c_iflag : Mode d'entrée, par exemple prise en compte des retours lignes ou non, de les convertir, etc.
  • c_oflag : Mode en sortie, similaire à c_iflag mais vers la sortie.
  • c_cflag : Mode de contrôle, vitesse, parité, etc.
  • c_lflag : Contrôle de l'echo, du mode canonique, la façon de supprimer, etc.
  • c_cc : Caractères de contrôle, c'est un tableau où l'on va faire le binding entre les touches et les actions (ex: INTR, SUSP...)
Clone this wiki locally