[Résolu] Savoir sous quel processeur tourne un applicatif ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

[Résolu] Savoir sous quel processeur tourne un applicatif ?

Message par boddhi »

Salut à tous !!!

Y a-t-il un moyen PB ou une astuce pour savoir sous quel processeur tourne la machine qui exécute un applicatif ???

Le but étant d'écrire un code (Lecture/Ecriture de tags ID3v2) qui soit multiOS et compatible intel/motorola.
Or, comme il doit y avoir des accès mémoire et fichiers, se pose le problème de la lecture/écriture des octets en big endian/little endian...

Est-ce que l'utilisation de la constante #PB_Compiler_OS suffirait ??
Comme, par exemple, je ne connais pas trop Linux, je suppose qu'il doit pouvoir peut-être tourner sous ces deux processeurs ??? Auquel cas, #PB_Compiler_OS ne serait pas satisfaisant...

Merci.
Dernière modification par boddhi le mar. 20/juil./2010 22:34, modifié 2 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Comment savoir sous quel processeur tourne un applicatif

Message par GallyHC »

Bonjour,

J’ai fait plusieurs sources qui charge des fichiers genre CAB, ZIP et qui fonctionne en Multi-OS. Il faut juste bien choisir le types des variables et donc le nombre de bits a prendre.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment savoir sous quel processeur tourne un applicatif

Message par boddhi »

@GallyHC

J'ai rapidement examiné 2 de tes codes : Chargements CAB et PCX
Effectivement, je sais qu'en choisissant le type de variables dans une structure on peut contourner (seulement) une partie du problème...
Tes codes se seraient, en effet, compliqués si tu avais eu à gérer l'écriture en fonction du processeur...

Voilà

Code : Tout sélectionner

a.l=370934016
Debug PeekL(@a)
Debug "Intel retourne"
Debug Hex(PeekL(@a))
Debug "au lieu de"
Debug "$"+RSet(Hex(PeekB(@a)),2,"0")+RSet(Hex(PeekB(@a+1)),2,"0")+RSet(Hex(PeekB(@a+2)),2,"0")+RSet(Hex(PeekB(@a+3)),2,"0")
Je dois donc écrire une procédure qui inverse l'ordre des octets, quelque soit le type de variable > .b (ça, ça n'est pas le problème :) ), et ce, en fonction du processeur utilisé (ici, mon problème :!: :) )...

Je ne peux pas me permettre de traiter chaque valeur (.u, .i, ...) en .b pour être sûr qu'elle soit convenablement lue ou écrite...

D'où ma question...
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Comment savoir sous quel processeur tourne un applicatif

Message par GallyHC »

Je ne vois pas le problème...

370934016 donne bien $161C0100 en hexa et on inverse les poids fort et les poids faible. Donc $00011c16.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment savoir sous quel processeur tourne un applicatif

Message par boddhi »

370934016 donne bien $161C0100 en hexa et on inverse les poids fort et les poids faible. Donc $00011c16.
Intel retourne $161C0100 mais Motorola retournera $00011C16 soit 72726.

Il faut donc que je sache quand inverser la chaine hexa...
Exemple

Code : Tout sélectionner

Structure ID3
  TagID3.s{3}
  VersionMaj.b
  VersionMin.b
  Flag.b
  Taille.i
EndStructure

Fichier.s="C:\test.mp3"
If OpenFile(0,Fichier)
  WriteByte(0,$49)
  WriteByte(0,$44)
  WriteByte(0,$33)
  WriteByte(0,$04)
  WriteByte(0,$00)
  WriteByte(0,$80)
  WriteByte(0,$00)
  WriteByte(0,$01)
  WriteByte(0,$1C)
  WriteByte(0,$16)
  CloseFile(0)
EndIf
Debug "L'entête du fichier correspond à cela :"
Debug "$49 44 33 04 00 80 00 01 1C 16"
Debug "où $00 01 1C 16 équivaut à "+Str($00011C16)
Debug ""

