Question

Je lis sur le wiki OSDev, ce mode protégé de l'architecture x86 vous permettent de créer des segments séparés pour le code et les données, alors que vous ne pouvez pas écrire dans la section de code. Que Windows (oui, c'est la plate-forme) charge le nouveau code dans le segment de code, et les données sont créées sur le segment de données. Mais, si tel est le cas, comment le programme ne sait qu'il doit passer des segments du segment de données? Becouse si je comprends bien, toutes les instructions indiquent adresse au segment que vous exécutez le code de, sauf si vous changez le descripteur. Mais je lis aussi, ce modèle de mémoire plat si colled vous permet d'exécuter du code et des données au sein d'un segment. Mais je lis ce que dans le cadre d'assembleur. Alors, s'il vous plaît, ce qui est le cas avec le code C compilé sur Windows? Merci.

Était-ce utile?

La solution

Il y a deux significations pour le segment dans l'explication:

  • un segment d'adresse de mémoire 8086
  • un segment de section de programme de module objet

La première est liée à ce qui est chargé dans un registre de segment 80386+; il contient une adresse de début de mémoire physique, la longueur d'allocation de mémoire admises, à lecture / écriture / exécution d'accès, et si elle croît de bas en haut ou vice versa (ainsi que quelques drapeaux plus obscurs, comme « copie sur référence »).

La deuxième signification est une partie de la langue du module d'objet. Fondamentalement, il y a un segment nommé code, un segment nommé data (qui contient des données initialisées), et le segment des données non initialisées nommé bss (nommé pour les instructions pseudo des années 1960 assembleurs qui signifie Bloc commençant par Symbole ). Lorsque les moissonneuses-batteuses de liaison objet modules, il dispose de tous les segments de code ensemble, tous les segments de données ainsi qu'ailleurs, et la bss ensemble ainsi. Lorsque le chargeur cartes adresses mémoire, il regarde l'espace total de code et alloue une allocation de mémoire du processeur d'au moins de cette taille, et mappe le segment du code (dans une situation de mémoire virtuelle) ou lit le code dans la mémoire allouée, pour lesquels il doit fixer temporairement la mémoire en tant que données en écriture. La protection en écriture se fait à travers le mécanisme d'échange de la CPU, ainsi que le registre de segment. Cela permet de protéger les tentatives d'écriture de code à travers, par exemple, une adresse de données errante. Le chargeur fait également la configuration similaire pour les deux groupes de segments de données. (Outre ceux-ci, il y a la création d'un segment de pile et l'allocation, et la cartographie des images partagées.)

En ce qui concerne les instructions x86 d'exécution, chaque opérande a un registre de segment associé. Parfois, ceux-ci sont explicites, et parfois ils sont implicites. Code est implicitement accessible par CS, pile par SS qui est impliqué chaque fois que le registre de ESP ou EBP est impliqué, et DS est impliqué dans la plupart des autres opérandes. ES, FS et GS doit être spécifié comme un remplacement dans tous les autres cas, sauf pour certaines des instructions de chaîne comme movs et cmps. Dans le modèle plat, tous les registres de segment carte à la même espace d'adressage, bien que CS ne permet pas l'écriture.

Alors, pour répondre à votre dernière question, la CPU dispose de quatre registres de segment (ou plus) mis en place à la fois pour accéder à l'espace de mémoire virtuelle à plat du processus. Chaque accès opérande est vérifié pour être approprié à l'instruction (pas comme incrémenter une adresse CS) et est également contrôlé par l'unité de protection d'appel pour être autorisé.

Autres conseils

Les informations que vous lisez est obsolète. versions de Windows depuis 1993 l'utilisation ~ un appartement espace de mémoire virtuelle 32 bits. Les valeurs des registres de segment CS et DS ne comptent plus et ne peuvent être modifiés. Il y a encore une notion de données, le code vs maintenant mises en œuvre par des attributs de page de mémoire. Passez en revue les valeurs autorisées passé dans l'argument flNewProtect pour le VirtualProtectEx () fonction API .

Vous utilisez très rarement cette API vous-même, les attributs sont définis par le chargeur d'image exécutable et le gestionnaire de tas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top