est-il possible d'allouer un seul octet de la mémoire à une adresse souhaitée spécifique, disons Ceci suggère des questions de suivi:
Est-il possible de savoir si une adresse spécifique a déjà été Certaines complications pourraient être: p>
Il y a aussi plusieurs variantes: p>
Je sais 0x123 code>? p>
malloc code> ed? P>
0x123 code> était déjà
malloc code> '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? Li>
0x123 code> était
malloc code> 'ED avec d'autres octets. Par exemple.
char * str = malloc (8); code> et
str code> <=
0x123 code> <
str + 8 code> ou dans d'autres Mots,
0x123 code> chevauche une certaine partie de déjà
Malloc code> 'ED. Dans ce cas, est-il possible de déplacer la partie de la mémoire code> MALLOC CODE> 'ED ailleurs et d'informer le compilateur (ou tout ce qui garde ces choses)? LI>
ol>
mmap code> prend un indice
addr code>, mais il alloue en multiples de la page suivante et peut ou non d'allouer à l'indice donné
addr code >. p>
3 Réponses :
Il est possible d'affecter une valeur spécifique à un pointeur comme suit:
unsigned char *p = (unsigned char *)0x123;
est-il possible d'allouer un seul octet de la mémoire à une adresse souhaitée spécifique, par exemple 0x123? P> blockQuote>
Généralement: Non. Le langage C ne couvre pas l'attribution à des adresses spécifiques, il ne couvre que sur la manière d'accéder à une adresse spécifique. De nombreux compilateurs fournissent des extensions de langage non standard pour savoir comment allouer à une adresse fixe. Lorsqu'il colle à la norme C, l'allocation réelle doit être effectuée: p>
- dans le matériel, par exemple, avoir un MCU qui fournit une carte de registre mappée de mémoire, ou li>
- par la liaison spécifique au système, via des scripts de liaison personnalisés. LI> ul>
voir Comment accéder à un registre matériel de micrologiciel? pour plus de détails. P>
malloc code> n'a aucun sens dans les deux cas, car il utilise exclusivement une allocation de tas et que le tas est situé à l'intérieur d'un espace d'adresses pré-désigné. P>
Les moyens spécifiques au système d'exploitation de le faire. Sous Windows, vous pouvez utiliser Virtualalloc A > (avec le 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. P>
Si la page que vous voulez est déjà allouée, vous ne pouvez évidemment pas l'attribuer à nouveau. P>
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. P> Mem_Commit | Mem_Reserve code> indicateurs). Sur Linux, vous pouvez utiliser MMAP (avec le
Map_fixed_noreplace code> drapeau). Ce sont les fonctions du système d'exploitation qui vous permettent de contrôler pleinement votre propre espace d'adresses. P>
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 i>? 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 i>. 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 i>: 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 code> 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' code>, puis lisez le fichier dans l'espace après cela. Vous pouvez simplement
MALLOC code> un tampon de
FileSize + 2 code>, définissez le 1er octone sur
'\ n' code>, lisez le fichier dans le reste avec < Code> Fread CODE> et utilisez un astuce de réglage du dernier octet vers
0 code> (le Nul-caractère i>) afin que vous puissiez traiter la totalité de la chaîne.
Merci@ Davidc.Rankin. J'ai pu faire cela avec
malloc code> et
mmap code>. I
MALLOC CODE> 'ED une grande région de mémoire S.T. La région de mémoire code> MALLOC CODE> 'ED est garantie d'avoir une adresse
addr code> page alignée et répond à quelques autres exigences, de sorte que je puisse nourrir
addr code > dans
mmap code> avec
map_fixed code>, puis
* addr - 1 = '\ n' code>. 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 code> Il peut être plus efficace d'utiliser
Fread code> au lieu de
MMAP code>.
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.