Define.ID3 *TagID3
If ReadFile(0,Fichier)
  *TagID3=AllocateMemory(10)
  ReadData(0,*TagID3,10)
  Debug "Sous Intel on obtiendra $"+Hex(*TagID3\Taille)+" soit "+Str(*TagID3\Taille)
  Debug "alors que sous Motorola on aura bien $00011C16 soit 72726"
  CloseFile(0)
EndIf
DeleteFile(Fichier)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Comment savoir sous quel processeur tourne un applicatif

Message par MLD »

Salut boddhi
Sous window il faut utilisé l'api GetSystemInfo. Fait une recherche sur le fofo U.S pour voir?
Michel
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Comment savoir sous quel processeur tourne un applicatif

Message par MLD »

Re
Comme aujourd'hui c'est mon jour de bonté, j'ai cherché pour toi. :wink:

Code : Tout sélectionner

Structure SysInfo
  StructureUnion 
    dwOemId.l
    wProcessorArchitecture.w 
    wReserved.w 
  EndStructureUnion 
  dwPageSize.l 
  lpMinimumApplicationAddress.l 
  lpMaximumApplicationAddress.l 
  dwActiveProcessorMask.l 
  dwNumberOfProcessors.l 
  dwProcessorType.l 
  dwAllocationGranularity.l 
  wProcessorLevel.w
  wProcessorRevision.w
EndStructure

GetSystemInfo_(@si.SysInfo)


Debug si\wProcessorArchitecture
Debug "---"
Debug si\dwPageSize
Debug si\dwActiveProcessorMask
Debug si\dwNumberOfProcessors
Debug si\dwProcessorType
Debug si\wProcessorLevel
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment savoir sous quel processeur tourne un applicatif

Message par boddhi »

@MLD

Merci pour ta bonté et tes recherches :wink:

Si j'ai bien compris, on utiliserait GetSystemInfo_(@si.SysInfo) pour savoir si l'ordinateur est basé sur un Intel ou non. Ok.

Je sais, je vais encore jouer les chieurs :lol: , mais...
C'est une API windows et si elle convient parfaitement pour Windows, imbriquée dans un CompilerIf #PB_Compiler_OS, elle ne résout que partiellement mon objectif qui est, à partir d'un code MultiOS, de déterminer sous quel processeur une machine tourne...

Comme je ne connais ni Linux ni MacOs, je n'ai aucune idée de la manière dont je dois procéder si ce n'est exclure l'usage de ce code à ces OS. Ce qui n'est pas du tout mon but...

Je garde quand même ton bout de code en archive, il servira bien un jour ou l'autre :D
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Comment savoir sous quel processeur tourne un applicatif

Message par MLD »

boddhi a écrit :@MLD

Merci pour ta bonté et tes recherches :wink:

Si j'ai bien compris, on utiliserait GetSystemInfo_(@si.SysInfo) pour savoir si l'ordinateur est basé sur un Intel ou non. Ok.

Je sais, je vais encore jouer les chieurs :lol: , mais...
C'est une API windows et si elle convient parfaitement pour Windows, imbriquée dans un CompilerIf #PB_Compiler_OS, elle ne résout que partiellement mon objectif qui est, à partir d'un code MultiOS, de déterminer sous quel processeur une machine tourne...

Comme je ne connais ni Linux ni MacOs, je n'ai aucune idée de la manière dont je dois procéder si ce n'est exclure l'usage de ce code à ces OS. Ce qui n'est pas du tout mon but...

Je garde quand même ton bout de code en archive, il servira bien un jour ou l'autre :D
Je comprend. Mais dans ce cas il faut faire un soft qui démarre avant le système d'exploitation. Une seule solution le langage machine ou assembleur , pour aller chercher l'information dans le bios. (si je ne me trompe pas ?)
Michel
pbprint
Messages : 6
Inscription : lun. 19/juil./2010 17:03

