Adressage de la mémoire
|
05-03-2013, 23h17
Message : #1
|
|
Serphentas
Thall Messages : 41 Sujets : 10 Points: 29 Inscription : Oct 2012 |
Adressage de la mémoire
Salut
Dans ma quête à l'optimisation ultime d'un certain logiciel (SuperPi), je suis tombé sur la gestion de la mémoire physique par l'OS. De ce que j'ai lu, c'est sous forme hexadécimale et sous forme d'adresses (par exemple, 0x1000000). Vous me semblez être plus à jour que moi sur ce sujet (notamment stack overflow si je me trompe pas), donc mes questions sont: - la mémoire physique est-elle bien adressée comme expliqué ci-dessus ? - si oui, comment savoir où une adresse se situe ? (barrette de RAM n°1, puce 3, etc) - y a-t-il un moyen de choisir l'emplacement/de bouger (d')une adresse ? J'espère ne pas trop vous faire peur avec tout ça. |
|
06-03-2013, 01h28
Message : #2
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: Adressage de la mémoire
Plop,
La mémoire, tu peux voir ça comme un gros tableau, avec plein de cases. quand un élément est alloué en mémoire : c'est a dire qu'il occupe une certaine place en mémoire, il se situe a une certaine adresse. Les adresses, sont représentées en notation hexadécimales car la plage d'adresse est très étendue sur nos systèmes actuels, ca n'est qu'une question pratique. tu peux très bien donner un nombre décimal, ça sera juste plus long. Pour ce qui est de la deuxième question, je n'en sais rien. :p Bouger une adresse te sera impossible, c'est ton système qui le gère. Tu peux de ton coter choisir a quel adresse placer tes éléments dans la mémoire (si ton OS te l'autorise) a l'aide de fonction comme mmap() (en C). Tu parles aussi de stack overflow, un stack overflow est ce qui s'appel un "stack based buffer overflow" ce qui signifie un dépassement de mémoire sur la stack. Il faut savoir que pour chaque processus, la mémoire est diviser en différentes parties. On retrouve notamment la Stack et la Heap. (La pile et le tas en français). Sur la stack, on retrouve les variables locales, les paramètres des fonctions, etc... Dans le cadre d'un "stack based buffer overflow", on va écraser certains éléments de la stack, et par exemple écraser l'adresse de retour d'une fonction, qui fait qu'on pourra contrôler le fonctionnement du programme. I hope it helped. |
|
06-03-2013, 10h21
Message : #3
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,609 Sujets : 71 Points: 465 Inscription : Jan 2012 |
RE: Adressage de la mémoire
Sinon, pour préciser la réponse de Ark, il y a deux "types" de mémoire.
Tout d'abord il y à la mémoire physique, qui comme son nom l'indique, correspond à la mémoire disponible dans tes barettes de RAM. Cette mémoire est exclusivement gérée par le système d'exploitation et rien ne permet de la manipuler dans l'espace utilisateur. Ensuite vient la mémoire "virtuelle" ou "paginée", qui, elle, est totalement visible et manipulables par ton processus. C'est la mémoire virtuelle qui fait croire à ton process qu'il est "seul" dans la RAM, et cette mémoire est composée de portions de RAM physique, de morceaux de fichiers de pagination, etc... (je te renvoie vers n'importe cours de programmation d'OS si jamais mes explications sont pas assez claires :þ)
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
06-03-2013, 21h45
Message : #4
|
|
Serphentas
Thall Messages : 41 Sujets : 10 Points: 29 Inscription : Oct 2012 |
RE: Adressage de la mémoire
Merci pour vos réponses.
Concernant l'adresse mémoire, plus c'est bas plus c'est proche de la première barrette de RAM ? (dans le cas d'une mémoire physique) Par exemple, 0x10000000 est/serait plus au "début" comparé à 0xFF000100 (j'invente, c'est sûrement incorrect ). Donc on ne peut pas toucher à la mémoire physique, contenu ou emplacement, puisque c'est l'OS qui se réserve tous les droits d'écriture/lecture. Est-ce qu'on pourrait modifier quelque chose comme le BIOS/UEFI pour que l'OS change sa manière de gérer la mémoire ? Quand tu (Ark) parles de "choisir a quel adresse placer tes éléments dans la mémoire", tu veux dire que je peux choisir à quelle adresse placer des choses de mon choix ou bien des choses gérées par l'OS (comme SuperPi) ? Pour finir, la mémoire virtuelle. De ce que j'ai lu, c'est uniquement le swap donc disque système/local (du moins sur Windows). Pour les imprécisions, je vais sûrement me diriger vers des sources externes. x) |
|
06-03-2013, 22h44
Message : #5
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: Adressage de la mémoire
(06-03-2013, 21h45)Serphentas a écrit : Pour finir, la mémoire virtuelle. De ce que j'ai lu, c'est uniquement le swap oui et non, c'est valable pour windows peut-être ça l'est pas pour linux par exemple, au risque de paraphraser Ark et supersnail, les barettes de RAM et la swap ce sont des mémoires, l'OS (le noyau) se débrouille pour les gèrer et te permettre de les utiliser de manière transparente quand tu exécutes un programmes tu ne peux donc pas dire (enfin si, mais peu importe) qu'il utilise la swap ou qu'il utilise la RAM quand tu exécutes un programmes (processus), il a un espace d'adressage rien que pour lui fournit par le noyau, sous linux x86 par exemple cet espace d'adressage va de 0x00000000 à 0xffffffff (avec une limite à 0xc0000000 pour userland/kernelland), ça veut dire que n'importe quel programme qui s'exécute peut écrire à l'adresse 0x12345678 sans que ça gêne le programme d'à coté, ils ne partagent pas les mêmes adresses, chacun à son propre espace d'adressage virtuel avec des adresses pour userland qui vont de 0x00000000 à 0xbfffffff chaque processus peut donc utiliser 3Go de mémoire potentiellement, mais ça n'est évidement jamais le cas, si vraiment il avait besoin de ces 3Go de mémoire le noyau s'efforcerait de la lui donner, quand il n'y a plus de RAM il prend dans la swap, quand il n'y a plus de swap il y a de fortes chances que le processus se fasse oom-killer par le noyau |
|
08-03-2013, 16h46
Message : #6
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: Adressage de la mémoire
Hello,
Dernier morceau d'information qui te manque: c'est le CPU qui s'occupe de traduire, directement en hardware, les addresses virtuelles en addresses physiques. Sur x86 ça peut se faire avec deux mécanismes, la segmentation (que linux n'utilise pas, et qui n'existe plus en mode 64bits) et la pagination. Pour la pagination, on stocke quelque par en mémoire des tables de correspondance entre les addresses physiques et les addresses virtuelles, puis on indique la position de la table au CPU en l'écrivant dans un registre de contrôle dédié à ça. L'OS peut ensuite contrôler la correspondance entre addresses logiques et physiques en modifiant la table ou en changeant la table en cours. |
|
08-03-2013, 17h23
Message : #7
|
|
Serphentas
Thall Messages : 41 Sujets : 10 Points: 29 Inscription : Oct 2012 |
RE: Adressage de la mémoire
Merci pour toutes ces précisions. Je vous tiens au courant dès que j'ai trouvé un lien entre la partie théorique/logicielle et les barrettes elles-mêmes (ou autre).
|
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
[Defi du gromanche] - Memoire, CPU d'un programme | notfound | 3 | 221 |
01-06-2014, 19h18 Dernier message: notfound |
Utilisateur(s) parcourant ce sujet : 2 visiteur(s)