begin process at 2010 02 10 01:04:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application Unix

 > LISTING DES PÉRIPHÉRIQUES PCI

LISTING DES PÉRIPHÉRIQUES PCI


 Information sur la source

Note :
Aucune note
Catégorie :Application Unix Classé sous :pci, scan, bios, x86 Niveau :Débutant Date de création :01/08/2006 Date de mise à jour :02/08/2006 10:19:48 Vu / téléchargé :4 891 / 359

Auteur : _dune2_

Ecrire un message privé
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Salut,
  ce code réalise le listing des cartes PCIs du système.
Il a été écrit pour montrer les possibilités d'intéractions sur la gestion des cartes PCI en passant uniquement par le Bios système. Ce dernier point permet un portage facile de ce code sous windows ou dos car seules "printf" et "ioperm" sont appelés, et ils ont été appelé via un "call" pour permettre une couche d'abstraction sur ces 2 fonctions.

Ces accés au bus PCI peuvent servir d'exemple pour l'écriture d'un micro-OS par exemple ou alors pour l'écriture d'un bootstrap lorsqu'il n'y a pas de fonction de gestion des périphériques PCI fourni par l'OS.

Dans cette exemple, je n'effectue que la lecture du VendorID et du DeviceID, mais on peut tout à fait lire les BAR0...BAR4 (Base Address Register 0..4) des cartes PCIs pour ensuite les remapper dans l'espace d'adressage local via un appel à "mmap" et s'en servir ...


 Conclusion

Pour compiler cet exemple, il faut utiliser nasm puis gcc et non ld, car on utilise des appels aux fonctions de la libc :
nasm -f elf pci_scan.asm
gcc pci_scan.o -o pci_scan

Ensuite, l'utilisation des IOs < 1024, il faut être root pour pouvoir l'executer ... (et heureusement car on réalise un accés au système physique)

Voilà ...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

02 août 2006 10:19:48 :
Remplacement de la simple fonction _lire_16bits par les fontions pci_read_byte, pci_read_word et pci_read_dword pour réutilisation.

 Sources de la même categorie

Source avec Zip [LINUX] LIRE CLAVIER ET ECRIRE CONSOLE par sheorogath
UN "HELLO WORLD" SOUS LINUX (UTILISE L'ASSEMBLEUR AS ET LE L... par bouba
HELLO WORLD NUNUX G++! MOUARF.. par Lion7

 Sources en rapport avec celle ci

EXECUTE /USR/BIN/ID par 0x0syscall
SAUVEGARDE DU SETUP par Guilou34
Source avec Zip V86 HOOK BIOS/DOS par patatalo

Commentaires et avis

Commentaire de patatalo le 02/08/2006 00:01:53 administrateur CS

salut,



bof bof bof, peut mieux faire...

2 appels a deux fonctions externes non incluses
ioperm n'a aucun rapport avec le bios.
pas de structure PCIBRIDGE, PCINONBRIGDE, ...
pas de fonctions pci_read_byte, pci_read_word, pci_read_dword
pas de possibilité d'ameliorer pour un micro-OS et pas grand chose en rapport avec le BIOS.

@++

Commentaire de _dune2_ le 02/08/2006 09:43:18

Salut,




Pour les 2 appels aux fonctions externes, elles sont présentes pour ne pas noyer le code dans la gestion de l'affichage sur une console pour le "printf". Ensuite, l'appel à "ioperm" est nécéssaire sous linux pour autoriser l'accés aux IOs situés à une adresse inferieure à 1024, d'où sa présence.

Je suis d'accord avec toi pour les routines pci_read_(byte|word|dword), je vais les réecrire en les isolant du reste.

Maintenant, le but de ce code est de montrer l'utilisation des IOs du Bios (enfin, il me semble ? non ?) pour acceder aux différents périphériques PCI de manière simple sans utiliser l'OS (et je ne pense pas utiliser l'OS en accédant aux IOs 0x0CFC et 0x0CF8, arrête moi si je me trompe ?).

Pour ce qui est des périphériques PCI, l'utilisation d'un bridge ou non est totalement transparent et ne change en rien l'énumération des périphériques (à ce que je me souvienne ...). Je ne vois donc pas l'interêt de gérer une structure PCIBRIDGE et PCINONBRIDGE. Peux-tu préciser le fond de ta pensé sur ce point ? Je peux avoir omis quelque chose, et je serai content d'être remis dans la bonne direction ;)

dune2.

Commentaire de _dune2_ le 02/08/2006 10:07:22

re,



Oui, tient, d'ailleur ... je viens de réaliser que 1024 correspond à 0x0400 ... or 0x0CF8 et 0x0CFC sont au-delà de 0x0400. Et pourtant, aprés plusieurs tests, il s'avère que l'appel à "ioperm" est nécéssaire pour acceder à 0x0CF8 (j'ai eu un doute suite au post de Patalo). Sinon, c'est le segfault assuré (réaction normal pour un accés à un espace d'adressage interdit).

C'est bizarre cette différence de comportement par rapport au "man" de ioperm :
[...]
DESCRIPTION
       Ioperm  positionne  les  bits  de permission d'accès du processus aux ports commençant à l'adresse from étalés sur num octets à la valeur turn_on.  L'utilisation de ioperm nécessite les privilèges de Super-User.

       Seuls les 0x3ff premiers ports d'entrée/sortie peuvent être indiques de cette manière. Pour d'autres ports, il  faut  utiliser  la fonction iopl.
