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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Драйвер блочного устройства в 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
makc
сообщение Oct 26 2005, 04:05
Сообщение #2


Гуру
******

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



Цитата(3.14 @ Oct 25 2005, 23:28)
Отзовитесь плиз, кто писал драйвер блочного устройства под линух.
С символьным относительно быстро разобрался, а вто с блочным  cranky.gif
Примеры в uClinux не особо помогают, пока даже не могу вычленить нужные части.
*


Я писал, причем совсем недавно. А в чем проблема, что не понятно?


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


Знающий
****

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



Цитата(3.14 @ Oct 25 2005, 23:28)
Отзовитесь плиз, кто писал драйвер блочного устройства под линух.
С символьным относительно быстро разобрался, а вто с блочным  cranky.gif
Примеры в uClinux не особо помогают, пока даже не могу вычленить нужные части.
*

Для ядра 2.6 пример есть тут http://lwn.net/Articles/60368/.
Можно еще посмотреть в исходниках drivers/block/xd.c


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


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

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



Нижесказанное касается uClinux, ядро 2.4.
Начал я с примера "sbull" идущего с книжкой Linux Device Drivers.
Модуль скомпилировался, но загружаться отказался с ошибкой
Код
insmod: unresolved symbol mulsi3_proc
insmod: unresolved symbol divsi3_proc

Тогда я взял пример по проще (драйвер Xilinx sysace), в результате, ошибка с "mulsi3_proc" все равно появляется.
Объявляю init, clean модули и регистрирую драйвер (register_blkdev) - ОК.
Объявляю структур block_device_operations структуру - OK
Как дохожу до blk_init_queue - ошибка unresolved symbol divsi3_proc sad.gif

cranky.gif


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
gab
сообщение Oct 27 2005, 01:35
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 376
Регистрация: 30-06-04
Из: Moskow
Пользователь №: 218



Цитата(3.14 @ Oct 26 2005, 23:35)
Нижесказанное касается uClinux, ядро 2.4.
Начал я с примера "sbull" идущего с книжкой Linux Device Drivers.
Модуль скомпилировался, но загружаться отказался с ошибкой
Код
insmod: unresolved symbol mulsi3_proc
insmod: unresolved symbol divsi3_proc

Тогда я взял пример по проще (драйвер Xilinx sysace), в результате, ошибка с "mulsi3_proc" все равно появляется.
Объявляю init, clean модули и регистрирую драйвер (register_blkdev) - ОК.
Объявляю структур block_device_operations структуру - OK
Как дохожу до blk_init_queue  - ошибка unresolved symbol divsi3_proc sad.gif

cranky.gif
*

Судя по именам "mulsi3_proc" и "divsi3_proc" это функции выполнения умножения и деления?
Может отсюда и копать?


--------------------
serpents on the way to paradise -
dying for love, fighting for ages.

Go to the top of the page
 
+Quote Post
makc
сообщение Oct 27 2005, 06:23
Сообщение #6


Гуру
******

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



Цитата(3.14 @ Oct 26 2005, 23:35)
Нижесказанное касается uClinux, ядро 2.4.
Начал я с примера "sbull" идущего с книжкой Linux Device Drivers.
Модуль скомпилировался, но загружаться отказался с ошибкой
Код
insmod: unresolved symbol mulsi3_proc
insmod: unresolved symbol divsi3_proc

Тогда я взял пример по проще (драйвер Xilinx sysace), в результате, ошибка с "mulsi3_proc" все равно появляется.
Объявляю init, clean модули и регистрирую драйвер (register_blkdev) - ОК.
Объявляю структур block_device_operations структуру - OK
Как дохожу до blk_init_queue  - ошибка unresolved symbol divsi3_proc sad.gif

cranky.gif
*


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


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


Знающий
****

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



Цитата(makc @ Oct 27 2005, 09:23)
Цитата(3.14 @ Oct 26 2005, 23:35)
Нижесказанное касается uClinux, ядро 2.4.
Начал я с примера "sbull" идущего с книжкой Linux Device Drivers.
Модуль скомпилировался, но загружаться отказался с ошибкой
Код
insmod: unresolved symbol mulsi3_proc
insmod: unresolved symbol divsi3_proc

Тогда я взял пример по проще (драйвер Xilinx sysace), в результате, ошибка с "mulsi3_proc" все равно появляется.
Объявляю init, clean модули и регистрирую драйвер (register_blkdev) - ОК.
Объявляю структур block_device_operations структуру - OK
Как дохожу до blk_init_queue  - ошибка unresolved symbol divsi3_proc sad.gif

cranky.gif
*


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


