-
Notifications
You must be signed in to change notification settings - Fork 4
Horloge et events
La gestion du temps s'appuie sur une horloge périphérique appelée RTC (Real Time Clock) ainsi que sur le compteur programmable PIT (Programmable Interval Timer) I8254. À l'initialisation nous allons interroger l'horloge afin d'obtenir la date et l'heure actuelle, à partir de ce moment nous n'aurons plus besoin de consulter la RTC. En effet, une fois l'heure et la date obtenues, la nouvelle heure est extrapolée grâce au PIT. Pour cela nous paramétrons le timer pour lancer une interruption au bout d'un temps T correspondant à un tick système, à l'issue de cette interruption le temps système est incrémenté et le PIT est reconfiguré pour un autre tick. Le temps écoulé en secondes est calculé à partir de la durée d'un tick.
La communication avec la RTC se fait en écrivant une requête sur le port 0x70 et en lisant la réponse sur le port 0x71. Les requêtes possibles sont : seconde (0x00), minute (0x02), heure (0x04), jour de la semaine (0x06), jour du mois (0x07), mois (0x08), année (0x09).
La requête "jour de la semaine" demande une réponse du type Lundi, Mardi..., Samedi, Dimanche. Tandis que la requête "jour du mois" demande une réponse du type 1,2,...,30,31.
La RTC répond non pas dans un format binaire pur mais dans un format dit décimal codé en binaire (BCD). Dans ce format les décimales qui constituent le mot en base 10 sont encodées unes à unes sur 4 bits. Exemple : 27 encodé en binaire donne 16+8+2+1 soit 0001 1011, 27 encodé en BCD donne 2 soit 0010 puis 7 soit 0111 donc 0010 0111.
Le fonctionnement d'un PIT est le suivant, un PIT contient généralement un registre incrémenté à intervalle régulier. Lorsque la valeur du registre provoque un overflow, le PIT génère une interruption (ici IRQ0). Configurer un compteur consiste donc à mettre en place un handler sur l'interruption qui sera levée puis à paramétrer le registre de manière à ce que l'interruption arrive au moment voulu. La configuration de l'I8254 se fait à travers le port 0x40 pour positionner le registre de comparaison et le port 0x43 pour régler plus précisément le fonctionnement du compteur.
Le fonctionnement repose sur l'utilisation d'un tas, celui-ci stocke les différents évènements planifiés. A chaque tick d'horloge il suffit alors de vérifier s'il y a un évènement à déclencher et le déclencher le cas échéant. La gestion des ticks s'exécutant en ring 0, le code à exécuter doit pour des mesures de sécurité être du code kernel, il est donc proscrit de permettre à une application en user space de planifier directement l'appel d'une de ses fonctions, la planification d'événements se doit donc d'être utilisée par le kernel ou utilisée indirectement au travers des appels systèmes. Une autre exigence à prendre en compte est la rapidité d'exécution du handler, en effet, celui-ci s'exécute dans le cadre d'une interruption d'horloge.