вторник, 7 декабря 2010 г.

6/7 Краткая справка

6/7 Краткая справка

Эта глава представляет следующие символы и заголовочные файлы:

#include
Объявляет все макросы, которые используются для определения команд ioctl. В настоящее время он подключается с помощью .
_IOC_NRBITS
_IOC_TYPEBITS
_IOC_SIZEBITS
_IOC_DIRBITS

Число бит, доступное для различных битовых полей команд ioctl. Есть также ещё четыре макроса, которые определяют MASKи и четыре, определяющие SHIFTы, но они в основном для внутреннего пользования. _IOC_SIZEBITS является важным значением для проверки, так как оно меняется в зависимости от архитектуры.

_IOC_NONE
_IOC_READ
_IOC_WRITE

Возможные значения битового поля "направление". "Чтение" и "Запись" являются разными битами и могут быть сложены командой OR (ИЛИ) для указания чтения/записи. Значения базируются на 0.

_IOC(dir,type,nr,size)
_IO(type,nr)
_IOR(type,nr,size)
_IOW(type,nr,size)
_IOWR(type,nr,size)

Макросы, используемые для создания команд ioctl.

_IOC_DIR(nr)
_IOC_TYPE(nr)
_IOC_NR(nr)
_IOC_SIZE(nr)

Макросы, которые используются для декодирования команд. В частности, _IOC_TYPE(nr) является комбинацией по ИЛИ для _IOC_READ и _IOC_WRITE.

#include
int access_ok(int type, const void *addr, unsigned long size);

Проверяет, что указатель в пользовательском пространстве является верным. access_ok возвращает ненулевое значение, если доступ будет разрешён.

VERIFY_READ
VERIFY_WRITE

Возможные значения аргумента type в access_ok. VERIFY_WRITE является надстройкой VERIFY_READ.

#include
int put_user(datum,ptr);
int get_user(local,ptr);
int __put_user(datum,ptr);
int __get_user(local,ptr);

Макросы, которые используются для хранения и получения данных в или из пространства пользователя. Передаваемое количество байт зависит от sizeof(*ptr). Обычные версии сначала вызывают access_ok, в то время как специальные версии (__put_user и __get_user) предполагают, что access_ok уже вызывалась

#include

Определяет различные символы CAP_, описывающие какие возможности доступа может иметь процесс пользовательского пространства.

int capable(int capability);

Возвращает ненулевое значение, если этот процесс имеет данное разрешение.

#include
typedef struct { /* ... */ } wait_queue_head_t;
void init_waitqueue_head(wait_queue_head_t *queue);
DECLARE_WAIT_QUEUE_HEAD(queue);

Определяет тип для очереди ожидания Linux. wait_queue_head_t должен быть явно проинициализирован либо init_waitqueue_head во время выполнения, либо DECLARE_WAIT_QUEUE_HEAD во время компиляции.

void wait_event(wait_queue_head_t q, int condition);
int wait_event_interruptible(wait_queue_head_t q, int condition);
int wait_event_timeout(wait_queue_head_t q, int condition, int time);
int wait_event_interruptible_timeout(wait_queue_head_t q, int condition, int time);

Помещает процесс в сон в данной очереди, пока данное condition (условие) оценивается как истинное значение.

void wake_up(struct wait_queue **q);
void wake_up_interruptible(struct wait_queue **q);
void wake_up_nr(struct wait_queue **q, int nr);
void wake_up_interruptible_nr(struct wait_queue **q, int nr);
void wake_up_all(struct wait_queue **q);
void wake_up_interruptible_all(struct wait_queue **q);
void wake_up_interruptible_sync(struct wait_queue **q);

Пробуждает процессы, которые являются спящими в очереди q. Форма _interruptible пробуждает только прерываемые процессы. Как правило, пробуждается только один ожидающий эксклюзивно, но это поведение можно изменить с помощью форм _nr или _all. Версия _sync не переключает процессор перед возвратом.

#include
set_current_state(int state);
Устанавливает состояние выполнения для текущего процесса. TASK_RUNNING означает, что он готов к запуску, а состояниями сна являются TASK_INTERRUPTIBLE и TASK_UNINTERRUPTIBLE.
void schedule(void);
Выбирает работающий процесс из очереди выполнения. Выбранный процесс может быть current (текущим) или любым другим.
typedef struct { /* ... */ } wait_queue_t;
init_waitqueue_entry(wait_queue_t *entry, struct task_struct *task);
Тип wait_queue_t используется для помещения процесса в очередь ожидания.
void prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state);
void prepare_to_wait_exclusive(wait_queue_head_t *queue, wait_queue_t *wait, int state);
void finish_wait(wait_queue_head_t *queue, wait_queue_t *wait);

Вспомогательные функции, которые могут быть использованы в коде для ручного управления сном.

void sleep_on(wiat_queue_head_t *queue);
void interruptible_sleep_on(wiat_queue_head_t *queue);

Устаревшие и осуждаемые для использования функции, которые безоговорочно помещают текущий процесс в сон.

#include
void poll_wait(struct file *filp, wait_queue_head_t *q, poll_table *p)

Помещает текущий процесс в очередь ожидания сразу, без планировщика. Предназначена для использования методом poll драйверами устройств.

int fasync_helper(struct inode *inode, struct file *filp, int mode, struct fasync_struct **fa);

"Помощник" для реализации метода устройства fasync. Аргумент mode является тем же значением, которое передаётся в метод, а fa указывает на зависимую от устройства fasync_struct *.

void kill_fasync(struct fasync_struct *fa, int sig, int band);

Если драйвер поддерживает асинхронное уведомление, эта функция может быть использована для отправки сигнала процессам, зарегистрированным в fa.

int nonseekable_open(struct inode *inode, struct file *filp);
loff_t no_llseek(struct file *file, loff_t offset, int whence);

nonseekable_open
должна быть вызвана в методе open любого устройства, которое не поддерживает произвольный доступ. Такие устройства должны также использовать no_llseek как свой метод llseek.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.