CAST INSA de Lyon Pilote intgr de priphriques

  • Slides: 75
Download presentation
CAST - INSA de Lyon Pilote intégré de périphériques ( Vx. Works ) Jean-Philippe

CAST - INSA de Lyon Pilote intégré de périphériques ( Vx. Works ) Jean-Philippe Babau Département Informatique, laboratoire CITI INSA Lyon jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Principes • Accès à une ou plusieurs ressources (périphérique)

CAST - INSA de Lyon Principes • Accès à une ou plusieurs ressources (périphérique) • Objectif – masquer les contraintes matérielles – découpler l’application du matériel – protéger/partager l’accès • Principes – un périphérique = un fichier – utilisation du système d’entrée/sortie (IOS) – primitives standardisées de l'IOS • appel par périphérique • creat/open/close/remove • read/write/ioctl – un périphérique est associé à un et un seul pilote – le pilote gère les requêtes sur le périphérique jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Exemples • Pilotes existants – gestion de l’accès à

CAST - INSA de Lyon Exemples • Pilotes existants – gestion de l’accès à une liaison série – gestion de l’accès à une imprimante – gestionnaire de fichiers • Liaison série – RS 232 : voltage, CTS, Rx. D, Tx. D, adresse carte, … – Driver série jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Principes (Vx. Works) application IOS pilote xx write(fd, …)

CAST - INSA de Lyon Principes (Vx. Works) application IOS pilote xx write(fd, …) xx. Write(xxdev, …) • • Logiciel à réaliser Appel de l’IOS synchrone ou asynchrone Logiciel dédié – lié au matériel, au SE jean-philippe. babau@insa-lyon. fr Périphérique

CAST - INSA de Lyon L’ I/O system (IOS) • Service de l'OS •

CAST - INSA de Lyon L’ I/O system (IOS) • Service de l'OS • Couche intermédiaire entre l’application et les pilotes • Un appel concerne – un périphérique – une opération de lecture / écriture / configuration • Appel du pilote – réalisé par l’IOS – recherche du pilote – appel de la primitive du pilote jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon L’ I/O system (IOS) • Vérifications – ouverture •

CAST - INSA de Lyon L’ I/O system (IOS) • Vérifications – ouverture • pas de read avant open – nom du périphérique – nombre de connexions (non contrôlé par l'IOS de Vx. Works) – type de connexion • pas de write sur O_RDONLY (non contrôlé par l'IOS de Vx. Works) jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de l’IOS (Vx. Works) • Attacher/créer – fd

CAST - INSA de Lyon Primitives de l’IOS (Vx. Works) • Attacher/créer – fd = creat ("name ", flag) ; – fd : file descriptor (¹ 0, 1, 2) – flag : O_RDONLY, O_WRONLY, O_RDWR • Ouvrir – fd = open ("name ", flag, mode) ; – flag : O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC – mode : 06444 sous unix • Fermer – close ( fd ) ; • Détacher – remove ( "name " ) ; jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de l’IOS (Vx. Works) • Lire – –

CAST - INSA de Lyon Primitives de l’IOS (Vx. Works) • Lire – – • n. Bytes = read ( fd, &buffer, max. Bytes) ; max. Bytes : nombre maximum d’octets à lire n. Bytes = nombre d’octets lus ( -1 : erreur ) ERROR : non ouvert, pas de xx. Read Ecrire – – actual. Bytes = write (fd, &buffer, max. Bytes) ; max. Bytes : nombre d’octets à écrire actuel. Bytes : nombre d’octets écrits ERROR : non ouvert, pas de xx. Write (si ¹ max. Bytes : erreur ) jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de l’IOS (Vx. Works) • Autre – result

CAST - INSA de Lyon Primitives de l’IOS (Vx. Works) • Autre – result = ioctl ( fd, function, arg) ; – function : code – arg : un paramètre – exemple • fd = creat( « COM 1 » , O_RDONLY) • status = iotcl(fd, BAUDRATE, 9600) ; jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives asynchrones • Découplage application / pilote • Données

