реклама на сайте
подробности

 
 
> Драйвер блочного устройства в Linux
3.14
сообщение Oct 25 2005, 20:28
Сообщение #1


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609



Отзовитесь плиз, кто писал драйвер блочного устройства под линух.
С символьным относительно быстро разобрался, а вто с блочным cranky.gif
Примеры в uClinux не особо помогают, пока даже не могу вычленить нужные части.


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
3.14
сообщение Oct 30 2005, 11:14
Сообщение #2


Их либе дих ...
******

Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609



Мне вот еще что не понятно.
В примере с символьным драйвером обращение к устройству сводится к вызову функций чтения/записи которые прописаны в структуре fosp, соответсвенно когда обращаюсь к устройству через read/write и т.п. то передаю указатель на буфер обмена.
В драйвере блочного устройства я не пойму как передается указатель на буфер обмена. В примере, осуществляется такое объявление функции запроса
Код
...
static XStatus(*req_fnc) (XSysAce * InstancePtr, u32 StartSector,
    int NumSectors, u8 * BufferPtr);
...
static void xsysace_do_request(request_queue_t * q)
{
    if (req_active)
 return;

    for (;;) {
 INIT_REQUEST;

 switch (CURRENT->cmd) {
 case READ:
     req_str = "reading";
     req_fnc = XSysAce_SectorRead;
     break;
 case WRITE:
     req_str = "writing";
  req_fnc = XSysAce_SectorWrite;
     break;
 default:
     printk(KERN_CRIT "%s: unknown request %d.\n",
         DEVICE_NAME, CURRENT->cmd);
     end_request(0);    
     continue;      
 }
 req_active = 1;
 wake_up(&req_wait);
 return;
    }
}
Т.е., например вызывается XSysAce_SectorRead, которая заполняет BufferPtr относящийся к структуре InstancePtr, но вот как этот BufferPtr передается приложению пользователя cranky.gif


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
amw
сообщение Nov 1 2005, 17:01
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



В ядрах 2.6 есть еще так называемые шедулеры ввода/вывода которые занимаются планированием очереди, предсказанием номеров секторов, которые могут потребоватся в следующей оперции чтения/записи и много другого.
Как в 2.4 с этим - я не знаю, но стоит посмотреть есть ли в исходниках ядра файл с именем elevator.c (ну или похожим). Если есть, то стоит его изучить, хотя это занятие неблагодарное. После изучения этого файла (и сопутствующих ему) появится понимание (а может наоборот - пропадет вовсе smile.gif), но использовать это понимание на практике будет затруднительно.

Драйвер блочного устройства знает как выполнять чтение/запись секторов, но не знает когда это происходит.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
makc
сообщение Nov 1 2005, 17:21
Сообщение #4


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(amw @ Nov 1 2005, 20:01)
В ядрах 2.6 есть еще так называемые шедулеры ввода/вывода которые занимаются планированием очереди, предсказанием номеров секторов, которые могут потребоватся в следующей оперции чтения/записи и много другого.
Как в 2.4 с этим - я не знаю, но стоит посмотреть есть ли в исходниках ядра файл с именем elevator.c (ну или похожим).
*


В 2.4 элеватор и все, что с ним связано тоже есть. Немного не в том виде, что в 2.6, но есть.

Цитата
Если есть, то стоит его изучить, хотя это занятие неблагодарное. После изучения этого файла (и сопутствующих ему) появится понимание (а может наоборот - пропадет вовсе smile.gif), но использовать это понимание на практике будет затруднительно.


Изучать его особенного интереса нет, если только нет цели реализовать пакетный режим обработки запросов ввода-вывода. У меня однажды была такая задача - устройство быстро работало если с ним общаться большими наборами последовательных блоков, а на единичных запросах все очень сильно тормозило. В 2.4 элеватор отлично справлялся с запрошенной группировкой запросов, а вот для 2.2 мне пришлось писать свое подобие элеватора и очереди запросов ввода-вывода.

Цитата
Драйвер блочного устройства знает как выполнять чтение/запись секторов, но не знает когда это происходит.


Когда именно - не знает, но у него есть возможность поддерживать свою очередь запросов на ввод-вывод. Это дает большую свободу.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
amw
сообщение Nov 2 2005, 14:13
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(makc @ Nov 1 2005, 20:21)
Цитата
Драйвер блочного устройства знает как выполнять чтение/запись секторов, но не знает когда это происходит.


Когда именно - не знает, но у него есть возможность поддерживать свою очередь запросов на ввод-вывод. Это дает большую свободу.
*


А можна с этого места чуть подробнее. Я не особо крутой спец по блочным устройствам, а сейчас как раз занимаюсь повышением поизводительности блочного драйвера. Я не претендую на полное изложение здесь, но может какая нибудь ссылка поконкретнее есть?
А то ковыряюсь по исходникам в изучении этой самой очереди - времени уходит прорва, а результат мизерный.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
makc
сообщение Nov 2 2005, 16:37
Сообщение #6


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Цитата(amw @ Nov 2 2005, 17:13)
А можна с этого места чуть подробнее.
*


