2016-10-21 1 views
1

Si je regarde la carte mémoire pour un processus 64 bits sur Linux (x86_64) Je vois que le a.out est mis en correspondance en mémoire assez faible:Y at-il un moyen d'avoir un.out chargé dans Linux x86_64 "haute mémoire"?

$ cat /proc/1160/maps 
00400000-004dd000 r-xp 00000000 103:03 536876177       /usr/bin/bash 
006dc000-006dd000 r--p 000dc000 103:03 536876177       /usr/bin/bash 
006dd000-006e6000 rw-p 000dd000 103:03 536876177       /usr/bin/bash 
006e6000-006ec000 rw-p 00000000 00:00 0 
00e07000-00e6a000 rw-p 00000000 00:00 0         [heap] 
7fbeac11c000-7fbeac128000 r-xp 00000000 103:03 1074688839    /usr/lib64/libnss_files-2.17.so 
7fbeac128000-7fbeac327000 ---p 0000c000 103:03 1074688839    /usr/lib64/libnss_files-2.17.so 

J'aimerais carte une mémoire 2G région dans la partie la plus basse de la mémoire, mais doivent mettre cela dans la région après ces mappings a.out, traversant dans la deuxième région 2G.

Est-ce le a.out cartographié ici une partie de la x86_64 ABI, ou peut cette adresse de chargement être déplacé dans une autre région, en utilisant l'un des:

  • drapeaux du chargeur d'exécution
  • drapeaux de liaison lorsque le l'exécutable est créé

?

+0

Vous réalisez, je l'espère, que ce sont toutes des adresses _virtual_, et il n'y a pas de corrélation particulière entre elles et les adresses de mémoire physiques réelles utilisées? Il n'y a pas de pages consécutives de mémoire virtuelle nécessairement en ordre dans la mémoire physique, ou même proches les unes des autres, ou même sur le même noeud NUMA ou dans la même zone mémoire ... – twalberg

+0

Le modèle de code par défaut met les données statiques et le code dans le low 2G afin que leurs adresses puissent être représentées par des constantes de 32 bits étendues par des signes, à utiliser comme opérandes immédiats. Vous devez impérativement recompiler un exécutable standard pour que cela fonctionne, car par défaut, ils ne sont PAS indépendants de la position (et feront des choses comme 'mov edi, .LC0/call puts', avec l'adresse de chaîne codée en dur au moment de la liaison en une constante de 32 bits). Voir les documentations ABI (liées à partir du [wiki du tag x86]) (http://stackoverflow.com/tags/x86/info) –

+0

@twalberg Oui –

Répondre

2

Oui. La construction d'une application Linux x86-64 en tant qu'exécutable indépendant de la position entraînera le mappage de celle-ci et de son tas en mémoire haute, tout comme libc et d'autres bibliothèques. Cela devrait laisser l'espace sous 2 Go gratuit pour votre usage. (Cependant, notez que le noyau protégera probablement les 64 premiers Ko de la mémoire d'être mappé pour le protéger de certains exploits; consultez vm.mmap_min_addr pour plus d'informations.)

Pour créer votre application en tant qu'exécutable indépendant de la position, passez -pie -fPIE au compilateur.

+0

On dirait que je peux commencer aussi bas que 4096 (bien qu'un départ de 64K) le point est probablement aussi bon). –