io_map_init-Kernel-Service
Zweck
Erstellt und initialisiert ein E/A-Zuordnungssegment.
Syntax
#include <sys/adspace.h>
#include <sys/vm_types.h>
io_handle_t io_map_init (io_map_ptr, page_offset, io_handle)
struct io_map *io_map_ptr;
vpn_t page_offset;
io_handle_t io_handle;
struct io_map {
int key; /* structure version number */
int flags; /* flags for mapping */
int32long64_t size; /* size of address space needed */
int bid; /* bus ID */
long long busaddr; /* bus address */
};
Beschreibung
Der io_map_init -Kernel-Service erstellt ein Segment, um eine vom Cache unterdrückte virtuelle in reale Umsetzung für die Busadressregion zu erstellen, die durch den Inhalt der Struktur io_map definiert wird. Der Parameter Flags der Struktur io_map kann verwendet werden, um die Zuordnung anzupassen, z. B. indem die Region mit dem Flag IOM_RDONLY schreibgeschützt wird.
Der io_map_init -Kernel-Service gibt ein Handle des nicht transparenten Typs io_handle_t zurück, das in zukünftigen io_map -oder io_unmap (Zuordnung aufheben) -Aufrufen verwendet wird. Alle Services, die die von io_map_init zurückgegebene io_kennung verwenden, müssen die Kennung des letzten Aufrufs verwenden. Die Verwendung einer alten Kennung ist ein Programmierfehler.
Der Typparameter Vpn_T stellt den Offset der virtuellen Seitennummer dar, damit der Aufrufende angeben kann, wo im virtuellen Segment diese Region zugeordnet werden soll. Der Offset darf nicht mit einer vorherigen Zuordnung im Segment in Konflikt stehen. Der Aufrufende sollte den am häufigsten aufgerufenen und leistungskritischen E/A-Bereich bei Vpn_T Offset 0 im Segment zuordnen. Dies ist darauf zurückzuführen, dass die nachfolgenden io_map -Aufrufe, die dieses io_kennung verwenden, eine effektive Adresse zurückgeben, die den Anfang des Segments darstellt (d. h. Seitenoffset 0). Der Einheitentreiber ist für die Verwaltung verschiedener Offsets im Segment verantwortlich. Eine einzelne Busspeicheradressseite kann mehrmals mit unterschiedlichen Vpn_T -Offsets innerhalb des Segments zugeordnet werden.
Der Parameter io_handle_t ist hilfreich, wenn der Aufrufende eine neue Zuordnung an ein vorhandenes Segment anhängen möchte. Für die Ersterstellung eines neuen E/A-Segments muss dieser Parameter NULL sein. Für angehängte Zuordnungen zu demselben Segment ist dies der Parameter io_handle_t , der vom letzten erfolgreichen io_map_init -Aufruf zurückgegeben wurde. Wenn die Zuordnung aus irgendeinem Grund fehlschlägt (Offset steht in Konflikt mit vorheriger Zuordnung oder kein Platz mehr im Segment), wird NULL zurückgegeben. In diesem Fall ist die vorherige io_handle_t weiterhin gültig. Bei erfolgreicher Ausführung sollte die zurückgegebene io_handle_t in allen zukünftigen Aufrufen verwendet werden. Auf diese Weise kann ein Einheitentreiber mehrere E/A-Adressräume eines einzelnen Adapters innerhalb eines einzelnen virtuellen Adresssegments verwalten, sodass der Treiber nur eine einzige Zuordnung vornehmen muss ( io_map), um die Adressierbarkeit für alle Zuordnungen zu erhalten.
Parameter
| Element | Beschreibung |
|---|---|
| io_map_ptr | Zeiger auf die io_map -Struktur, die den zuzuordnenden Adressbereich beschreibt. |
| Seitenoffset | Relative Seitenposition, an der die angegebene Region dem Segment der virtuellen Adresse zugeordnet werden soll |
| io_kennung | Für den ersten Aufruf sollte dieser Parameter NULL sein. Beim Hinzufügen zu einer vorhandenen Zuordnung ist dieser Parameter der Parameter io_kennung , der bei einem vorherigen erfolgreichen Aufruf von io_map_initempfangen wurde. |
Ausführungsumgebung
Der io_map_init -Kernel-Service kann nur aus der Prozessumgebung aufgerufen werden.
Rückgabewerte
| Element | Beschreibung |
|---|---|
| io_handle_t | Eine nicht transparente Kennung für das zugeordnete E/A-Segment im virtuellen Speicher, die in nachfolgenden Aufrufen dieses Service verwendet werden muss. |
| NULL | Erstellen oder Anhängen der Zuordnung fehlgeschlagen. |