ucLinux не пользовал. Там типа на ядро патчи накладываются?
С 2.4 до блочных не дошел, а теперь уже и не надо, так как перешел полностью на 2.6.
mulsi3_proc и divsi3_proc - это функции для обработки операций с плавающей точкой. А какой процесссор используется? Он что, без FP модуля? Если да, то нужно обязательно включить в ядре поддержку Floating Point Emulation.
Линковать _МОДУЛЬ_ ядра с библиотекой, не важно с какой, вообще бред, потому как ядро должно работать само по себе и _НЕ_ должно зависеть от бибилотек.


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


Знающий
****

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



Цитата(makc @ Oct 27 2005, 09:23)
У меня есть подозрение, что это функции библиотеки компилятора для выполнения операций умножения и деления. А если это так, то в ключах линковки обязательно должен быть ключик -lgcc, говорящий об использовании требуемой библиотеки.
*


Вообще-то эти функции находятся обычно в libfloat и линковать надо с ключем -lfloat. Но под ucLinux может быть и по другому.


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


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

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



Всем спасибо, с мертвой точки наконец сдвинулся.
Как и говорили, дело в FPU.
Когда добавил ключик -mno-xl-soft-mul, ошибка пропала. Хотя не понятно, в других примерах используются ключи -mxl-soft-mul или -DNO_FPU. Никакой информации на эти ключи в доке на компилятор не нашел (mg-gcc).

2 amw
Я ставлю эксперименты на MicroBlaze - синтезируемый процессор (Xilinx) ver3. В четвертой версии появилась поддержка плавающей точки, но у меня ресурсрв FPGA мало (Spartan3-200), вместе со всеми необходимуми корками (RS232,Контр.пр.таймер,SDRAM,Ethernet,GPIO) осталось свободных 2 слайса smile.gif
Как из Linux делается uClinux не знаю sad.gif
А разве с ядра 2.6 так кардинально изменилась идеология написания драйверов?


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


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

Группа: СуперМодераторы
Сообщений: 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, 16:33
Сообщение #11


Знающий
****

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



Цитата(3.14 @ Oct 29 2005, 15:13)
Всем спасибо, с мертвой точки наконец сдвинулся.
Как и говорили, дело в FPU.
Когда добавил ключик -mno-xl-soft-mul, ошибка пропала. Хотя не понятно, в других примерах используются ключи -mxl-soft-mul или -DNO_FPU. Никакой информации на эти ключи в доке на компилятор не нашел (mg-gcc).

Ага, я тоже когда-то что-то типа этого долго искал, в смысле ключи gcc подбирал.
Цитата(3.14 @ Oct 29 2005, 15:13)
2 amw
Я ставлю эксперименты на MicroBlaze - синтезируемый процессор (Xilinx) ver3. В четвертой версии появилась поддержка плавающей точки, но у меня ресурсрв FPGA мало (Spartan3-200), вместе со всеми необходимуми корками (RS232,Контр.пр.таймер,SDRAM,Ethernet,GPIO) осталось свободных 2 слайса smile.gif
Как из Linux делается uClinux не знаю sad.gif
А разве с ядра 2.6 так кардинально изменилась идеология написания драйверов?
*

В ядрах 2.4 и 2.6 отдичается идеология. Много функций переписаны, в смысле их вызов и действия.


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


Знающий
****

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



Цитата(3.14 @ Oct 30 2005, 14:14)
Мне вот еще что не понятно.
В примере с символьным драйвером обращение к устройству сводится к вызову функций чтения/записи которые прописаны в структуре 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
*

С блочными все по другому (по сравнению с символьными).
Во первых на блочные устройсва имеется кеш в ядре, и функция сброса очереди (в данном случае это static void xsysace_do_request(request_queue_t * q)) вызывается менеджером кеша для записи данных на устройство.
Во вторых, блочное устройство, это как-бы не совсем самостоятельное устроство, вернее - не самодостаточное.
Например, когда пользовательский процесс вызывает функции fopen(), fread(), fwrite(), то тут участвует в первую очередь файловая система (в терминах ядра - VFS), через нее (VFS) все и роисходит.
Если обратится на прямую, например
Код
dd if=/dev/hda of=example.file bs=512 count=1

то запрос на чтение сектора пройдет мимо VFS (условно говоря, потому как VFS участвует во всех оперциях с устройсвами) но через кеш. Ядро будет читать не один сектор, а несколько (количество зависит от аппаратуры, менеджера памяти и параметров очереди request_queue_t). Один сектор попадет пользовательскому процессу, а остальные дальше кеша не пойдут.


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


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #14


Гуру
******

Группа: Админы
Сообщений: 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
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 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

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

 


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


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