rsrcdbmgr_attach()

Зарезервировать системный ресурс для процесса

Прототип:

#include <sys/rsrcdbmgr.h>
#include <sys/rsrcdbmsg.h>
int rsrcdbmgr_attach( rsrc_request_t *list,
int count );

Аргументы:

list
Массив структур rsrc_request_t, описывающих ресурсы, которые требуется зарезервировать.
count
Количество элементов массива.

Библиотека:

libc

Описание:

Менеджер базы данных ресурсов выделяет и отслеживает системные ресурсы, то есть управляет этими ресурсами. В настоящее время отслеживаются следующие системные ресурсы:

Также возможно отслеживать и получать доступ и к произвольно определенным ресурсам, используя строковое имя в качестве идентификатора.

Основные и вспомогательные номера устройств обрабатываются отдельными функциями rsrcdbmgr_devno_attach() и rsrcdbmgr_devno_detach().

Драйверы могут использовать две основные функции для связи с базой данных ресурсов:

Функция rsrcdbmgr_attach() резервирует диапазон ресурсов из базы данных доступных ресурсов для процесса. Другие процессы не могут зарезервировать этот диапазон ресурсов до тех пор, пока ресурс не будет возвращен системе (обычно с помощью вызова rsrcdbmgr_detach()). Запрошенные ресурсы возвращаются в list из структур rsrc_request_t с заполненными полями start и end. Количество запрошенных ресурсов указывается в count.


Note: Резервирование ресурсов не дает доступа к ним; по-прежнему придется использовать mmap(), InterruptAttach() либо другие средства.

Когда окончании работы с ресурсом, необходимо вернуть его в систему. Самый простой способ вернуть ресурс - вызвать rsrcdbmgr_detach() с теми же start, end и типом (через поле flags), которые были выданы для ресурса.

Возвращаемое значение:

EOK
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EAGAIN
Запрос ресурса не может быть заполнен.
EINVAL
Некорректный аргумент.
ENOMEM
Недостаточно памяти для размещения внутренних структур данных.

Примеры:


Note: При запуске системы, специальные программы, которые знают, как проверять аппаратное обеспечение, вызывают 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 системной библиотеки