Ce qui m’enuie beaucoup dans MenuetOS, c’est que ma carte son n’est pas supportée!! C’est pourtant une AC97. Et j’imagine que ce n’est pas la seule carte non supportée (en fait, seul les sound-blaster et comptabiles fonctionnent).
La solution à mon problème serait d’écrire un pilote pour celle-ci. Mais je ne sais pas vraiment comment je pourai l’implémenter dans menuet.
J’avais tout d’abord penssé à ajouter un .h dans les sources du noyaux, ajouter des syscalls et programmer des applications pour l’utiliser (ou bien passer par les syscalls de la sb16 et coder une fonction de détection).
C’est bien beau tout ça, mais si on devait implémenter tout les pilotes audio de cette manière, le noyau n’en finirai pas de grossir. Alors que j’ai pas besoin des autres pilotes.
Vous me direz:”Mouai t’as qu’à supprimer les pilotes dont t’as pas besoin”. d’accord, mais le comun des mortels, il ne sait pas comment faire ça, on va pas leur obliger de recompiler leur noyau hein.
Ya une autre solution, des modules qu’on charge si on en a besoin. Ouai, c pas mal comme idée, le hic, c’est qu’il faut implémenter un système de “modèles de pilotes” qui définirai tout, et pour finir, on dit adieux à une des principales qualitées de MenuetOS qui est la suppression d’un maximum d’interface (layer) qui finissent par provoquer des bugs dans le système.
Alors, j’ai un peu pioché sur le net (merci google), et j’ai trouvé deux solution viables.
La première est, comme dans les système à micro noyaux (qns, minix, gnu/hurd), que le pilote serai une sorte de serveur. Entendez par là que ce serai un programme comme un autre, à qui le client (lecteur audio par exemple) enverai des rêquetes, et de qui il reçevrai des réponses. Ce procédé est réalisable par ces manières:
1) La communication inter-processus (ipc)
2) la pile tcp-ip(socket)
3) Implémenter un système de fichier virtuels pour les périfériques (genre /dev)
4) écrire les entrées-sortires dans des fichiers sur le système de fichier
encore faudrait-il que le programme sache avec quel pilote communiquer (j’imagine qu’une sorte d’hal en mode utilisateur pourai être possible)
la deuxième solution (ma préférée), comme dans les exo-noyaux, est , me semble-t-il, la plus facile à réaliser. Elle consiste, à coder un pilote de cette manière:
; on comence par l’en-tête qui contien une table avec l’adresse d’entrée de chaque fonction
dd fonction1
dd fonction2
dd fonction3
;on écrit ensuite les fonctions
fonction1:
routines de la fonction
routines de la fonction
ret
… (idem pour les autres fonctions).
ensuite on le compile et on a notre pilote en mode utilisateur. En effet, MenuetOS permet au périfériques de réserver des irq, et ainsi de piloter des périfériques tels que la carte audio.
dans notre programme on chargera le pilote comme un fichier, à une adresse connue (dans l’espace du processus), par la fonction 58:
mov eax,58
mov ebx,drvinfo
int 0×40
drvinfo corespond à l’adresse des paramètres de la fonction, qui donne:
drvinfo:
.mode dd 8 ;en lecture lba(pour accéder au disque dûr si le pilote y est)
.block dd 0×0 ;nombre de block à lire (0 correspondant à l’entièreté du fichier)
.set dd 0×1 ;on doit toujours metre à 1 pour ce mode
.data dd 0×20000 ;ce qui nous intéresse particulièrement, l’adresse de chargement des données
.workarea dd 0×100000 ;espace nécessaire pour l’os
.path db ‘/hd/1/menuetos/drv/sound.drv’,0 ;chemin complet du fichier
une fois le fichier chargé, on peux allors accéder aux fonctions du pilotes, les adresses étant dans l’en-tête du fichier:
[addr_fonction1]=[drvinfo.data +0]
[addr_fonction2]=[drvinfo.data +4]
[addr_fonction3]=[drvinfo.data +8]
et pour appeler une fonction on fait simplement:
call [addr_fonction1] ;ce qui appelle la fonction1
ou
call [drvinfo.data+0] :ce qui appelle la fonction1 (pour la fonction2 on met +4,etc…)
Je pense que mon brainstorming a déjà pas mal commencé, mais je vais encore y réfléchir et vous donner des nouvelles de mon avancement.