2015-12-03 1 views
1

Je suis en train d'étudier pour l'examen final de ma classe d'OS, et je suis tombé sur cette question sur l'une des diapositives de mon professeur. Je suppose que c'est vraiment difficile à faire et donc pas très pratique en termes de quantité de production que vous pourriez obtenir - vous devriez en quelque sorte garder une trace de la partie de la mémoire physique qui est utilisée par chaque programme, faites attention ne pas écrire dans les zones qui sont mappées à divers périphériques, etc.Pourquoi les programmes ne sont-ils pas écrits avec des adresses physiques?

Est-ce exact ou est-ce que je manque quelque chose?

+0

Beaucoup de raisons. J'en donnerai un de la sécurité: si un attaquant sait exactement où une bibliothèque est chargée avec précision, il peut être plus facile pour eux d'exploiter votre programme. Cela conduit à [Address Space Layout Randomization] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) –

Répondre

1

L'une des raisons les plus importantes pour lesquelles nous avons de la mémoire virtuelle est de savoir comment fonctionne le code exécutable. Compte tenu de l'exemple le plus simple a = 12345 comment l'assemblage ici regarderais (simplifié pour des raisons évidentes, tout est un int):

Memory Address:Content at address 
00000000000004: 12345 (or binary: 11000000111001) 
00000000000008: a (phisical location of a) 
0000000000000C: copy from 00000000000004 to 00000000000008 instruction 

L'important est copy from 00000000000004 to 00000000000008 instruction ce qui ne fait copier tout un tas de mémoire d'un endroit de un autre.

Lorsque vous essayez d'exécuter ce programme, vous devez avoir a et 12345 à ces endroits sinon il ne fonctionnera pas. Si la mémoire est physique directement, votre programme ne fonctionnera que s'il est toujours placé dans le même emplacement mémoire. Ceci est résolu par virtual memory de sorte que pratiquement tout est au même endroit, laissant le placement dans la mémoire physique au système d'exploitation (en utilisant paging). Sans cela, vous devriez changer toutes les instructions dans le code chaque fois que le programme s'exécute à l'emplacement physique et que cela ne ferait que rendre les programmes plus gros et plus lents.

La mémoire virtuelle résout plusieurs problèmes. Tout d'abord, il permet à plusieurs programmes de fonctionner sur la même machine. Deuxièmement, il permet au système d'exploitation de faire une sécurité supplémentaire par randomizing the position of each page in the ram. En outre, vous pouvez théoriquement allouer plus de mémoire que votre mémoire physique, car le système d'exploitation peut déplacer la mémoire de la RAM vers le disque dur et revenir à chaque fois que le programme en a besoin (see this).

+0

Merci pour le détail de votre réponse. Donc, en plus du problème de sécurité, écrire vos programmes en utilisant des adresses physiques les rend inflexibles dans le sens où chaque fois que vous changez d'emplacement physique, vous devez modifier les adresses de toutes vos instructions (ou les instructions elles-mêmes? Qu'y a-t-il sur cette nouvelle machine? Est-ce correct? – Enis

+0

Oui, vous devez modifier dans tous les endroits où les adresses sont référencées dans votre programme. Les références peuvent être n'importe où; dans les instructions (passer de LocA à LocB, ou sauter à LocD, etc) et dans les données aussi (ne peut pas penser à un exemple). Quoi qu'il en soit, c'est au compilateur de faire ce qu'il veut avec la soupe de code et vous pourriez vous retrouver avec littéralement des milliards de références d'adresses n'importe où. – Raxvan

+0

Il y a eu un système dont je ne me souviens malheureusement pas du nom qui a contourné ce problème sans mémoire virtuelle en modifiant toute l'adresse physique d'un programme ** à l'exécution ** et en l'insérant dans l'espace d'adressage. Cela vient avec un impact significatif sur les performances, évidemment. – Downvoter

0

Il existe de nombreuses raisons d'utiliser la traduction d'adresse logique. Le plus important est qu'il simplifie la mise en œuvre de la sécurité en séparant chaque processus.

Il permet également le remappage de la mémoire et le partage de la mémoire. Plusieurs processus peuvent mapper la même page physique à différentes adresses logiques.

Il s'agit d'un prérequis pour la mémoire virtuelle (un concept distinct, mais lié à la traduction de la mémoire logique).

Il permet à tous les processus (et l'instance de la même application) d'avoir la même disposition de la mémoire.

Il élimine en grande partie le besoin pour le noyau d'allouer des blocs contigus (cadres de page) de la mémoire pour les processus. Un espace d'adressage logique continu peut être créé à partir de cadres de pages non contigus.