CAST - INSA de Lyon Primitives asynchrones • Découplage application / pilote • Données de l’appel – structure associée à chaque appel – paramètres de l’appel – exemple • char buffer[TAILLE] ; • aiocb_read. aio_fildes = fd ; • aiocb_read. aio-buf = buffer ; • aiocb_read. aio_nbytes = TAILLE ; • etc. jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives asynchrones • Primitives – – • aio_read (&

CAST - INSA de Lyon Primitives asynchrones • Primitives – – • aio_read (& aiocb_read) aio_write(& aiocb_write) aio_return((& aiocb_write) une utilisation simultanée d’une structure Suivi – – (aio_error (& aiocb_read) = = EINPROGRESS) aio_suspend(&aiocb[], n. Req, timeout) aio_cancel(&aiocb) attente sur signal jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de gestion des périphériques • Appelée par l’IOS

CAST - INSA de Lyon Primitives de gestion des périphériques • Appelée par l’IOS – une par appel de l’IOS • Paramètres – pointeur vers le descripteur du périphérique – paramètres de l’appel de l’IOS int xx. Creat(XXDEV * desc, char * name, int flag) ; int xx. Remove(XXDEV * desc, char * name) ; int xx. Open(XXDEV * desc, char * name, int flag) ; int xx. Close(XXDEV * desc, char * name) ; int xx. Read (XXDEV * desc, char * buff, int n. Bytes) ; int xx. Write (XXDEV * desc, char * buff, int n. Bytes) ; int xx. IOCtl (XXDEV * desc, int fonction, int arg) ; jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de configuration du pilote • Primitives de gestion

CAST - INSA de Lyon Primitives de configuration du pilote • Primitives de gestion du pilote – Installation drv. Number = ios. Drv. Install ( xx. Creat, xx. Remove, xx. Open, xx. Close, xx. Read, xx. Write, xx. IOCtl) drv. Number = ios. Drv. Install ( xx. Creat, xx. Remove, 0, 0, 0, xx. Write, xx. IOCtl) – dés. Installation ret = ios. Drv. Remove ( drv. Number, prot. Open) – FALSE : pilote non désinstallé si un périphérique est ouvert – TRUE : un périphérique ouvert est fermé et détruit implicitement, le piloté est désinstallé – périphérique détruit implicitement • Pas d'appel à Dev. Del, mémoire perdue ! jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de configuration du pilote • Primitives de gestion

CAST - INSA de Lyon Primitives de configuration du pilote • Primitives de gestion des périphériques – adresse du descripteur du périphérique • DEV_HDR (next, previous, N° de driver, nom ) • infos spécifiques – adresses matérielles – données • mode R/W (non vérifié par IOS de Vx. Works) • nombre maximum d’accès ( " ) – nom – lien avec le pilote – Ajout d’un périphérique status = ios. Dev. Add ( &desc, "name", drv. Number ) – retrait d’un périphérique status = ios. Dev. Delete( p. Dev. Hdr ); jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Comportement de l'IOS Scénario : écriture sans ouverture préalable

CAST - INSA de Lyon Comportement de l'IOS Scénario : écriture sans ouverture préalable ou ouverture incorrecte application IOS pilote xx z = write (fd, &buffer, max. Bytes) z = 0 Scénario : écriture correcte avec ouverture préalable correcte application IOS fd = open ("periph ", O_RDWR, mode) ; pilote xx z= xx. Open (& desc, . . ) z = write (fd, &buffer, max. Bytes) z= xx. Write (& desc, & buff, max. Bytes) actual. Bytes = z jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Structures de données du système d’E/S nécessaires pour

CAST - INSA de Lyon • Structures de données du système d’E/S nécessaires pour la mise en œuvre d’un pilote – Une liste de périphériques, en général gérée dynamiquement – Une table des pilotes indexée par le majeur (le majeur désigne un pilote donné) "periph 1" Liste des Périphériques 2 Données spécif. "Periph 1" create remove open close read 1 Table des Pilotes 2 Drv. Open 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Liste des périphériques – Structure de données du

CAST - INSA de Lyon • Liste des périphériques – Structure de données du descripteur de périphérique – typedef struct { DEV_HDR dev. Hdr; XXspecific autres ; données spécifiques du périphérique } XXDEV; – typedef struct { DEV_HDR dev. Hdr; int flag; données spécifiques du périphérique char data[Taille_MAX]; … } } XXDEV; jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Installation d’un pilote 1 Table des Pilotes xx.

CAST - INSA de Lyon • Installation d’un pilote 1 Table des Pilotes xx. Create xx. Remove xx. Open xx. Close xx. Read 2 3 4 jean-philippe. babau@insa-lyon. fr xx. Write xx. Ioctl

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv.

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv. Install(dev. Create, 0, dev. Open, 0, dev. Read, dev. Write, dev. Ioctl); 1 Table des Pilotes xx. Create xx. Remove xx. Open xx. Close xx. Read 2 3 4 jean-philippe. babau@insa-lyon. fr xx. Write xx. Ioctl

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv.

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv. Install(dev. Create, 0, dev. Open, 0, dev. Read, dev. Write, dev. Ioctl); La fonction définit les routines du pilote pour les 7 fonctions d’E/S (1) 1 Table des Pilotes xx. Create xx. Remove xx. Open xx. Close xx. Read 2 3 4 jean-philippe. babau@insa-lyon. fr xx. Write xx. Ioctl

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv.

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv. Install(dev. Create, 0, dev. Open, 0, dev. Read, dev. Write, dev. Ioctl); La fonction définit les routines du pilote pour les 7 fonctions d’E/S (1) Le système d’E/S détermine le prochain Slot libre dans la table des pilotes (2) 1 Table des Pilotes xx. Create xx. Remove xx. Open xx. Close xx. Read 2 3 4 jean-philippe. babau@insa-lyon. fr xx. Write xx. Ioctl

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv.

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv. Install(dev. Create, 0, dev. Open, 0, dev. Read, dev. Write, dev. Ioctl); La fonction définit les routines du pilote pour les 7 fonctions d’E/S (1) Le système d’E/S détermine le prochain Slot libre dans la table des pilotes (2) Le système d’E/S met à jour les routines du pilote dans la table (3) Table des Pilotes 1 xx. Create xx. Remove xx. Open xx. Close xx. Read 2 dev. Create 0 dev. Open 0 xx. Write xx. Ioctl dev. Read dev. Write dev. Ioctl 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv.

CAST - INSA de Lyon • Installation d’un pilote "dev" pilote_num = ios. Drv. Install(dev. Create, 0, dev. Open, 0, dev. Read, dev. Write, dev. Ioctl); La fonction définit les routines du pilote pour les 7 fonctions d’E/S (1) Le système d’E/S détermine le prochain Slot libre dans la table des pilotes (2) (4) Le système d’E/S renvoie le numéro de pilote Ex : pilote_num=2 Le système d’E/S met à jour les routines du pilote dans la table (3) Table des Pilotes 1 xx. Create xx. Remove xx. Open xx. Close xx. Read 2 dev. Create 0 dev. Open 0 xx. Write xx. Ioctl dev. Read dev. Write dev. Ioctl 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Ajout de périphériques Liste des Périphériques create remove

CAST - INSA de Lyon • Ajout de périphériques Liste des Périphériques create remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); Liste des Périphériques create remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); Le système d’E/S ajoute le descripteur de périphériques à la liste des périphériques "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques create remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); Le système d’E/S ajoute le descripteur de périphériques à la liste des périphériques "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques create remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); renvoie OK, ou ERROR si il existe un périphérique possédant le même nom Le système d’E/S ajoute le descripteur de périphériques à la liste des périphériques "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques create remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); status = ios. Dev. Add(dev 1, " periph 2", 2); "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques create remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); status = ios. Dev. Add(dev 1, " periph 2", 2); Le système d’E/S ajoute le descripteur de périphériques à la liste des périphériques Liste des Périphériques create "periph 1" "periph 2" 2 Données spécif. "Periph 1" 2 Données spécif. "Periph 2" remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); status = ios. Dev. Add(dev 1, " periph 2", 2); renvoie OK, ou ERROR Le système d’E/S ajoute le descripteur de périphériques à la liste des périphériques Liste des Périphériques create "periph 1" "periph 2" 2 Données spécif. "Periph 1" 2 Données spécif. "Periph 2" remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev

CAST - INSA de Lyon • Ajout de périphériques status = ios. Dev. Add(dev 0, " periph 1", 2); status = ios. Dev. Add(dev 1, " periph 2", 2); Liste des Périphériques create "periph 1" "periph 2" 2 Données spécif. "Periph 1" 2 Données spécif. "Periph 2" remove open close read 1 Table des Pilotes 2 3 4 jean-philippe. babau@insa-lyon. fr write ioctl

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du pilote fd = open(" periph 1", O_RDONLY, 0); I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du pilote fd = open(" periph 1", O_RDONLY, 0); I/OS L’I/OS trouve le nom dans la liste des périphériques (1) 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du pilote fd = open(" periph 1", O_RDONLY , 0); I/OS L’I/OS trouve le nom dans la liste des périphériques (1) 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes L’I/OS réserve un slot dans la table fd (2) 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du

CAST - INSA de Lyon • Ouverture d'un périphérique Code d'une tâche Code du pilote dev 1 = dev. Open (dev, " periph 1" fd = open(" periph 1", O_RDONLY , 0); I/OS L’I/OS trouve le nom dans la liste des périphériques (1) 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes L’I/OS réserve un slot dans la table fd (2) 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr L’I/OS appelle la routine open correspondante (3)

CAST - INSA de Lyon La primitive travaille sur les données spécifiques du périphérique

CAST - INSA de Lyon La primitive travaille sur les données spécifiques du périphérique (4) • Ouverture d'un périphérique Code d'une tâche Code du pilote dev 1 = dev. Open (dev, " periph 1" fd = open(" periph 1", O_RDONLY , 0); I/OS L’I/OS trouve le nom dans la liste des périphériques (1) 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes L’I/OS réserve un slot dans la table fd (2) 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr L’I/OS appelle la routine open correspondante (3)

CAST - INSA de Lyon La primitive travaille sur les données spécifiques du périphérique

CAST - INSA de Lyon La primitive travaille sur les données spécifiques du périphérique (4) Le pilote renvoie un pointeur sur le descripteur de périphérique (5) • Ouverture d'un périphérique Code d'une tâche Code du pilote dev 1 = dev. Open(dev, " periph 1" fd = open(" periph 1", O_RDONLY , 0); I/OS L’I/OS trouve le nom dans la liste des périphériques (1) 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes L’I/OS réserve un slot dans la table fd (2) 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr L’I/OS appelle la routine open correspondante (3)

CAST - INSA de Lyon La primitive travaille sur les données spécifiques du périphérique

CAST - INSA de Lyon La primitive travaille sur les données spécifiques du périphérique (4) Le pilote renvoie un pointeur sur le descripteur de périphérique (5) • Ouverture d'un périphérique Code d'une tâche Code du pilote dev 1 = dev. Open(dev, " periph 1" fd = open(" periph 1", O_RDONLY , 0); L’I/OS trouve le nom dans la liste des périphériques (1) I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques 2 dev 1 "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes L’I/OS réserve un slot dans la table fd (2) L’IOS remplit la table fd et renvoie l’index (6) 2 dev. Open 3 4 jean-philippe. babau@insa-lyon. fr L’I/OS appelle la routine open correspondante (3)

CAST - INSA de Lyon • Lecture sur un périphérique Code d'une tâche Code

CAST - INSA de Lyon • Lecture sur un périphérique Code d'une tâche Code du pilote nb = read(fd, tampon, longueur); I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques 2 dev 1 "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes dev. Read 2 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Lecture sur un périphérique Code d'une tâche Code

CAST - INSA de Lyon • Lecture sur un périphérique Code d'une tâche Code du pilote nb = read(fd, tampon, longueur); I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques 2 dev 1 "periph 2" 2 Données spécif. "Periph 2" 1 Table descripteurs de fichiers Table des Pilotes L’I/OS trouve l’index dans la table fd (1) dev. Read 2 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon • Lecture sur un périphérique Code d'une tâche Code

CAST - INSA de Lyon • Lecture sur un périphérique Code d'une tâche Code du pilote nb = dev. Read(dev 1, tampon, Maxlongueur); nb = read(fd, tampon, longueur); I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques 2 dev 1 "periph 2" 2 Données spécif. "Periph 2" L’I/OS appelle la routine read correspondante (2) 1 Table descripteurs de fichiers Table des Pilotes L’I/OS trouve l’index dans la table fd (1) dev. Read 2 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon La primitive réalise l’opération de lecture (3) • Lecture

CAST - INSA de Lyon La primitive réalise l’opération de lecture (3) • Lecture sur un périphérique Code d'une tâche Code du pilote nb = dev. Read(dev 1, tampon, Maxlongueur); nb = read(fd, tampon, longueur); I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques 2 dev 1 "periph 2" 2 Données spécif. "Periph 2" L’I/OS appelle la routine read correspondante (2) 1 Table descripteurs de fichiers Table des Pilotes L’I/OS trouve l’index dans la table fd (1) dev. Read 2 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon La primitive réalise l’opération de lecture (3) Renvoie le

CAST - INSA de Lyon La primitive réalise l’opération de lecture (3) Renvoie le nombre d’octets lus (4) • Lecture sur un périphérique Code d'une tâche Code du pilote nb = dev. Read(dev 1, tampon, Maxlongueur); nb = read(fd, tampon, longueur); I/OS 0 1 2 3 "periph 1" 2 Données spécif. "Periph 1" Liste des Périphériques 2 dev 1 "periph 2" 2 Données spécif. "Periph 2" L’I/OS appelle la routine read correspondante (2) 1 Table descripteurs de fichiers Table des Pilotes L’I/OS trouve l’index dans la table fd (1) dev. Read 2 3 4 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Windows • I/O manager : IOS • Primitives de

CAST - INSA de Lyon Windows • I/O manager : IOS • Primitives de l'I/O manager Create. File(), Write. File(), Read. File(), Device. Io. Control(), Close. Handle() • IRP : structure de données contenant toutes les informations nécessaires au traitement d’une requête. Par exemple, pour une requête de lecture dans un fichier, l’IRP va contenir un buffer, la longueur des données à lire, etc. jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Windows – lancement du driver Driver. Entry(PDRIVER_OBJECT Driver. Object,

CAST - INSA de Lyon Windows – lancement du driver Driver. Entry(PDRIVER_OBJECT Driver. Object, PUNICODE_STRING Registry. Path ) - Primitives définies dans DRIVER_OBJECT des primitives, du driver – ajout d’un périphérique xx. Add. Device(PDRIVER_OBJECT Physical. Device. Object ) Driver. Object, PDEVICE_OBJECT - requête d’E/S XXDispatch. Read(PDEVICE_OBJECT Device. Object, PIRP Irp ); XXDispatch. Write, XXDispatch. Create, XXDispatch. Close, XXDispatch. Device. Control – arrêt du pilote XXUnload( PDRIVER_OBJECT Driver. Object ) – arrêt d’une requête Cancel(PDEVICE_OBJECT Device. Object, PIRP Irp ) jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Windows • Fonctionnement 1 - La primitive Windows Read.

CAST - INSA de Lyon Windows • Fonctionnement 1 - La primitive Windows Read. File() est appelée par l’application en mode Utilisateur. 2 - Si la demande est valide, elle est transformée en IRP, puis est transmise au bon pilote en lui indiquant le périphérique concerné. 3 - Les IRP sont traitées par la routine spécifique du driver 4 - l'IRP est complétée avec la réponse à la requête, le I/O Manager est avisé de la réponse. 5 - L’IRP subit la transformation inverse par le I/O Manager et la réponse est renvoyée à l’application. jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Linux • Pilote – numéro majeur cat /proc/devices –

CAST - INSA de Lyon Linux • Pilote – numéro majeur cat /proc/devices – primitives init_module, cleanup_module – association primitives IOS / primitives pilote • Installation – Chargement de module noyau • insmod -f Pilote. o • appel de init_module – Déchargement de module noyau • rmmod Pilote • Appel de cleanup_module jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Linux • Périphérique – fichier • numéro mineur –

CAST - INSA de Lyon Linux • Périphérique – fichier • numéro mineur – Ajout d'un périphérique • mknod /dev/ periph c 27 0 Mode caractère majeur mineur – "/dev/periph" • mode (caractère/bloc) numéro majeur numéro mineur • file /dev/periph – Retrait d'un périphérique • rm /dev/ periph • Primitives de l’IOS – open, read, write, close, ioctl jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Linux #define XX_NAME "XX" int major = 27 ;

CAST - INSA de Lyon Linux #define XX_NAME "XX" int major = 27 ; … static struct file_operations XX_fops = { NULL, /* lseek, */ XX_read, NULL, /* write */ NULL, /* readdir */ NULL, /* poll */ NULL, /* ioctl, */ NULL, /* mmap */ XX_open, NULL, /* flush */ XX_release, /* = close */ }; int init_module(void) { … if(register_chrdev(major, XX_NAME, &XX_fops) < 0) { printk(" cannot allocate major number, not loaded. n"); } … } void cleanup_module(void) { … if(unregister_chrdev(major, KRT_NAME)) { printk("unregister_chrdev() failedn"); } } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Conception d’un pilote IOS write() • pilote xx haut-niveau

CAST - INSA de Lyon Conception d’un pilote IOS write() • pilote xx haut-niveau bas-niveau xx. Write() msg. QSend() Partie haut niveau – primitives de l’IOS • Découplage haut et bas niveau – boite aux lettres des requêtes – conservation de l’ordre d’appel – gestion des erreurs jean-philippe. babau@insa-lyon. fr matériel xp

CAST - INSA de Lyon Interface de pilote #ifndef PILOTE_H #define PILOTE_H #include <ios.

CAST - INSA de Lyon Interface de pilote #ifndef PILOTE_H #define PILOTE_H #include <ios. Lib. h> /* librairie pour les pilotes */ int Drv. Install(); /* primitive d’installation du pilote */ int Drv. Remove(); /* primitive de désinstallation du pilote */ int Dev. Add( char * name); /* primitive d’ajout d'un périphérique */ int Dev. Del(char * name); /* primitive de suppression d'un périphérique */ int Drv. Config(); int Info. Drv(); /* primitive de configuration */ /* primitive de test */ #endif jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives d'installation Pilote. c #include “Pilote. h” typedef struct

CAST - INSA de Lyon Primitives d'installation Pilote. c #include “Pilote. h” typedef struct /* structure standard Vx. Woks pour un périphérique */ { DEV_HDR donnees; specific autres; } DEV; typedef struct /* structure spécifique pour un périphérique */ { int numero ; } specific ; Déclarations des 7 primitives xx. Creat, xx. Remove, xx. Open, xx. Close, xx. Read, xx. Write, xx. IOCtl jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Gestion des éléments • Création/initialisation, destruction – statique •

CAST - INSA de Lyon Gestion des éléments • Création/initialisation, destruction – statique • lors de l'appel de Drv. Install, Drv. Desinstall – dynamique • appels spécifiques de xx. IOctl • premier xx. Creat / dernier xx. Remove • Gestion des erreurs – pilote inexistant, déjà installé – périphérique déjà créé, … jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Gestion des éléments • Configuration du pilote – Install,

CAST - INSA de Lyon Gestion des éléments • Configuration du pilote – Install, primitive dédiée – le pilote est un périphérique spécial • Configuration des périphériques – appel de Dev. Add – appels spécifiques de ioctl • liaison série status = iotcl(fd, BAUDRATE, 9600) ; jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Architecture du pilote • Statique / dynamique • Primitives

CAST - INSA de Lyon Architecture du pilote • Statique / dynamique • Primitives de haut niveau – traitement direct ou requête – modèle de communication • bal, donnée partagée, etc. • Lien avec la ressource – dépendant du matériel : IT, polling • Traitement des requêtes – 0, 1 ou plusieurs tâches – tâches indépendantes jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives d'installation int drv. Number = -1; int Drv.

CAST - INSA de Lyon Primitives d'installation int drv. Number = -1; int Drv. Install() { if (drv. Number==-1) { /* exemple d'installation de pilote */ drv. Number = ios. Drv. Install ( &xx. Creat, &xx. Remove, &xx. Open, &xx. Close, &xx. Read, &xx. Write, &xx. IOCtl) ; /* exemple d'installation de pilote */ drv. Number = ios. Drv. Install ( NULL, &xx. Open, &xx. Close, NULL, &xx. Write, &xx. IOCtl) ; } return drv. Number; } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives d'installation int Dev. Add(char * name) { DEV

CAST - INSA de Lyon Primitives d'installation int Dev. Add(char * name) { DEV * desc = (DEV *)malloc(sizeof(DEV)); if (drv. Number != -1) { (desc->autres). numero = nbre. Periph ++ ; ios. Dev. Add ((DEV_HDR *)desc, name, drv. Number); return nbre. Periph ; } else return -1; } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives de désinstallation int Dev. Del(char * name) {

CAST - INSA de Lyon Primitives de désinstallation int Dev. Del(char * name) { DEV_HDR * p. Dev. Hdr; /* structure pour le périphérique */ char* suite [1]; p. Dev. Hdr = ios. Dev. Find(name, suite); /* recherche du périphérique */ if ((p. Dev. Hdr!= NULL) && (*suite==‘’)) { ios. Dev. Delete( p. Dev. Hdr ); free(p. Dev. Hdr); } return 0; } int Drv. Remove() { int ret; /* numéro du pilote */ ret = ios. Drv. Remove( drv. Number, FALSE) ; return ret ; } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives liés au périphérique int xx. Open(DEV * desc,

CAST - INSA de Lyon Primitives liés au périphérique int xx. Open(DEV * desc, char * remainder, int mode) { if (remainder!=‘’)) { return ERROR; } else { return ((int) desc) ; } } int xx. Close(DEV * desc, char * name) { return 0; } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Primitives liés au périphérique int xx. Write (DEV *

CAST - INSA de Lyon Primitives liés au périphérique int xx. Write (DEV * desc, char * buff, int n. Bytes) { printf("periph %d : %s n", (desc->autres). numero , buff); return 0; } int xx. IOCtl (DEV * desc, int fonction, int arg) { if (fonction= =1) { (desc->autres). numero = - (desc->autres). numero ; } return 0; } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Appel du pilote #include " Pilote. h" int main(void)

CAST - INSA de Lyon Appel du pilote #include " Pilote. h" int main(void) { int num. Pilote; int fd 1; int fd 2; num. Pilote = Drv. Install(); Dev. Add( "periph 1", num. Pilote); Dev. Add( "periph 2", num. Pilote); fd 1=open("periph 1", O_RDWR, 0); fd 2=open("periph 2", O_RDWR, 0); write(fd 1, "Hello", 6) ; write(fd 2, " world", 7) ; ioctl(fd 1, 0, 0); ioctl(fd 2, 1, 0); write(fd 2, " world", 7) ; close (fd 2); close (fd 1); Drv. Remove(); return (0); } jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon OS classiques • Séparation application / noyau – Gestion

CAST - INSA de Lyon OS classiques • Séparation application / noyau – Gestion de la mémoire • Application : adressage virtuel • Noyau : adressage réel – Communication de données • Mécanismes spécifiques de copie • Linux : copy_to_user, copy_from_user – Protection du système – Primitives noyaux pour le pilote • Gestion du bas niveau – Gestion des IT • Windows : ISR -> DPC – Gestion DMA jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Périphérique virtuel • Définition de périphériques virtuels – Élément

CAST - INSA de Lyon Périphérique virtuel • Définition de périphériques virtuels – Élément de l’ IHM (souris, clavier, écran) – Virtual. Mouse de Windows • Pilote de périphériques virtuels – Livré avec l’OS – Couche service adaptée • on. Click() – Primitives du pilote inaccessibles – ? Pilote ? • Pilote réel – Réalisation du pilote bas niveau – Interconnexion avec le périphérique virtuel – Émulation du périphérique virtuel jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Périphérique virtuel • Inconvénients – Limitation du comportement •

CAST - INSA de Lyon Périphérique virtuel • Inconvénients – Limitation du comportement • Pas de triple click – Qo. S • Avantages – Développement rapide de pilotes – Applications indépendantes des périphériques – Sécurité jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Architecture en couches • Périphériques accessibles via un périphérique

CAST - INSA de Lyon Architecture en couches • Périphériques accessibles via un périphérique • Fichier sur un disque – pilote de fichiers • Lecteur accessible via une liaison série – pilote du lecteur • Imprimantes sur un réseau – pilote du réseau – pilote de l'imprimante • Périphérique en réseau – pilote du réseau – pilote de messages – pilote de périphériques jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Pilotes fournis par l'OS • Pilote existants – –

CAST - INSA de Lyon Pilotes fournis par l'OS • Pilote existants – – – • pilote terminal pilote de RAM pilote de fichiers pilote de pipe pilote NFS Pilote terminal – ty. Dev. Init() – paramétrisation via ioctl – fonctions • FIOSETOPTIONS, OPT_LINE (arrêt sur NEWLINE) • FIOBAUDRATE, vitesse • FIOFLUSH, 0 • FIOCANCEL (arrêt d’un read/write), 0 jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Exemple : pipe sous Vx. Works char string[20]; int

CAST - INSA de Lyon Exemple : pipe sous Vx. Works char string[20]; int fd; if((fd=open("/pipe/MBe. Pipe", O_RDWR, 0))==ERROR) {/*creation d un pipe recevant des messages de 5 caracteres et pouvant en contenir 4 max puis ouverture en ecriture et lecture*/ /* pipe. Dev. Create : appel de ios. Dev. Add */ if(pipe. Dev. Create("/pipe/MBe. Pipe", 4, 5)==ERROR || (fd=open("/pipe/MBe. Pipe", O_RDWR, 0))==ERROR) { printf("Echec a la creation / ouverture de MBe. Pipen"); } printf("proc 1 : Creation et ouverturen"); } else { printf("proc 1 : Ouverturen"); } { scanf("%20 s", string); printf("resultat d ecriture : %in", write(fd, string, 3)); /*Meme en ecrivant que 3 caracteres a chaque fois le pipe est plein apres do 4 ecritures si aucune extraction n a lieu entre temps*/ }while (string[0]!='f' || string[1]!='i' || string[2]!='n'); close(fd); /*fermeture mais pas destruction*/ jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Exemple : pipe sous Vx. Works int fd; char

CAST - INSA de Lyon Exemple : pipe sous Vx. Works int fd; char string[10]; if((fd=open("/pipe/MBe. Pipe", O_RDWR, 0))==ERROR) { if(pipe. Dev. Create("/pipe/MBe. Pipe", 4, 5)==ERROR || (fd=open("/pipe/MBe. Pipe", O_RDWR, 0))==ERROR) { printf(" Echec a la creation/ouverture de MBe. Pipen"); } printf(" Creation et ouverturen"); } else { printf(" Ouverturen"); } do { read(fd, string, 5); printf("proc 2 : %sn", string); }while(string[0]!='f' || string[1]!='i' || string[2]!='n'); close(fd); jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon La couche service • Interconnection application / pilote –

CAST - INSA de Lyon La couche service • Interconnection application / pilote – mise en forme des données int Get. Speed(int v) { … read ( fd. ABS, &buffer, max. Bytes) ; …} – protocole de communication • Administration, contrôle, protections - administrateur : installation/libération/réinitialisation Utilisateur - droit et temps d'accès - partage jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon La couche service • Fonctions avancées – accès multiples

CAST - INSA de Lyon La couche service • Fonctions avancées – accès multiples • creat ( ); – envois multiples • write( ); write( ) – envois avec attente • task. Delay ( ); write() – échanges entre périphérique • read( ); write() /* échanger */ jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Exemple de couche service : le joystick sous Windows

CAST - INSA de Lyon Exemple de couche service : le joystick sous Windows UINT joy. Get. Num. Devs(VOID) The joy. Get. Num. Devs function returns the number of joysticks supported by the current driver or zero if no driver is installed. MMRESULT joy. Get. Pos( UINT u. Joy. ID, LPJOYINFO pji ) u. Joy. ID Identifier of the joystick to be queried. Valid values for u. Joy. ID range from zero (JOYSTICKID 1) to 15 pji Pointer to a JOYINFO structure that contains the position and button status of the joystick. Returns JOYERR_NOERROR if successful or one of the following error values. jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Exemple de couche service : le joystick sous Windows

CAST - INSA de Lyon Exemple de couche service : le joystick sous Windows MMRESULT joy. Set. Capture( HWND hwnd, f. Changed ) UINT u. Joy. ID, UINT u. Period, BOOL hwnd Handle to the window to receive the joystick messages. u. Joy. ID Identifier of the joystick to be captured. Valid values for u. Joy. ID range from zero (JOYSTICKID 1) to 15 u. Period Polling frequency, in milliseconds. f. Changed Change position flag. Specify TRUE for this parameter to send messages only when the position changes by a value greater than the joystick movement threshold. Otherwise, messages are sent at the polling frequency specified in u. Period. Returns JOYERR_NOERROR if successful or one of the following error values. jean-philippe. babau@insa-lyon. fr

CAST - INSA de Lyon Conclusion • Couche intermédiaire application/pilotes • Couche standardisée •

CAST - INSA de Lyon Conclusion • Couche intermédiaire application/pilotes • Couche standardisée • Un pilote gère des périphériques – installation • Un périphérique est géré par un seul pilote – installation • Architecture dédiée – OS / matériel – Logiciel • Statique / dynamique • Concurrence jean-philippe. babau@insa-lyon. fr