GNU/Linux >> Tutoriels Linux >  >> Linux

Quels sont les appels OS/système natifs Windows et Linux effectués à partir de malloc() ?

Sous Windows, dans les versions récentes de MSVC, malloc (et C++ new , car il est implémenté en utilisant les mêmes principes fondamentaux pour la partie d'allocation de mémoire réelle de new ) appelle HeapAlloc() . Dans d'autres versions, telles que g++ mingw, le runtime C est une version plus ancienne, qui n'appelle pas aussi directement HeapAlloc , mais à la base, ça va toujours à HeapAlloc - pour trouver quelque chose de différent, nous devons revenir à Windows antérieur à 95, qui avait un GlobalAlloc et LocalAlloc ensemble de fonctions - mais je ne pense pas que les gens utilisent des compilateurs 16 bits de nos jours - du moins pas pour la programmation Windows.

Sous Linux, si vous utilisez glibc , cela dépend de la taille de l'allocation si elle appelle sbrk ou mmap - mmap (avec MAP_ANONYMOUS dans les drapeaux) est utilisé pour des allocations plus importantes (au-delà d'un seuil, qui, je crois, est de 2 Mo dans l'implémentation typique)


malloc() et ses amis sont considérés comme faisant partie du système d'exécution fourni avec un compilateur. Ainsi, chaque compilateur peut utiliser et utilise différents appels de système d'exploitation pour implémenter malloc.

Comme d'autres l'ont dit, sous Linux, les options sont sbrk() et mmap().

Sous Windows, les options sont HeapAlloc() et VirtualAlloc().


Ma question est la suivante :comment malloc est-il implémenté dans les systèmes d'exploitation suivants ?

Sous Linux il y a deux fameux malloc implémentations :

dlmalloc (malloc de Doug Lea)

ptmalloc

Sur Linux libc comme glibc, eglibc ou newlib implémentez ptmalloc ou une variante de ptmalloc.

quelles sont les fonctions spécifiques au système d'exploitation qui sont appelées/implémentations de malloc() ?

Sur les systèmes Unix et Linux sbrk et mmap les appels système sont utilisés. Voir man 2 sbrk et man 2 mmap pour plus d'informations.


D'accord, je ne suis pas sûr pour Linux, mais quand il s'agit de Windows...

La mémoire peut être allouée à deux endroits classés.

1) Heaps (Process Heap, Custom Created Heaps) voir -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx en utilisant des fonctions comme HeapAlloc &HeapFree. LocalAlloc et LocalFree peuvent être utilisés comme "raccourcis" vers HeapAlloc lorsque vous souhaitez allouer dans le tas de processus par défaut.

2) Mémoire virtuelle (généralement uniquement spécifique au processus en raison des restrictions d'accès dans la mémoire virtuelle globale pour la sécurité), en utilisant VirtualAlloc, VirtualFree. voir -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx

À ma connaissance, malloc utilisera les fonctions d'allocation de tas sur Windows.

J'espère que cela vous aidera.


Linux
  1. Appels système dans Windows et API native ?

  2. Déboguer à distance un processus Linux depuis Windows avec gdb et gdbserver :que faut-il exactement côté Windows ?

  3. Quelle est l'interface pour les appels système ARM et où est-elle définie dans le noyau Linux ?

  4. Que sont vdso et vsyscall ?

  5. Quelles sont les différences entre lsof et netstat sous Linux ?

Quelle est la différence entre Linux et Unix ?

Qu'est-ce que les appels système Linux et les fonctions de bibliothèque ?

Quelles sont les conventions d'appel pour les appels système UNIX et Linux (et les fonctions de l'espace utilisateur) sur i386 et x86-64

Déterminer la version du système d'exploitation, Linux et Windows à partir de Powershell

Quelles sont les différences entre les fichiers Linux et Windows .txt (encodage Unicode)

Quelle est la différence entre un appel Library et un appel System sous Linux ?