Bonsoir,
le problème qui se pose à moi concerne une machine SUN (sun fire 68000 sous sunOS 5.8) dont le processeur est un sparc 64 bits.
Je voudrais lire les termes d'un structure nommée proc, dont un exemplaire est attaché à chacun de mes process; prenons ma shell ksh par exemple.
Si dans ma shell je tape :
$ ps -o user,pid,addr,args -p $$
la machine me répond : (sachant que le $$ qui est passé en argument à ps est remplacé par le PID de ma shell)
USER PID ADDR CMD
moi 6914 30029089570 /bin/ksh
et le ADDR en question est l'adresse en mémoire de la structure proc qui m'intéresse.
Un utilisateur du forum (merci matafan) m'a indiqué d'aller lire le pseudo-device /dev/kmem avec l'offset en question pour y trouver la structure; c'est ce que j'essaye de faire de la façon suivante, mais comment être sûr que le résultat est bon ?
Le résultat que ça me donne est le suivant mais je ne sais pas quoi en penser; en particulier au début, la méthode de conversion de l'adresse que me donne ps, en un long long qui me sert d'offset est elle bonne : (faut il utiliser strtol ou strtoll, et quelle est la longueur d'un mot ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 main(int argc, char *argv[]) { char xadrstproc[20]; int kmem = open("/dev/kmem", "r+"); long long adrstproc; struct proc myproc, *pstproc; printf("\nadrstproc =%s (%%s)\n", argv[1]); // ceci est l'adresse ascii. // essai de conversion en hexa de argv[1] en la préfixant par "0x" : sprintf(xadrstproc, "0x%s", argv[1]); // ceci est la conversion de l'adresse ascii. printf("xadrstproc =%s (%%s)\n", xadrstproc); // ceci est l'adresse ascii. adrstproc=strtol(xadrstproc, NULL, 0); // enfournage de la chaine ascii dans un long long. printf("adrstproc =%lld (%%lld)\n", adrstproc); // ceci est l'adresse décimale. printf("adrstproc =%llu (%%llu)\n", adrstproc); // ceci est l'adresse unsigned. printf("adrstproc =%llx (%%llx)\n\n", adrstproc); // ceci est l'adresse hexa. // lseek64(kmem, adrstproc, SEEK_SET); // ceci passe par /dev/kmem read(kmem, &myproc, sizeof myproc); // Et avec un peu de chance tu te retrouves // // avec la structure proc de ton process dans myproc. // accès aux membres : printf("myproc.p_exec =%llu (%%llu)\n" ,myproc.p_exec); printf("myproc.p_as =%llu (%%llu)\n", myproc.p_as); }
Merci de m'avoir lu jusqu'ici et d'essayer de me donner des indications pour avancer,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ./cred `ps -o user,pid,addr,args -p $$ |grep st13277 | awk '{print $3}'` adrstproc =3003414caa0 (%s) xadrstproc =0x3003414caa0 (%s) adrstproc =2147483647 (%lld) adrstproc =2147483647 (%llu) adrstproc =7fffffff (%llx) myproc.p_exec =18428420643713188848 (%llu) myproc.p_as =18389270457723664980 (%llu)
David
Partager