Forum Programmation.c accès à la mémoire

Posté par  .
Étiquettes : aucune
0
30
mai
2005
bonjour
je voulais savoir s'il y a une commande shell Linux qui affiche le contenue du registre d'adresse DS (ou ES) d'un processus (ou un module)?
si ceci n'existe pas, mon problème est :


Je programme en mode noyau (j'utilise un module),
j'ai besoin d'accéder a la plage mémoire réservée au pilote de la carte réseau, j'ai l'adresse physique de la plage mémoire mais pas le registre DS (ou ES) de son segment de donnée, est ce qu'il y a un autre moyen pour le faire.

merci,
  • # Prog i386

    Posté par  . Évalué à 4.

    Pour autant que je sache DS, et ES, cela sert surtout en mode réel. Linux n'a jamais fonctionné dans un tel mode. Sur i386 et supérieur, on utilise au moins les registres 32 bits (avec le préfixe E).

    Les segments (formellement Adresse Physique = Segment x 16 + Adresse), cela ne fonctionne qu'en mode réel également. En mode protégé, le numéro du segment se réfère à une plage de mémoire mappée sur une zone logique et à laquelle tu as le droit d'accéder sans déclencher de segfault.

    Et pour finir, tout ceci n'est valable que sur PC (enfin sur architecture Intel ou compatible).

    L'assembleur c'est vraiment fun, mais si tu développes pour Linux, tu ne devrais pas avoir besoin de descendre si bas.
  • # Mode protégé et adressage "flat"

    Posté par  . Évalué à 3.

    En mode protégé, les registres de segments contiennent un index
    dans une table appelée GDT, c'est dans cette table que sont définis
    les segments (adresse de base, taille, attributs, ...).

    Linux sur i386 tourne en mode protégé et utilise une configuration
    des registres de segments (CS, DS, ES, ...) en mode "flat", c'est-à-dire
    couvrant tout l'espace d'adressage de 0 à 4 Go.

    Donc, en pratique, il n'y a pas à en tenir compte: tu veux accéder
    à la zone mémoire 0xe0001234 et mettre le contenu dans le registre
    EBX ? Tu fais: mov ebx, [0xe0001234]. Implicitement, c'est DS qui est
    utilisé. Sous Linux/x86, je crois me rappeler que DS=ES=FS=GS.

    Par contre, concrètement parlant, qu'est-ce que tu veux faire
    exactement en allant taper dans la zone mémoire du pilote de ta
    carte réseau ?
    • [^] # Re: Mode protégé et adressage "flat"

      Posté par  . Évalué à 1.

      merci mecieu pour l'aide précieu, cependant, le DS que je voulai avoir c'est celui du pilote de la carte, car l'adresse 0xe0001234 doit se trouvé dans l'espace d'adressage du processus pilote de la carte réseau,cette mémoire est protégée par le système qui ne laisse droit qu'au processus en mode noyau normalement (chose que je vien d'essayer), la seulle contrainte qui reste est de changer le registre d'adresse DS par celui du driver.
      • [^] # Re: Mode protégé et adressage "flat"

        Posté par  . Évalué à 3.

        Exact, il y a une paire de CS/DS(ES,...) pour la partie user, et une autre
        pour la partie kernel.

        Dans arch/i386/kernel/head.S, il y a la définition de la GDT, avec notamment:

        .quad 0x00cf9a000000ffff /* 0x60 kernel 4GB code at 0x00000000 */
        .quad 0x00cf92000000ffff /* 0x68 kernel 4GB data at 0x00000000 */
        .quad 0x00cffa000000ffff /* 0x73 user 4GB code at 0x00000000 */
        .quad 0x00cff2000000ffff /* 0x7b user 4GB data at 0x00000000 */

        Donc ce qui t'intéresserait ce serait le "0x68", à mettre dans DS/ES/...

        Sachant quand même que si tu es en mode noyau, tu devrais déjà
        avoir cette valeur dans les registres.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.