|
Драйвер блочного устройства в Linux |
|
|
|
Oct 26 2005, 04:05
|

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

|
Цитата(3.14 @ Oct 25 2005, 23:28) Отзовитесь плиз, кто писал драйвер блочного устройства под линух. С символьным относительно быстро разобрался, а вто с блочным Примеры в uClinux не особо помогают, пока даже не могу вычленить нужные части. Я писал, причем совсем недавно. А в чем проблема, что не понятно?
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Oct 26 2005, 15:23
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(3.14 @ Oct 25 2005, 23:28) Отзовитесь плиз, кто писал драйвер блочного устройства под линух. С символьным относительно быстро разобрался, а вто с блочным Примеры в uClinux не особо помогают, пока даже не могу вычленить нужные части. Для ядра 2.6 пример есть тут http://lwn.net/Articles/60368/. Можно еще посмотреть в исходниках drivers/block/xd.c
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Oct 26 2005, 20:35
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 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
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Oct 27 2005, 01:35
|
Местный
  
Группа: Свой
Сообщений: 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  Судя по именам "mulsi3_proc" и "divsi3_proc" это функции выполнения умножения и деления? Может отсюда и копать?
--------------------
serpents on the way to paradise - dying for love, fighting for ages.
|
|
|
|
|
Oct 27 2005, 06:23
|

Гуру
     
Группа: Админы
Сообщений: 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  У меня есть подозрение, что это функции библиотеки компилятора для выполнения операций умножения и деления. А если это так, то в ключах линковки обязательно должен быть ключик -lgcc, говорящий об использовании требуемой библиотеки.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Oct 28 2005, 09:13
|
Знающий
   
Группа: Свой
Сообщений: 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  У меня есть подозрение, что это функции библиотеки компилятора для выполнения операций умножения и деления. А если это так, то в ключах линковки обязательно должен быть ключик -lgcc, говорящий об использовании требуемой библиотеки. ucLinux не пользовал. Там типа на ядро патчи накладываются? С 2.4 до блочных не дошел, а теперь уже и не надо, так как перешел полностью на 2.6. mulsi3_proc и divsi3_proc - это функции для обработки операций с плавающей точкой. А какой процесссор используется? Он что, без FP модуля? Если да, то нужно обязательно включить в ядре поддержку Floating Point Emulation. Линковать _МОДУЛЬ_ ядра с библиотекой, не важно с какой, вообще бред, потому как ядро должно работать само по себе и _НЕ_ должно зависеть от бибилотек.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Oct 28 2005, 12:03
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(makc @ Oct 27 2005, 09:23) У меня есть подозрение, что это функции библиотеки компилятора для выполнения операций умножения и деления. А если это так, то в ключах линковки обязательно должен быть ключик -lgcc, говорящий об использовании требуемой библиотеки. Вообще-то эти функции находятся обычно в libfloat и линковать надо с ключем -lfloat. Но под ucLinux может быть и по другому.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Oct 29 2005, 12:13
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 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 слайса  Как из Linux делается uClinux не знаю  А разве с ядра 2.6 так кардинально изменилась идеология написания драйверов?
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Oct 30 2005, 11:14
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 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 передается приложению пользователя
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Nov 1 2005, 16:33
|
Знающий
   
Группа: Свой
Сообщений: 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 слайса  Как из Linux делается uClinux не знаю  А разве с ядра 2.6 так кардинально изменилась идеология написания драйверов? В ядрах 2.4 и 2.6 отдичается идеология. Много функций переписаны, в смысле их вызов и действия.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Nov 1 2005, 16:50
|
Знающий
   
Группа: Свой
Сообщений: 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 передается приложению пользователя  С блочными все по другому (по сравнению с символьными). Во первых на блочные устройсва имеется кеш в ядре, и функция сброса очереди (в данном случае это 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.
|
|
|
|
|
Nov 1 2005, 17:01
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
В ядрах 2.6 есть еще так называемые шедулеры ввода/вывода которые занимаются планированием очереди, предсказанием номеров секторов, которые могут потребоватся в следующей оперции чтения/записи и много другого. Как в 2.4 с этим - я не знаю, но стоит посмотреть есть ли в исходниках ядра файл с именем elevator.c (ну или похожим). Если есть, то стоит его изучить, хотя это занятие неблагодарное. После изучения этого файла (и сопутствующих ему) появится понимание (а может наоборот - пропадет вовсе  ), но использовать это понимание на практике будет затруднительно. Драйвер блочного устройства знает как выполнять чтение/запись секторов, но не знает когда это происходит.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Nov 1 2005, 17:21
|

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

|
Цитата(amw @ Nov 1 2005, 20:01) В ядрах 2.6 есть еще так называемые шедулеры ввода/вывода которые занимаются планированием очереди, предсказанием номеров секторов, которые могут потребоватся в следующей оперции чтения/записи и много другого. Как в 2.4 с этим - я не знаю, но стоит посмотреть есть ли в исходниках ядра файл с именем elevator.c (ну или похожим). В 2.4 элеватор и все, что с ним связано тоже есть. Немного не в том виде, что в 2.6, но есть. Цитата Если есть, то стоит его изучить, хотя это занятие неблагодарное. После изучения этого файла (и сопутствующих ему) появится понимание (а может наоборот - пропадет вовсе  ), но использовать это понимание на практике будет затруднительно. Изучать его особенного интереса нет, если только нет цели реализовать пакетный режим обработки запросов ввода-вывода. У меня однажды была такая задача - устройство быстро работало если с ним общаться большими наборами последовательных блоков, а на единичных запросах все очень сильно тормозило. В 2.4 элеватор отлично справлялся с запрошенной группировкой запросов, а вот для 2.2 мне пришлось писать свое подобие элеватора и очереди запросов ввода-вывода. Цитата Драйвер блочного устройства знает как выполнять чтение/запись секторов, но не знает когда это происходит. Когда именно - не знает, но у него есть возможность поддерживать свою очередь запросов на ввод-вывод. Это дает большую свободу.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Nov 2 2005, 14:13
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Цитата(makc @ Nov 1 2005, 20:21) Цитата Драйвер блочного устройства знает как выполнять чтение/запись секторов, но не знает когда это происходит. Когда именно - не знает, но у него есть возможность поддерживать свою очередь запросов на ввод-вывод. Это дает большую свободу. А можна с этого места чуть подробнее. Я не особо крутой спец по блочным устройствам, а сейчас как раз занимаюсь повышением поизводительности блочного драйвера. Я не претендую на полное изложение здесь, но может какая нибудь ссылка поконкретнее есть? А то ковыряюсь по исходникам в изучении этой самой очереди - времени уходит прорва, а результат мизерный.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|