[...]

Mais il est bien évident que l'appel à ioperm n'est nécéssaire qu'au bon fonctionnement sur un système linux.

dune2.

Commentaire de patatalo le 02/08/2006 10:14:46 administrateur CS

re,




c'est tout simplement qu'une enumeration ne sert pas a grand chose si elle n'est pas utilisee pas ensuite et donc pas tres utile pour un micro-OS.

l'utilisation des structures PCIBRIDGE, PCINONBRIDGE n'est peut etre pas tres utile pour une enumeration mais fait au moins une structure PCIHEADER qui est identique pour les deux, ton code sera plus clair pour tout le monde.

l'acces aux ports 0xCFC / 0xCF8 n'utilise pas le bios, il existe réellement des fonctions bios pour ce genre d'opérations donc je ne vois pas non plus le rapport avec le bios. (il existe également des fonctions bios pour faire de la sortie ecran).

utiliser l'interface linux, je ne vois toujours pas en quoi cela peut servir à un micro-OS.

c'est juste ça

@++

Commentaire de _dune2_ le 02/08/2006 10:45:18

re,



OK, je comprends mieux ta réaction :)

Pour l'utilisation sur un micro-OS, je voulais parler uniquement de la partie _pci_read_byte, _pci_read_word, _pci_read_dword, qui permet d'acceder à l'espace de configuration d'un périphérique PCI en utilisant le N° de bus, device et fonction. L'énumération des cartes PCI n'est en fait qu'un exemple concret montrant son utilisation (j'ai donc rajouté l'affichage des device_id et vendor_id aussi à titre d'exemple). Je suis tout à fait d'accord que celà n'apporte strictement rien à un micro-OS. Mais cette énumération peut servir de base pour rechercher un périphérique précis (ou une classe de périphérique) en réutilisant cette énumération et en comparant le vendor_id et device_id des cartes trouvés. Ensuite, l'accés aux autres informations de la carte, et en particulier des différentes zones d'adresses remappable de la carte (BAR0-BAR5), se fera aussi par ces fonctions de bases (sauf le remapping des zones bien entendu, qui nécéssitera une petite conversation avec l'IOMMU de manière à avoir son remapping virtuel du bus physique coté soft ;) ).

Tu as tout à fait raison pour ce qui est de la structure PCIHEADER, je vais la rajouter pour remplacer les indexes de lecture par des constantes ce qui eclaircira la lecture pour ceux qui ne connaissent pas forcément l'organisation d'un espace de configuration PCI (header commun d'ailleur au PCI, PCI-X, PCI-Express et AGP puisque tous ces bus sont énumérés au même titre et peuvent être utilisés par le même moyen).

Et merci pour la précision sur les IOs 0x0CF8 et 0x0CFC, je pensais qu'ils représentaient une sorte d'interface avec le Bios (Ecriture commande @0x0CF8 et Lecture resultat @0x0CFC).

dune2.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Interruption Bios ou Dos ? [ par Valmont ] Quand choisir d'utiliser une int Dos plutot que Bios et inversement qd il y a + ou - doublon, comme par ex. pour la lecture/ecriture de secteur sur un interruption du bios et du dos sous windows [ par eedy31 ] eedy31Salut a tous est ce que quelqu'un pourait m'aider car je ne sais pascomment faire pour utiliser les interruption du dos et du bios sous windows! interruption BIOS [ par project0 ] est ce quelqu un connais les interruptions BIOS qui arrete le systeme ( avec mise sous tension ) et celle qui permet un reboot ( redemarrage propre pa Probléme d'Affichage pour les chaines de caractères [ par HwW_Mb ] Salut les petits :-)A L'AIDE !!!!!!!!!!!!!j'ai programmé un Mini Os avec un secteur de démarrage et un noyau de 5 secteursmais je n'arrive pas à affic Cherche doc instructions asm x86... [ par akboy7015 ] Bonjour a tous...J'ai beau eu cherché sur ce site dans le forum, je ne trouve aucun lien vers une bonne doc assembleur x86 faisant la liste de toutes lire information du BIOS [ par Sogec ] J'ai un PC DellLorsque j'utilise :debug -d F000:b662je tombe sur le debut du n° de serie (sur 6 octets) du Pccomment faire pour creer un programme en le bios fonctionnement (prog) [ par chercheur de connaisance ] bonjour je voudrais savoir comment le bios traite les interruption l'idee est de pouvoir ou en cree moi meme ou encore m'en passer les sites ou les Lecture du code du bios [ par KATMAI666 ] Salut!! J'aimerais faire un programme pour lire le code du bios et le sauvegarder par la suite, le problème c'est que je ne sais pas de qu'elle manièr Serai t'il possible de faire démarer un systeme d'exploitation sans bios [ par nico20011caus ] Je voudrai faire un systeme d'exploitation sans prendre les interruption du bios sa serai tu possible? bios [ par Hardouz ] Salutestquil est possible de controller le BIOS a partir d'un prog assembleur ou bien le flasher ???merci


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales