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 Obsidian . Évalué à 4.
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 galactikboulay . Évalué à 3.
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 zakarias . Évalué à 1.
[^] # Re: Mode protégé et adressage "flat"
Posté par galactikboulay . Évalué à 3.
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.