Question

Existe-t-il un moyen d'imprimer l'adresse mémoire la plus basse et la plus élevée qu'un système d'exploitation peut aborder en C?

Était-ce utile?

La solution

Non, ce n'est pas une caractéristique de la norme C. Quelle que soit la solution dont vous avez besoin, il faudra être spécifique au système d'exploitation.

Si vous avez à l'esprit un système d'exploitation spécifique, vous devez les mentionner. Mais j'ai du mal à me demander pourquoi cela importait. Il n'est pas nécessaire de pouvoir écrire des programmes C, alors peut-être pourriez-vous nous éclairer.

Sur la base de votre commentaire:

Ce que je suis curieux, c'est "Si chaque processus obtient un espace d'adressage en mémoire, puis-je être en mesure d'imprimer la tendre supérieur et la tarification inférieure de ce processus?"

Encore une fois, cela dépend du système d'exploitation. Votre espace d'adressage n'est pas nécessairement la mémoire physique que vous avez, c'est la totalité des emplacements que vous pouvez aborder. Par exemple, un système d'exploitation basé sur X86 peut donner à chaque processus son propre espace d'adressage 4G, mais vous devez demander au système d'exploitation de "soutenir" la mémoire (mémoire réelle réelle à mettre dans cet espace d'adressage).

Et une partie de cet espace d'adressage est en fait partagée entre tous les processus (où le système d'exploitation peut charger une copie physique de son code pour l'utilisation de tous les processus, par exemple).

Vous devez vous rappeler que la mémoire virtuelle et la mémoire physique sont des bêtes très différentes.

Autres conseils

Sur Linux, vous pouvez interroger la carte mémoire pour tout processus en cours d'exécution en examinant /proc/[PID]/maps; voir Proc (5). Par exemple:

$ cat /proc/self/maps
08048000-0804f000 r-xp 00000000 03:01 63119      /bin/cat
0804f000-08050000 rw-p 00006000 03:01 63119      /bin/cat
08050000-08071000 rw-p 08050000 00:00 0          [heap]
b7c58000-b7e09000 r--p 00000000 03:05 243564     /usr/lib/locale/locale-archive
b7e09000-b7e0a000 rw-p b7e09000 00:00 0
b7e0a000-b7f39000 r-xp 00000000 03:01 63497      /lib/libc-2.7.so
b7f39000-b7f3a000 r--p 0012f000 03:01 63497      /lib/libc-2.7.so
b7f3a000-b7f3c000 rw-p 00130000 03:01 63497      /lib/libc-2.7.so
b7f3c000-b7f40000 rw-p b7f3c000 00:00 0
b7f5b000-b7f5c000 rw-p b7f5b000 00:00 0
b7f5c000-b7f76000 r-xp 00000000 03:01 63276      /lib/ld-2.7.so
b7f76000-b7f78000 rw-p 00019000 03:01 63276      /lib/ld-2.7.so
bfc83000-bfc98000 rw-p bffeb000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]

Pour ce processus, la dernière entrée de la carte mémoire est 0xFFFFF000, donc le dernier octet adressable est 0xffFFFF000 - 1.

La réponse simple est que sur un système d'adresses 32 bits (par exemple), la plage d'adresses est [0x00000000, 0xFFFFFFFF]. Mais cela ne signifie pas que vous pouvez réellement accéder Chaque octet de cette gamme. Vous devez savoir comment le système d'exploitation et le compilateur organisent la mémoire de votre programme, c'est-à-dire où se trouve le segment de données statique, où se trouve le tas, où se trouve la pile, etc.

Et réaliser que sur un programme donné fonctionnant sur un système d'exploitation moderne, la plupart de l'espace d'adressage n'est pas cartographié.

Avec la mémoire virtuelle, chaque processus a son propre espace d'adressage, de sorte que l'octet à l'adresse 0x0010F444 (par exemple) dans un processus est un octet physique complètement différent de l'octet à la même adresse dans tous les autres processus.

Sur les systèmes d'exploitation modernes avec la mémoire virtuelle et la protection de la mémoire, les limites de l'espace d'adressage d'un processus ne sont pas statiques. Lorsque vous allouez la mémoire du tas, cela peut être implémenté par le système d'exploitation mappant plus de mémoire physique dans votre espace d'adressage, provoquant ainsi la croissance de cet espace.

La chose la plus importante ici est que la mémoire de processus et la mémoire du système d'exploitation sont des choses complètement différentes. Donc, parlant "en C", voulez-vous vraiment dire quelque chose de différent de l'espace de mémoire de processus?

je suggère cette pourrait vous aider, au moins vous donner une certaine direction. Une autre chose est BRK (2) / SBRK (2). Ces mécanismes ne sont pas si souvent utilisés que mon expérience le montre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top