Re: Comment savoir sous quel processeur tourne un applicatif

Message par pbprint »

Salut Michel
...il faut faire un soft qui démarre avant le système d'exploitation. Une seule solution le langage machine ou assembleur , pour aller chercher l'information dans le bios. (si je ne me trompe pas ?)
Non, tu ne te trompes pas Michel, j'allais proposer exactement la même chose. Mais je crois qu'en C se sera beaucoup mieux (avec GetSystemInfo_(@si.SysInfo) appelée avant le test des types, plus rapide je crois..)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Comment savoir sous quel processeur tourne un applicatif

Message par TazNormand »

@Mekkisoft/PbPrint : GetSystemInfo_ étant également une API windows, ça ne va pas l'aider non plus pour les proco Motorola/IBM PowerPC ou autre sous Linux. Arrêtes de polluer les topics avec tes réponses à 2 eurocents (et encore je suis généreux) !!! la cinquantaine et un comportement d'ado ! tss, et dire que tu veux nous donner des leçons :roll:

@Fred/Dobro/LSI : bannissez-moi ce parasite avant qu'il ne prolifère :x
Image
Image
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Comment savoir sous quel processeur tourne un applicatif

Message par GallyHC »

Il y a peu etre un truc que je ne comprend plus. Mais une valeur numerique si on fait une convertion simple en hexa ce sera toujours le même resultat, ou alors l'hexa change et donc 1,2,3,4,5,6,7,8,9,A,B,C,D,E,F n'est plus la base 16...

Donc en faisant une conversion simple et en inversant apres sa donne quoi?

370934016 en hexa pure ce sera toujours $161C0100 et non pas $00011c16 (vu que $00011c16 = 72726), ou y a un truc que je ne comprends pas ?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment savoir sous quel processeur tourne un applicatif

Message par boddhi »

Et dire que la solution était là sous mes yeux... J'ai honte :oops:

Il suffit de :

Code : Tout sélectionner

Valeur1.w=1
Valeur2.b=PeekB(@Valeur1)
Debug "Valeur 1 : $"+Hex(Valeur1)
Debug "Valeur 2 : $"+Hex(Valeur2)
If Valeur1=Valeur2
  Debug "On suppose qu'on tourne sous Intel"
Else
  Debug "On suppose qu'on tourne sous Motorola"
EndIf
Debug ""
; Ce qui donne, condensé
Valeur1=1
If PeekB(@Valeur1)=Valeur1
  Debug "On suppose qu'on tourne sous Intel"
Else
  Debug "On suppose qu'on tourne sous Motorola"
EndIf
Vous confirmez ??? (Si quelqu'un tourne sous Motorola...)
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment savoir sous quel processeur tourne un applicatif

Message par boddhi »

GallyHC a écrit :370934016 en hexa pure ce sera toujours $161C0100 et non pas $00011c16 (vu que $00011c16 = 72726), ou y a un truc que je ne comprends pas ?
Le problème est qu'un Intel n'agence pas les octets en mémoire de la même manière qu'un Motorola.
Pourquoi faire simple quand on peut faire compliqué ? (j'ignore en tout cas les raisons historique, architecturale, etc de cette conception)

Un test simple pour comprendre :

Code : Tout sélectionner

Valeur.w=1
Calldebugger
Déboggueur => Mémoire => Etendue = @valeur => - = @valeur+2 => Afficher

Tu auras comme résultat :
Sous Intel : $01 00
Sous Motorola : $00 01

Si tu continues avec :

Code : Tout sélectionner

AutreValeur.w=PeekB(@Valeur)<<8+PeekB(@Valeur+1)
Debug AutreValeur
AutreValeur, sous Intel, prendra la valeur $100, soit 256, alors que sous Motorola, elle aura bien pour valeur 1.

Ce qui n'est pas la même chose... :D
Répondre