Les ios sont un héritage du 8086. Le 8086 accède avait deux zone d'adresse l'une pour la mémoire, l'autre réduite (64 ko) pour les entrées sortie les IO. Il y a belle lurette que les cartes ne se contentent plus de cet espace mais elle continuent à en utiliser quelques octets. Les ambitions ratées de portabilité entre processeurs (intel, alpha, mip, powerpc) font que les io ne sont pas accessibles directement mais à travers la couche HAL. Les IO sont supposées translatables. Il faut donc appeler les fonctions en donnant une adresse physique et mémoriser l'adresse logique dans la zone extension pour utilisation ultérieure. Dans la pratique on constate sur Intel qu'NT nous renvoie la valeur fournie. A l'utilisation il faudra utiliser les fonctions READ_PORT_TYPE (ex READ_PORT_UCHAR(extention->io_addr_nt)) et WRITE_PORT_TYPE qui doivent utiliser les bonnes vielles fonctions inp et outp avec peut-être du code de synchronisation de bus. Si vous voulez gérer les conflits entre carte il vous faudra aussi déclarer les ressources utilisées Voici le code de translation : PHYSICAL_ADDRESS PortAddress; // faire de même pour les io |
|