Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 16.5. Краткий обзор

Оглавление
Английский оригинал Перевод на русский

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

16.5. Краткий обзор

hardorsoft 26.10.10 в 00:51

0

#include <linux></linux>fs.h>
int register_blkdev(unsigned int major, const char *name);
int unregister_blkdev(unsigned int major, const char *name);

hardorsoft 26.10.10 в 00:52

0

Функция register_blkdev регистрирует драйвер блочного
устройства в ядре, и, опционально, выделяет старший номер. Отмена
регистрации выполняется функцией unregister_blkdev.

hardorsoft 26.10.10 в 00:52

0

struct block_device_operations
Структура содержит большинство
устройства.

hardorsoft 26.10.10 в 00:52

0

#include <linux></linux>genhd.h>
struct gendisk;
Структура описывает одно блочное устройство.

hardorsoft 26.10.10 в 00:52

0

struct gendisk *alloc_disk(int minors);
void add_disk(struct gendisk *gd);
Функции для выделения структуры gendisk, и для передачи ее
системе.

hardorsoft 26.10.10 в 00:53

0

void set_capacity(struct gendisk *gd, sector_t sectors);
Устанавливает емкость устройства в 512-байтных секторах для
структуры gendisk.

hardorsoft 26.10.10 в 00:53

0

void add_disk(struct gendisk *gd);
Добавляет диск в ядро. Как только вызывается эта функция, методы
вашего устройства могут быть использованы ядром.

hardorsoft 26.10.10 в 00:53

0

int check_disk_change(struct block_device *bdev);
Функция ядра, проверяет смену носителя в устройстве и, если она
произошла, производит необходимые действия.

hardorsoft 26.10.10 в 00:53

0

#include <linux></linux>blkdev.h>
request_queue_t blk_init_queue(request_fn_proc *request, spinlock_t
*lock);
void blk_cleanup_queue(request_queue_t *);
Функции выполняют создание или удаление очереди запросов.

hardorsoft 26.10.10 в 00:54

0

struct request *elv_next_request(request_queue_t *queue);
void end_request(struct request *req, int success);
Функции elv_next_request получает следующий запрос из очереди. end_request может использоваться в простых драйверах для пометки
выполнения запроса или его части.

hardorsoft 26.10.10 в 00:54

0

void blkdev_dequeue_request(struct request *req);
void elv_requeue_request(request_queue_t *queue, struct request
*req);
Функции для удаления запроса из очереди, и помещения его
обратно.

hardorsoft 26.10.10 в 00:54

0

void blk_stop_queue(request_queue_t *queue);
void blk_start_queue(request_queue_t *queue);
Если вам необходимо предотвратить будущие вызовы метода
request, вызовете функцию blk_stop_queue. После выполенения
blk_start_queue метод request будет снова вызываться.

hardorsoft 26.10.10 в 00:55

0

void blk_queue_bounce_limit(request_queue_t *queue, u64 dma_addr);
void blk_queue_max_sectors(request_queue_t *queue, unsigned short
max);
void blk_queue_max_phys_segments(request_queue_t *queue, unsigned
short max);
void blk_queue_max_hw_segments(request_queue_t *queue, unsigned
short max);
void blk_queue_max_segment_size(request_queue_t *queue, unsigned
int max);
blk_queue_segment_boundary(request_queue_t *queue, unsigned long
mask);
void blk_queue_dma_alignment(request_queue_t *queue, int mask);
void blk_queue_hardsect_size(request_queue_t *queue, unsigned short
max);
Функции устанавливают различные параметры очереди,
управляющие созданием запросов. Параметры описаны в разделе
«Функции управления очередью»

hardorsoft 26.10.10 в 00:55

0

#include <linux></linux>bio.h>
struct bio;
Низкоуровневая структура, являющаяся частью запроса блочного
ввода-вывода.

hardorsoft 26.10.10 в 00:55

0

bio_sectors(struct bio *bio);
bio_data_dir(struct bio *bio);
Макросы предоставляют размер и направление передачи данных в
структуре bio.

hardorsoft 26.10.10 в 00:55

0

bio_for_each_segment(bvec, bio, segno);
Макрос псевдоуправления, используется в качестве
проходящего по всем сегментам структуры bio.

hardorsoft 26.10.10 в 00:56

0

char *__bio_kmap_atomic(struct bio *bio, int i, enum km_type type);
void __bio_kunmap_atomic(char *buffer, enum km_type type);
Функция __bio_kmap_atomic может быть использована для создания
виртуального адреса сегмента, полученного из структуры bio.
Отмена отображения должно производится __bio_kunmap_atomic.

hardorsoft 26.10.10 в 00:56

0

struct page *bio_page(struct bio *bio);
int bio_offset(struct bio *bio);
int bio_cur_sectors(struct bio *bio);
char *bio_data(struct bio *bio);
char *bio_kmap_irq(struct bio *bio, unsigned long *flags);
void bio_kunmap_irq(char *buffer, unsigned long *flags);
Множество макросов, предоставляющих доступ к текущему
сегменту структуры bio.

hardorsoft 26.10.10 в 00:56

0

void blk_queue_ordered(request_queue_t *queue, int flag);
int blk_barrier_rq(struct request *req);
Выполните функцию blk_queue_ordered, если ваш драйвер
реализует экранирование запросов. Макрос blk_barrier_rq
возвращает не нулевое значение, если текущий запрос
экранируется.

hardorsoft 26.10.10 в 00:56

0

int blk_noretry_request(struct request *req);
Этот макрос возвращает не нулевое значение, если данный запрос
не может выполняться повторно в случае ошибки.

hardorsoft 26.10.10 в 00:57

0

int end_that_request_first(struct request *req, int success, int
count);
void end_that_request_last(struct request *req);
Функция end_that_request_first используется для индикации
завершения части запроса. Когда запрос выполнен полностью,
функция возвращает ноль, и запрос может быть передан в
end_that_request_last.

hardorsoft 26.10.10 в 00:57

0

rq_for_each_bio(bio, request)
Еще один макрос. Позволяет пройти по всем bio, составляющим
запрос request.

hardorsoft 26.10.10 в 00:57

0

int blk_rq_map_sg(request_queue_t *queue, struct request *req, struct scatterlist
*list);
Заполняет список сегментов scatterlist информацией для
отображения буферов, составляющих запрос, для передачи ПДП.

hardorsoft 26.10.10 в 00:57

0

typedef int (make_request_fn) (request_queue_t
*bio);
Прототип функции make_request.

hardorsoft 26.10.10 в 00:57

0

void bio_endio(struct bio *bio, unsigned int bytes, int error);
Сигнал выполнения для данного bio. Функция используется, только
если ваш драйвер получает bio непосредственно от уровня блочных
устройств, через функцию make_request.

hardorsoft 26.10.10 в 00:58

0

request_queue_t *blk_alloc_queue(int flags);
void blk_queue_make_request(request_queue_t *queue, make_request_fn
*func);
Функция blk_alloc_queue используется для выделения очереди
запросов которая используется с пользовательской функцией make_request. Эта функция
blk_queue_make_request.

hardorsoft 26.10.10 в 00:59

0

typedef int (prep_rq_fn) (request_queue_t *queue, struct request
*req);
void blk_queue_prep_rq(request_queue_t *queue, prep_rq_fn *func);
Прототип функции предварительной обработки команд и функция
ее настройки. Функции предварительной обработки команд может
быть использована для подготовки аппаратного обеспечения, перед
передачей запроса в функцию request.

hardorsoft 26.10.10 в 00:59

0

int blk_queue_init_tags(request_queue_t *queue, int depth, struct
blk_queue_tag *tags);
int blk_queue_resize_tags(request_queue_t *queue, int new_depth);
int blk_queue_start_tag(request_queue_t *queue, struct request
*req);
void blk_queue_end_tag(request_queue_t *queue, struct request
*req);
struct request *blk_queue_find_tag(request_queue_t *qeue, int tag);
void blk_queue_invalidate_tags(request_queue_t *queue);
Функции поддержки драйвера использующего пометку команд
очереди (TCQ).

hardorsoft 26.10.10 в 00:59

0
Минутку...