-1
votes

Est-il possible d'attribuer un seul octet de mémoire à une adresse spécifique?

est-il possible d'allouer un seul octet de la mémoire à une adresse souhaitée spécifique, disons 0x123 ?

Ceci suggère des questions de suivi: Est-il possible de savoir si une adresse spécifique a déjà été malloc ed?

Certaines complications pourraient être:

  1. L'octet à l'adresse souhaitée 0x123 était déjà malloc 'ed. Dans ce cas, puis-je déplacer la valeur d'octets ailleurs et informer le compilateur (ou tout ce qui garde ces choses) de la nouvelle adresse de l'octet?
  2. L'octet à l'adresse souhaitée 0x123 était malloc 'ED avec d'autres octets. Par exemple. char * str = malloc (8); et str <= 0x123 < str + 8 ou dans d'autres Mots, 0x123 chevauche une certaine partie de déjà Malloc 'ED. Dans ce cas, est-il possible de déplacer la partie de la mémoire MALLOC 'ED ailleurs et d'informer le compilateur (ou tout ce qui garde ces choses)?

    Il y a aussi plusieurs variantes:

    1. est-ce possible si l'adresse souhaitée est connue au moment de la compilation?
    2. est-ce possible si l'adresse souhaitée est connue au moment de l'exécution?

      Je sais mmap prend un indice addr , mais il alloue en multiples de la page suivante et peut ou non d'allouer à l'indice donné addr .


8 commentaires

Bienvenue à! Il y a plusieurs questions connexes, que vous pouvez voir ici , mais ce n'est pas clairement clair ce que vous en essayant de faire. Si vous souhaitez réellement allouer une adresse exacte, il est peu probable de travailler de manière fiable ou du tout. Pouvez-vous expliquer plus sur ce que l'objectif est ? Pourquoi avez-vous besoin d'allouer une adresse exacte? Un Exemple minimal est le meilleur moyen de vous assurer d'obtenir l'aide dont vous avez besoin.


Votre question semble être un problème xy . Voir: Quel est le problème XY?


Non, ce n'est pas la façon dont la répartition de la mémoire fonctionne.


Merci @ davidc.rankin et @bweecker !!! Depuis que cette question / poste a déjà des réponses, devrais-je clarifier dans une question / post différente. Ceci décrit le problème réel : repl.it/@joseville/prependbyte # Main.c . En résumé, je voudrais charger un fichier en mémoire et préparer un seul octet (un \ n dans ce cas) car cela simplifierait la logique ultérieure. J'ai trouvé ce Autre message .


Cette affaire est couverte par la réponse de @ user253751. Essentiellement, vous souhaitez utiliser une mémoire tampon (ou une région de mémoire mappée) et définir le premier octet sur '\ n' , puis lisez le fichier dans l'espace après cela. Vous pouvez simplement MALLOC un tampon de FileSize + 2 , définissez le 1er octone sur '\ n' , lisez le fichier dans le reste avec < Code> Fread et utilisez un astuce de réglage du dernier octet vers 0 (le Nul-caractère ) afin que vous puissiez traiter la totalité de la chaîne.


Merci@ Davidc.Rankin. J'ai pu faire cela avec malloc et mmap . I MALLOC 'ED une grande région de mémoire S.T. La région de mémoire MALLOC 'ED est garantie d'avoir une adresse addr page alignée et répond à quelques autres exigences, de sorte que je puisse nourrir addr dans mmap avec map_fixed , puis * addr - 1 = '\ n' . Les détails sont tous ici: repl.it/@joseville/prependbyte#mmap_a_malloc.cled/a >. Cela pourrait être plus compliqué que ça vaut la peine. Je pense que dépend de la valeur de fsize Il peut être plus efficace d'utiliser Fread au lieu de MMAP .


Remarque: le code que j'ai lié (repl.it/@joseville/prependbyte#mmap_a_malloc.c) n'a travaillé que pour un exemple de jouet.


Excellent travail et bonne initiative travaillant bien que la suggestion ici et de la réponse à répondre à votre question. Bonne chance avec votre codage.


3 Réponses :


1
votes

Il est possible d'affecter une valeur spécifique à un pointeur comme suit:

unsigned char *p = (unsigned char *)0x123;


0 commentaires


0
votes

Les moyens spécifiques au système d'exploitation de le faire. Sous Windows, vous pouvez utiliser Virtualalloc (avec le Mem_Commit | Mem_Reserve indicateurs). Sur Linux, vous pouvez utiliser MMAP (avec le Map_fixed_noreplace drapeau). Ce sont les fonctions du système d'exploitation qui vous permettent de contrôler pleinement votre propre espace d'adresses.

Dans les deux cas, vous ne pouvez que mapper des pages entières. Les adresses ne deviennent valides et invalides une page à la fois. Vous ne pouvez pas avoir une page qui n'est que la moitié valide et vous ne pouvez pas avoir une page où une seule adresse est valide. Ceci est une limitation de la CPU.

Si la page que vous voulez est déjà allouée, vous ne pouvez évidemment pas l'attribuer à nouveau.

sur Windows et Linux, vous ne pouvez pas allouer la première page. Ceci est donc d'accéder aux pointeurs NULL (qui pointez sur la première page) se bloquera toujours.


0 commentaires