Можно. smile.gif

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


Книга Linux Device Drivers 2nd edition, CH12, P. Handling Requests: The Detailed View.

Цитата
А то ковыряюсь по исходникам в изучении этой самой очереди - времени уходит прорва, а результат мизерный.


Это точно. Тем более, что смысла изучать эту очередь мало - она основана на самых общих принципах организации блочных запросов.

Что касается "ручного" создания своей очереди, то это довольно просто.
1. Отказаться от использования в функции-обработчике запросов драйвера блочного устройства макросов типа INIT_REQUEST и ему подобных. Эти макросы подходят лишь для очень простых драйверов, для более сложных (о которых и идет речь) нужно работу этих макросов выполнять самим.
2. С помощью функции blkdev_entry_next_request извлекаете из системной очереди запросов следующий запрос. (По очереди можно перемещаться с помощью функций blkdev_next_request и blkdev_prev_request).
3. Исключаете запрос из системной очереди с помощью функции blkdev_dequeue_request.
4. Добавляете запрос в свою внутреннюю очередь, которой управляете оптимальным для устройства образом. (Я хранил очередь как связанный список и пытался группировать последовательные пакеты запросов, избегая при этом увеличения длины очереди больше максимальной величины).
5. Просматриваете внутреннюю очередь на предмет того, какие запросы теперь можно обработать.
6. Если есть запросы для обработки - выполняете обработку отдельных блоков в внутри запросов (обработку блока подтверждаете с помощью функции b_end_io блока) и завершаете обработку запросов с помощью функции blkdev_release_request для каждого запроса.
7. Все повторяется заново, пока в системной очереди есть запросы.

Только не забудьте про глобальный спинлок io_request_lock, который нужно захватывать во избежание нарушения структуры системной очереди.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 3.14   Драйвер блочного устройства в Linux   Oct 25 2005, 20:28
- - makc   Цитата(3.14 @ Oct 25 2005, 23:28)Отзовитесь п...   Oct 26 2005, 04:05
- - amw   Цитата(3.14 @ Oct 25 2005, 23:28)Отзовитесь п...   Oct 26 2005, 15:23
- - 3.14   Нижесказанное касается uClinux, ядро 2.4. Начал я ...   Oct 26 2005, 20:35
|- - gab   Цитата(3.14 @ Oct 26 2005, 23:35)Нижесказанно...   Oct 27 2005, 01:35
|- - makc   Цитата(3.14 @ Oct 26 2005, 23:35)Нижесказанно...   Oct 27 2005, 06:23
|- - amw   Цитата(makc @ Oct 27 2005, 09:23)Цитата(3.14 ...   Oct 28 2005, 09:13
|- - amw   Цитата(makc @ Oct 27 2005, 09:23)У меня есть ...   Oct 28 2005, 12:03
- - 3.14   Всем спасибо, с мертвой точки наконец сдвинулся. К...   Oct 29 2005, 12:13
|- - amw   Цитата(3.14 @ Oct 29 2005, 15:13)Всем спасибо...   Nov 1 2005, 16:33
|- - amw   Цитата(3.14 @ Oct 30 2005, 14:14)Мне вот еще ...   Nov 1 2005, 16:50
|- - amw   Цитата(makc @ Nov 2 2005, 19:37)Книга Linux D...   Nov 3 2005, 09:47
- - 3.14   Требуется помощь. Я хочу воспользоваться драивером...   Nov 3 2005, 19:49
- - makc   Отучение может быть выполнено лишь одним способом ...   Nov 3 2005, 20:49
- - 3.14   А если я сделаю так: в фунции xsysace_do_request в...   Nov 3 2005, 21:48
|- - makc   Цитата(3.14 @ Nov 4 2005, 00:48)А если я сдел...   Nov 4 2005, 20:19
- - 3.14   В общем, как то кастрировал этот драйвер, правда м...   Nov 4 2005, 16:01
|- - makc   Цитата(3.14 @ Nov 4 2005, 19:01)В общем, как ...   Nov 4 2005, 20:28
- - 3.14   Блин, чем дальше, тем ... На данный момент, мой...   Nov 5 2005, 14:42
|- - makc   Цитата(3.14 @ Nov 5 2005, 17:42)Блин, чем дал...   Nov 5 2005, 17:18
- - 3.14   Спасибо! Поправил с учетом последних указаний,...   Nov 5 2005, 18:35
|- - makc   Цитата(3.14 @ Nov 5 2005, 21:35)Спасибо! ...   Nov 5 2005, 19:18
- - 3.14   Далее. 1) Когда мой тестик читает из устройства 51...   Nov 5 2005, 21:52
- - 3.14   Уф-ф, мон...   Nov 6 2005, 15:56
- - makc   Цитата(3.14 @ Nov 6 2005, 18:56) Уф-ф, мо...   Nov 6 2005, 16:28


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 01:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016