-1

Existe-t-il un moyen d'accéder (lire ou libérer) des fragments de mémoire qui sont en dehors de la mémoire allouée au programme sans obtenir d'exceptions de violation d'accès. Eh bien ce que je voudrais vraiment comprendre à part cela, c'est comment un nettoyeur de mémoire (collecteur d'ordures du système) fonctionne. J'ai toujours voulu écrire un tel programme. (La langue est pas un problème)Accès en dehors de la mémoire allouée par le programme. (Accès à la mémoire d'une autre application)

Merci d'avance :)

+0

La langue est un problème. Il est impossible de répondre à cette question sans nous indiquer le système d'exploitation et la langue qui vous intéressent. – bmargulies

Répondre

1

La réponse simple (moins je me trompe), non. Généralement, ce n'est pas une bonne idée pour deux raisons. La première est parce qu'elle provoque un problème de confiance entre votre programme et d'autres programmes (sans parler de nous, les humains ne feront pas confiance à votre application non plus). Deuxièmement, si vous pouviez accéder à une autre mémoire d'applications et effectuer une modification sans que l'application ne s'en rende compte, l'application se bloquerait (les virus le font aussi).

Un garbage collector est appelé à partir d'un runtime. Le moteur d'exécution "possède" l'espace mémoire et permet à d'autres applications de "vivre" dans cet espace mémoire. C'est pourquoi le garbage collector peut exister. Vous devrez créer une durée d'exécution à laquelle le système d'exploitation alloue de la mémoire, demander à l'exécution d'exécuter l'application sous son autorité et utiliser également le CPG sous son autorité. Vous aurez besoin d'une instrumentation ou d'une API permettant au développeur d'applications de demander de la mémoire à votre environnement d'exécution (pas le système d'exploitation) et votre runtime peut non seulement répondre à une telle requête, mais également garder la trace de l'espace mémoire. allouer à cette application. Vous aurez probablement besoin d'un framework (ensemble de DLL) qui rende ces appels disponibles à l'application (le développeur les utilisera pour former la requête dans leur application). Vous devez vous assurer que votre garbage collector ne supprime pas la mémoire autre que la mémoire utilisée par l'application en cours d'exécution, car il se peut que plus d'une application s'exécute simultanément dans votre environnement d'exécution.

Espérons que cela aide.

+0

Oui, ça a beaucoup aidé. Merci. – Auxiliary

4

No.

Tout système d'exploitation moderne empêchera un processus d'accès à la mémoire qui appartient à un autre processus. En fait, si vous avez compris la mémoire virtuelle, vous comprenez que c'est impossible. Chaque processus a son propre espace d'adressage virtuel.

+0

... true, sauf si vous vous connectez dans une exécution ou CLR. – Phillip

+0

@Philip: même un runtime ou CLR ne peut pas accéder à l'espace d'adressage d'un autre processus; du moins pas sans l'aide du système d'exploitation. Seul le système d'exploitation, en général, peut mapper des adresses physiques appartenant à un autre espace d'adressage virtuel de processus dans votre processus. –

+0

Eh bien, je ne suis pas d'accord avec vous ici.Bien que je puisse dire que cela nécessite une relation entre le moteur d'exécution et le système d'exploitation, le moteur d'exécution demande généralement l'espace mémoire au nom de l'application. Parce que l'exécution est l'appelant pour la création, il a toujours des liens avec l'espace mémoire et peut le surveiller et le contrôler. (Contrôle généralement partagé avec l'application) Mais je crois aussi que cela dépend de l'exécution elle-même. Je n'ai jamais eu affaire à des runtimes qui répondent à votre manière d'expliquer mais juste parce que je ne les ai jamais vues ne signifie pas qu'elles n'existent pas. – Phillip

1

En fait, la bonne réponse est OUI ... il y a quelques programmes qui le font (et s'ils existent .. cela signifie que c'est possible ...) peut-être que vous avez besoin d'écrire un noyau pour y parvenir, mais est possible.

Oh - et j'ai un autre exemple ... Debugger commande attacher ... voici un programme qui interagit avec une autre mémoire de programme, même si les deux ont commencé comme un processus différent ....

bien sûr - Messing avec une autre mémoire de programme .. si vous ne savez pas ce que vous faites va probablement le faire écraser ...

+0

@Dani: dans le cas d'un débogueur, vous constaterez qu'il utilise l'assistance du système d'exploitation et un privilège élevé pour accéder à l'autre espace d'adressage. –

+0

@John - Bien sûr, vous ne pouvez pas le faire sans ces ... – Dani

+0

Dans certains cas, le débogueur exécute un processus hôte. le processus hôte génère à la fois l'application et le débogueur. Comme l'hôte possède l'espace mémoire, il le fournit à la fois à l'application et au débogueur en tant qu'espace partagé, capable de manipuler la mémoire comme bon lui semble (ce qui nécessite un processus hôte, ce qui signifie que l'application ne possède pas directement l'espace) – Phillip

Questions connexes