Implémentation de signaux d’horloge matérielle dans le kernel Linux

Je cherche des conseils pour comprendre comment le kernel Linux implémente la configuration de différentes horloges matérielles. Cela concerne essentiellement la configuration des différentes horloges utilisées par les fonctionnalités matérielles telles que l’écran LCD, UART, etc. Par exemple, lorsque Linux démarre, comment gère-t-il la configuration des horloges pour UART ou USB? Peut-être quelque chose comme un gestionnaire d’horloge ou quelque chose.

J’essaie essentiellement d’implémenter quelque chose de similaire pour un système d’exploitation différent sur un nouveau matériel sur lequel je travaille. Toute aide sera grandement appréciée.

[Modifier]
Merci pour les réponses et les liens. Donc, voici ce que j’ai mis en œuvre jusqu’à présent. Cela devrait vous donner une idée de ma direction.

J’ai cherché le manuel de référence du matériel pour le système que je visais et j’ai écrit du code pour surveiller / modifier les signaux / broches des périphériques qui m’intéressent, par exemple les activer / désactiver depuis la ligne de commande. Les horloges / signaux contrôlent ensemble un périphérique. La GRH dirait que si vous voulez allumer l’UART ou quelque chose, allumez tel ou tel signal / épingle. Et @BjoernD oui, j’utilise quelque chose comme une fonction mmap () pour parler aux périphériques.

Le gros de ma question est que je veux comprendre la conception et l’implémentation d’un Clock / Peripheral Manager qui utilise l’utilitaire que j’ai déjà écrit. Ce Clock / Peripheral Manager me donnerait le contrôle de l’activation / désactivation des périphériques que je souhaite. À la base, ce gestionnaire me permettrait d’apporter des modifications au code d’initialisation en cours d’exécution. Pendant l’exécution, les processus peuvent également appeler ce gestionnaire pour activer / désactiver les périphériques afin d’optimiser la consommation d’énergie. Cela n’a peut-être pas été parfaitement logique, mais je suis moi-même en train d’essayer de comprendre.

Maintenant, je suis sûr que quelque chose comme cela aurait été implémenté sous Linux ou pour tout système d’exploitation pour des problèmes de performances (personne ne voudrait perdre de l’énergie en allumant tous les périphériques au démarrage). Je veux comprendre l’architecture logicielle de celui-ci. Référence de tout système d’exploitation ferait dès maintenant pour atleast obtenir un début. De plus, je n’écris pas mon propre système d’exploitation, il ya un système d’exploitation en place, mais je cherche plutôt à travailler sur un logiciel au niveau de la carte, appelé BSP. Mais merci pour le lien OS de toute façon, ils sont vraiment bons. L’apprécie.

Merci!

Ce que vous voulez réaliser est très spécifique à a) la plate-forme que vous utilisez et b) au périphérique que vous souhaitez utiliser. Par exemple, sur x86, il existe trois façons de communiquer avec un périphérique:

  1. Les interruptions permettent à l’appareil de signaler le processeur. Le système d’exploitation fournit généralement des mécanismes pour enregistrer les gestionnaires d’interruption – des fonctions appelées lors de l’occurrence d’une interruption. Sous Linux, consultez request_irq () et friends dans linux / include / interrupt.h
  2. Les E / S mappées en mémoire sont la mémoire physique du périphérique que le BIOS de la plate-forme met à disposition de la même manière que vous accédez à la mémoire physique, simplement en écrivant dans une adresse mémoire. Ce qui est exactement derrière une telle mémoire (par exemple, les registres de configuration de l’interface réseau ou un tampon de trame LCD) dépend du périphérique et est généralement spécifié dans la fiche technique du périphérique.
  3. Les ports d’E / S sont accessibles via un espace d’adressage spécial et des instructions spéciales (INB / OUTB & co.). Autre que cela, ils fonctionnent de manière similaire à la mémoire E / S.

Il existe une multitude de façons de déterminer les ressources d’un périphérique et d’où le BIOS les a mappées. Certaines plates-formes utilisent des tables ACPI (google vous-même pour la spécification de 1 000 Ko), PCI fournit des informations sur les périphériques de manière standard via l’espace de configuration PCI, USB a des méthodes similaires pour découvrir les périphériques , sont simplement spécifiés pour être disponibles dans une plage d’E / S préconfigurée et fixe pour votre plate-forme.

Pour commencer à comprendre Linux, je vous recommande “Comprendre le kernel Linux” . Pour plus de détails sur la manière dont Linux gère les périphériques et sur ce qu’il y a pour écrire des pilotes, consultez les pilotes de périphériques Linux . De plus, vous devrez examiner les particularités de votre plate-forme et de l’appareil que vous souhaitez piloter.

Si vous voulez démarrer un propre système d’exploitation, un UART est certainement quelque chose de très utile pour imprimer les résultats du débogage. Vous pouvez donc commencer par cela.

Maintenant que j’ai écrit tout cela, il semble que votre question soit: Comment démarrer avec la conception du système d’exploitation. Cette question devrait être très utile pour vous: quelles sont les ressources nécessaires pour commencer à développer des systèmes d’exploitation?

Les deux gros utilisateurs de la plupart des ordinateurs sont le processeur et les disques. Les deux ont des capacités d’économie d’énergie sous Linux. L’horloge du processeur peut être ralentie lorsque le système n’est pas occupé et les moteurs de disque peuvent être arrêtés lorsqu’aucune E / S ne se produit. Pour un UART, même si vous enregistrez toute l’énergie qu’il utilise en désactivant son horloge, il est encore minime comparé aux autres car un UART n’a pas beaucoup de logique.

Les meilleurs moyens d’économiser de l’énergie sont les suivants: 1) alimentation plus efficace 2) remplacement du disque rotatif par le SSD 3) Ralentissement de la CPU et du bus de mémoire