TacOS-team / tacos

Système d'exploitation / Operating System
GNU General Public License v3.0
9 stars 4 forks source link

Maitrise de la VMM #173

Open NicolasFloquet opened 10 years ago

NicolasFloquet commented 10 years ago

Il faut admettre qu'on ne maitrise pas vraiment l'aspect VMM/Pagination dans TacOS. Tant que ça sera le cas, on ne pourra pas envisager d'avoir de la SHM, un mmap ou des MMIO. On doit reprendre la main sur cette partie du code. Cela passera je pense par les étapes suivantes:

L'idée serait à la fin d'avoir une idée précise du layout de la mémoire physique et virtuelle.

NicolasFloquet commented 10 years ago

A noter que pour la plupart des drivers utilisant des DMA ou le bus PCI, il est souvent question d'accès à des adresses physiques connues. Pour cette raison, avoir des interfaces simples pour mapper des adresses physiques dans l'adressage virtuel du kernel est très prioritaire.

MaximeCheramy commented 10 years ago

Je te trouve un peu dur, si on a perdu la maîtrise, c'est surtout parce que ça a été fait au début du projet et qu'on a eu le temps d'oublier comment ça marchait. L'aspect VMM ainsi que la partie malloc, a été réalisée par NoWiS et la partie pagination par moi-même.

Niveau doc, on ne part pas de rien : https://github.com/TacOS-team/tacos/wiki/VMM et https://github.com/TacOS-team/tacos/wiki/Pagination

Je n'ai bien sûr rien contre la proposition : commenter/documenter le code ne fera pas de mal, c'est une partie assez complexe et ultra importante. Aucun problème pour le refactoring, si tu juges que certaines parties pourraient être mieux faites, vas-y.

NicolasFloquet commented 10 years ago

Oui bon j'exagère un peu, ceci dit je pense quand même qu'il nous manque un peu de maitrise pour pouvoir faire des choses simples comme mapper de la mémoire commune entre deux process (pourtant y'a pas de réelle difficulté en théorie)

MaximeCheramy commented 10 years ago

Je faisais un peu joujou ce matin :

@NoWiS- Est-ce que tu peux nous éclairer ?

NicolasFloquet commented 10 years ago

Note: quand il s'agit de gestion de mémoire, je me méfie toujours de l'absense de regression apparente...

MaximeCheramy commented 10 years ago

Note: j'ai aussi reverté en attendant une réponse claire.

NicolasFloquet commented 10 years ago

Vu que c'est un sujet qui ne devrait pas faire changer les interfaces mais seulement la façon dont sa fonctionne, je suggère une branche refactoring vmm

NoWiS- commented 10 years ago

Alors, j'ai re-regarder un peu le code. Dans l'idée, je voulais éviter la fragmentation, mais ça n'a jamais vraiment été fini. L'intuition c'était, lorsque malloc n'a plus besoin d'une page, il demande la désallocation de la page (via unallocate_page) mais dans l'état malloc ne le fait jamais (le syscall n'existe même pas). De plus, j'étais pas sur que ça soit pas très pertinent du côté vmm (surement plus du côté malloc).

Je ne pense pas qu'en l'état passer à un push_back ne devrait pas amener de régression.

Comme je l'avais déjà dis, je pense que le plus simple serait probablement de repartir de zéro. En ayant plus en tête ces histoire d'extension pour de la mémoire partagé, fichier etc...

NicolasFloquet commented 10 years ago

Repartir à 0? mais ça avait l'air tellement bien fait!

MaximeCheramy commented 9 years ago

Je songe à travailler un peu sur cette partie. J'aimerais débloquer tout ce qui est mmap, on doit pouvoir gagner énormément en perf.

MaximeCheramy commented 9 years ago

Je me suis plongé dedans, et lorsque je pense avoir compris, je tombe toujours sur un truc qui fait que je me pose d'autres questions, etc... Alors quelques remarques :

Slab allocation is a memory management mechanism intended for the efficient memory allocation of kernel objects. It eliminates fragmentation caused by allocations and deallocations. The technique is used to retain allocated memory that contains a data object of a certain type for reuse upon subsequent allocations of objects of the same type. It is analogous to an object pool, but only applies to memory, not other resources.

De ce que j'ai pu en comprendre, l'idée c'est de ne pas avoir un seul allocateur (kmalloc) mais tout un ensemble d'allocateurs spécialisés dans des morceaux de taille identique. Voir cat /proc/slabinfo sous Linux pour avoir la liste des allocateurs. Le fonctionnement d'un allocateur est trivial : il prend un "slab", le découpe en morceaux de taille identique et distribue ou libère les morceaux à la demande. Il n'y a plus de problème de fragmentation car tous les morceaux ont la même taille ! Et le traitement est plus rapide car il n'y a plus besoin de maintenir des listes chainées des éléments libres.

Bref, à garder dans un coin de la tête car il y a probablement moyen d'accélérer les perfs du système avec des allocateurs spécialisés.

Initialement j'avais pour objectif de coder mmap : suffit de réserver une région dans l'adressage virtuel et y associer un fichier ou rien si on veut juste des 0. Lors d'une tentative d'accès à une adresse de cette région, on parcours les régions pour identifier la bonne et on recopie dans la mémoire physique les données qui vont bien. Dans la théorie c'est simple, mais il faut s'emboiter avec l'existant... D'où les questions de tables pas forcément à jour ce qui peut poser des problèmes.