Pemetaan Bus-Relative Alamat ke Alamat Virtual
Beberapa prosesor menerapkan memori terpisah dan ruang alamat I/O, sementara prosesor lain tidak. Karena perbedaan platform perangkat keras ini, mekanisme yang digunakan driver untuk mengakses I/O- atau sumber daya perangkat residen memori berbeda dari platform ke platform.
Driver meminta I/O perangkat dan sumber daya memori sebagai respons terhadap IRP IRP_MN_QUERY_RESOURCE_REQUIREMENTS manajer PnP. Bergantung pada arsitektur perangkat keras, HAL dapat menetapkan sumber daya I/O di ruang I/O atau di ruang memori, dan dapat menetapkan sumber daya memori di ruang I/O atau di ruang memori.
Jika HAL menggunakan ruang memori relatif bus untuk mengakses sumber daya perangkat (seperti pendaftaran perangkat), driver harus memetakan ruang I/O ke dalam memori virtual sehingga dapat mengakses sumber daya ini. Driver dapat menentukan apakah sumber daya adalah I/O- atau memory-resident dengan memeriksa sumber daya yang diterjemahkan yang diteruskan ke driver oleh manajer PnP saat startup perangkat. Jika HAL menggunakan ruang I/O, tidak diperlukan pemetaan.
Secara khusus, ketika driver menerima permintaan IRP_MN_START_DEVICE, driver harus memeriksa struktur di IrpSp-Parameters.StartDevice.AllocatedResources> dan IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated>, yang masing-masing menggambarkan mentah (relatif bus) dan sumber daya yang diterjemahkan, yang telah ditetapkan manajer PnP ke perangkat. Driver harus menyimpan salinan setiap daftar sumber daya di ekstensi perangkat sebagai bantuan untuk penelusuran kesalahan.
Daftar sumber daya dipasangkan CM_RESOURCE_LIST struktur, di mana setiap elemen daftar mentah sesuai dengan elemen yang sama dari daftar yang diterjemahkan. Misalnya, jika AllocatedResources.List[0] menjelaskan rentang port I/O mentah, AllocatedResourcesTranslated.List[0] menjelaskan rentang yang sama setelah terjemahan. Setiap sumber daya yang diterjemahkan mencakup alamat fisik dan jenis sumber daya.
Jika driver diberi sumber daya memori yang diterjemahkan (CmResourceTypeMemory), driver harus memanggil MmMapIoSpace untuk memetakan alamat fisik ke alamat virtual tempat ia dapat mengakses pendaftaran perangkat. Agar pengemudi beroperasi secara independen platform, driver harus memeriksa setiap sumber daya yang dikembalikan dan diterjemahkan dan memetakannya, jika perlu.
Driver mode kernel harus mengambil langkah-langkah berikut, sebagai respons terhadap permintaan IRP_MN_START_DEVICE, untuk memastikan akses ke semua sumber daya perangkat
Salin IrpSp-Parameters.StartDevice.AllocatedResources> ke ekstensi perangkat.
Salin IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated> ke ekstensi perangkat.
Dalam perulangan, periksa setiap elemen deskriptor di AllocatedResourcesTranslated. Jika jenis sumber daya deskriptor adalah CmResourceTypeMemory, panggil MmMapIoSpace, melewati alamat fisik dan panjang sumber daya yang diterjemahkan.
Ketika driver menerima permintaan IRP_MN_STOP_DEVICE atau IRP_MN_REMOVE_DEVICE dari manajer PnP, driver harus merilis pemetaan dengan memanggil MmUnmapIoSpace dalam perulangan serupa. Driver juga harus memanggil MmUnmapIoSpace jika harus gagal IRP_MN_START_DEVICE permintaan .
Jenis sumber daya mentah menunjukkan rutinitas akses HAL mana yang harus dipanggil driver (READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXXX, WRITE_PORT_XXX). Sebagian besar driver tidak perlu memeriksa daftar sumber daya mentah untuk menentukan rutinitas mana yang akan digunakan, karena driver itu sendiri meminta sumber daya atau penulis driver tahu jenis yang diperlukan mengingat sifat perangkat keras perangkat.
Untuk sumber daya di ruang I/O (CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeDma), driver harus menggunakan 32 bit berurutan rendah dari alamat fisik yang dikembalikan untuk mengakses sumber daya perangkat, misalnya, melalui rutinitas HAL baca dan tulis READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX .