Зарезервировать системный ресурс для процесса
#include <sys/rsrcdbmgr.h>#include <sys/rsrcdbmsg.h>int rsrcdbmgr_attach( rsrc_request_t *list,int count );
libc
Менеджер базы данных ресурсов выделяет и отслеживает системные ресурсы, то есть управляет этими ресурсами. В настоящее время отслеживаются следующие системные ресурсы:
Основные и вспомогательные номера устройств обрабатываются отдельными функциями rsrcdbmgr_devno_attach() и rsrcdbmgr_devno_detach().
Драйверы могут использовать две основные функции для связи с базой данных ресурсов:
Функция rsrcdbmgr_attach() резервирует диапазон ресурсов из базы данных доступных ресурсов для процесса. Другие процессы не могут зарезервировать этот диапазон ресурсов до тех пор, пока ресурс не будет возвращен системе (обычно с помощью вызова rsrcdbmgr_detach()). Запрошенные ресурсы возвращаются в list из структур rsrc_request_t с заполненными полями start и end. Количество запрошенных ресурсов указывается в count.
Резервирование ресурсов не дает доступа к ним; по-прежнему придется использовать mmap(), InterruptAttach() либо другие средства. |
Когда окончании работы с ресурсом, необходимо вернуть его в систему. Самый простой способ вернуть ресурс - вызвать rsrcdbmgr_detach() с теми же start, end и типом (через поле flags), которые были выданы для ресурса.
При запуске системы, специальные программы, которые знают, как проверять аппаратное обеспечение, вызывают rsrcdbmgr_create() для регистрации оборудования в базе данных ресурсов. В следующих примерах такое заполнение не выполняется, поэтому они завершатся ошибкой EINVAL . |
Пример 1
/** Request one DMA Channel, with length 1, from the* entire range of available DMA channel resources.*/#include <stdio.h>#include <sys/rsrcdbmgr.h>#include <sys/rsrcdbmsg.h>int main( int argc, char **argv ){int count;rsrc_request_t req;memset( &req, 0, sizeof( req ) );req.length = 1;req.flags = RSRCDBMGR_DMA_CHANNEL;count = 1;if ( rsrcdbmgr_attach( &req, count) == -1 ){perror( "Problem attaching to resource " );exit( 1 );}printf( "You can use DMA channel 0x%llx \n", req.start );.../* Do something with the acquired resource */.../* To return the resource to the database: */if ( rsrcdbmgr_detach( &req, count ) == -1 ){perror( "Problem detaching resource \n" );exit( 1 );}return (0);}
Пример 2
/** Request memory that's 4-byte aligned* and has a length of 50.*/#include <stdio.h>#include <sys/rsrcdbmgr.h>#include <sys/rsrcdbmsg.h>int main( int argc, char **argv ){int count;rsrc_request_t req;memset( &req, 0, sizeof( req ) );req.align = 4;req.length = 50;req.flags = RSRCDBMGR_FLAG_ALIGN | RSRCDBMGR_MEMORY;count = 1;if ( rsrcdbmgr_attach( &req, count ) == -1 ){perror( "Problem attaching to resource " );exit( 1 );}printf( "You can use memory from 0x%llx 0x%llx inclusive. \n",req.start, req.end );.../* Do something with the acquired resource */.../* To return the resource to the database: */if ( rsrcdbmgr_detach( &req, count ) == -1 ){perror( "Problem detaching resource \n" );exit( 1 );}return(0);}
Пример 3
/** Request two resources:* I/O port 0 and an IRQ in the range 10-12* from the available resources.*/#include <stdio.h>#include <sys/rsrcdbmgr.h>#include <sys/rsrcdbmsg.h>int main( int argc, char **argv ){int count;rsrc_request_t req[2];memset( req, 0, 2 * sizeof( *req ) );req[0].start = 0;req[0].end = 0;req[0].length = 1;req[0].flags = RSRCDBMGR_FLAG_RANGE | RSRCDBMGR_IO_PORT;req[1].start = 10;req[1].end = 12;req[1].length = 1;req[1].flags = RSRCDBMGR_FLAG_RANGE | RSRCDBMGR_IRQ;count = 2;if ( rsrcdbmgr_attach( req, count ) == -1 ){perror( "Problem attaching to resource " );exit( 1 );}printf( "You can use io-port 0x%llx \n", req[0].start );printf( "You can use irq 0x%llx \n", req[1].start );.../* Do something with the acquired resource */.../* To return the resource to the database: */if ( rsrcdbmgr_detach( req, count ) == -1 ){perror( "Problem detaching resource \n" );exit( 1 );}return(0);}
Пример 4
В этом примере для типа ресурса используются имена вместо констант:
rsrc_alloc_t alloc;rsrc_request_t ralloc;/* Create a new resource */memset( &alloc, 0, sizeof( alloc ) );alloc.start = 0x20000000;alloc.end = 0x27ffffff;alloc.flags = RSRCDBMGR_FLAG_NAME;alloc.name = "io/Port_S0";printf( "Allocing %p %p %p \n", &alloc, &alloc.name, alloc.name );if ( rsrcdbmgr_create( &alloc, 1 ) == -1 ){perror( "create() 1 failed \n" );return (1);}/* Attach to the new resource, any range with 32 length */memset( &ralloc, 0, sizeof( ralloc ) );ralloc.start = ralloc.end = 0;ralloc.length = 32;ralloc.flags = RSRCDBMGR_FLAG_NAME;ralloc.name = "io/Port_S0";if ( rsrcdbmgr_attach( &ralloc, 1 ) == -1 ){perror( "attach() 2 failed \n" );return (1);}/* Do something with the resource */
ЗОСРВ «Нейтрино»
rsrc_request_t, rsrcdbmgr_create(), rsrcdbmgr_detach(), rsrcdbmgr_destroy(), rsrcdbmgr_devno_attach(), rsrcdbmgr_devno_detach(), rsrcdbmgr_query_name()
Предыдущий раздел: Описание API системной библиотеки