0

Le plus petit programme que je puisse penser est celui qui boucle indéfiniment. En fasm il ressemble à ceci:Empreinte mémoire minimale d'un périphérique Windows actif

format PE console 
entry start 

section '.text' code readable executable 
start: 
    JMP start 

Lorsque compilé et exécuté à partir de l'invite de commande, taskmanger signale qu'il faut 108kb de mémoire physique. Lorsqu'il est exécuté à partir d'Explorer, il signale 116kb. J'ai essayé un programme similaire dans nasm et j'ai également essayé différentes options de linker mais 108kb était toujours la plus petite empreinte de mémoire.

Est-ce l'empreinte mémoire minimale absolue qu'un processus actif peut avoir? Est-il possible d'aller plus petit?

+0

Quel éditeur de liens utilisez-vous? Et les options de l'éditeur de liens utilisées? – Anders

+0

c'est très lié à la version Windows. dans votre processus chargé 'ntdll.dll' et' kernel32.dll' (+ 'kernelbase.dll' commence à partir de win7). initialisé différentes structures de mémoire .. ce ~ 100kb ne prend pas votre exe minuscule mais dll système, PEB, TEB, pile, etc. dans quel est le problème réel? – RbMm

+0

@Anders pour fasm, je l'ai tout simplement respecté avec fasm. Avec nasm j'ai utilisé GoLink ainsi que l'éditeur de liens de Microsoft. J'ai joué avec les tailles tas/pile mais je n'ai pas pu réduire ce minimum. – ChrisD

Répondre

1

Pas vraiment sûr pourquoi c'est un exercice utile, toute application qui fait réellement quelque chose d'utile va charger au moins quelques .DLL Windows et cela va probablement augmenter l'utilisation de la mémoire un peu. 108kb ne nous dit pas grand-chose quand vous ne dites pas quelle application vous l'avez mesuré avec.

L'empreinte mémoire dépend également de la version Windows. Sous Windows 7 et versions ultérieures, il existe trois fichiers .DLL de base; ntdll, kernelbase et kernel32 alors que les versions précédentes ont seulement ntdll et kernel32. Si vous utilisez une application 32 bits sur Windows 64 bits, wow64, wow64cpu et wow64win sont également chargés dans votre processus. Sur toutes les versions sauf Windows 2000, le chargeur chargera kernel32 et ses dépendances automatiquement pour vous. Il y a une surcharge inévitable pour chaque .DLL. Il y a une liste liée de .DLLs chargés stockés dans le PEB et le chargeur modifiera probablement la table d'importation dans chaque .DLL (unless ceci est une nouvelle installation de Windows jamais mise à jour) même si toutes les autres pages peuvent être partagées avec d'autres processus.

En théorie, la seule chose que vous avez vraiment le contrôle sur un « statu quo » .EXE est les membres SizeOfStackCommit et SizeOfHeapCommit du optional header mais la valeur par défaut de la pile est généralement juste une page et ces valeurs sont arrondies si la mise en Les inférieurs ne vous rapporteront rien. Vous ne pouvez pas contrôler la taille du PEB et TEB (s) et je ne pense pas que vous pouvez éviter de créer le tas de processus par défaut.

La plupart des gens ont tendance à se concentrer sur smaller file size, pas sur l'empreinte mémoire. Le plus petit fichier PE EXE utilisable que vous pouvez créer est 133 bytes sur Windows 32 bits. Si vous n'importez rien, vous pouvez le réduire à 97 octets, mais il ne fonctionnera pas sous Windows 2000 car il suppose que vous importez quelque chose à partir de kernel32. Ces fichiers sont des hacks et placent l'en-tête PE au-dessus de l'en-tête DOS, etc.

Si votre but est simplement de passer sous 108kb alors j'essayerais le fichier EXE 97 octets sur Windows 95 ou NT 4. Sur Windows 95 tous les principaux .DLL du système sont partagés par tous les processus.

+0

Merci. Comme je l'ai mentionné, j'ai utilisé le Gestionnaire des tâches de Windows pour mesurer la mémoire physique. C'est sur Windows 32 bits. – ChrisD

+0

Tâche Manger a changé sa signification des différentes colonnes au cours des années donc ce n'est peut-être pas le meilleur outil à utiliser. Essayez Process Explorer et VMMap à partir de SysInternals/TechNet. – Anders