IOmem

En complément des ports io les cartes utilisent souvent de plus grandes zone mémoire. La mémoire de la carte est alors accessible dans le même espace mémoire que la mémoire centrale.

Les ambitions ratées de portabilité entre processeurs (intel, alpha, mip, powerpc) font que cette mémoire n'est pas accessible directement mais à travers la couche HAL.

Cette mémoire est translatable dans l'espace de la mémoire virtuelle. C'est à dire que le driver ne la verra pas à son adresse réelle mais à une adresse logique.Il faut donc appeler les fonctions donnant une adresse physique et mémoriser l'adresse logique dans la zone extension pour utilisation ultérieure.

Contrairement aux ports on constate que l'adresse logique est différente de l'adresse physique.

pmode_ci_addr, l'adresse logique pourrait être utilisé directement comme pointeur mais HAL oblige et peut-être des histoires de verrouillage de bus (est-ce nécessaire qu'en multi-processeur ou également en bus master ?) font qu'il faut utiliser les fonctions

A l'utilisation il faudra utiliser les fonctions READ_REGISTER_TYPE (ex READ_REGISTER_UCHAR(extention->io_addr_nt)) et WRITE_REGISTER_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;
PHYSICAL_ADDRESS MappedAddress; // adresse mappée en mémoire
ULONG MemType; // type de mémoire 1=IO 0=Mémoire
PUCHAR io_addr_nt;

MemType = 0; // dans l'espace mémoire 
PortAddress.LowPart = ci_addr;
PortAddress.HighPart = 0;
// mapper la mémoire de la carte dans l'espace système
HalTranslateBusAddress( Isa, // type de carte ISA
        0, // bus 0
    PortAddress, // adresse physique sur la carte
    &MemType, // type mémoire pas IO
    &MappedAddress // adresse de map 
    );
// récupérer l'adresse logique de cet espace système
pmode_ci_addr = MmMapIoSpace(MappedAddress, // mémoire à mapper 
            0x10000L, // 64 ko
        (enum _MEMORY_CACHING_TYPE)FALSE); // sans bufférisation

 

Accueil ] Remonter ]