mur помоги. (драйвер)
От: Аноним  
Дата: 19.04.04 15:19
Оценка:
mur обращаюсь к тебе, потому что ты мне уже однажды здорово помог.
http://www.rsdn.ru/Forum/?mid=481789
Собственно вопрос в продолжение той темы.

У тебя в примере есть такие строки.

#define AS_SIZE (4*1024*1024)

inode->i_size = AS_SIZE;
inode->i_blkbits = PAGE_SHIFT;

Почему AS_SIZE = 4*1024*1024 и вообще как система использует i_size?
Задался я этим вопросом, после того как система отказалась отображать страницы общим объёмом больше 4М (4*1024*1024 = AS_SIZE).
Даже если этот объём складывался из нескольких обращений к драйверу (read).
Если я увеличивал AS_SIZE в два раза то и отображалось больше в два раза.

Сначала я обходил это с помощью дополнительных close\open после каждых AS_SIZE байт.
А потом в diodev_direct_IO стал возвращать не кол-во записанных байт, а 0.
И всё заработало нормально.

Что нужно возвращать из diodev_direct_IO?
Как система использует i_size и чему должна быть равна эта переменная?

И ещё почему-то система ни как не отображает буфер больше 128 страниц (512К) за раз.
Это вообще возможно?
Re: драйвер
От: Аноним  
Дата: 20.04.04 12:07
Оценка:
Собственно, если кто-то ещё знает, то помогите.
Re[2]: драйвер
От: Аноним  
Дата: 22.04.04 14:09
Оценка:
Похоже я всех распугал, когда обратился сразу к murrу.
Re: mur помоги. (драйвер)
От: Murr Россия  
Дата: 04.05.04 12:36
Оценка:
Здравствуйте, Аноним, Вы писали:

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

i_size — это размер данных inode. Все эти generic функции оперируют указателем и концепцией размеров inode, т.е. ты читаешь — указатель перемещается. Больше данных чем есть прочитать нельзя. Ну обойти это можно просто — напиши в i_size столько сколько нужно, можно написать максимум. Ну либо писать свой read, который плюет на проверки, связанные с размером (но тогда надо делать cut&paste кучи полезного кода).


Насчет 512 Кб странно — надо смотреть
А какая хоть ошибка возвращается?
Re[2]: mur помоги. (драйвер)
От: unkn2000  
Дата: 05.05.04 11:43
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


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


M>i_size — это размер данных inode. Все эти generic функции оперируют указателем и концепцией размеров inode, т.е. ты читаешь — указатель перемещается. Больше данных чем есть прочитать нельзя. Ну обойти это можно просто — напиши в i_size столько сколько нужно, можно написать максимум. Ну либо писать свой read, который плюет на проверки, связанные с размером (но тогда надо делать cut&paste кучи полезного кода).



M>Насчет 512 Кб странно — надо смотреть

M>А какая хоть ошибка возвращается?

Ни каких ошибок не возвращается.
Просто iobuf->length / blocksize всегда не больше 128 страниц (512К).
Выделяю 256К байт под буффер — всё нормально 64 страницы.
Но если больше, например 1М байт — то страниц 128.

Вообщем то у меня уже всё работает.

Проблема была больше аппаратная.
Дело в том что если устройство не поддерживает в балк в себя,
то при последоватьльной записи в память в\в данных по адрессам,
которые идут друг за другом или в один и тот же адресс, система (PCI) виснит намертво.
Чипсет пытается их как-то упаковать в один пакет и передать за один балк.
А устройство не поддерживает такой передачи в себя — коллизия.
Решается либо интервалами между передачей байт или слов,
либо писать так чтобы адресса не стояли рядом ( сначало в 1 и 3 регистр (адресс в\в) устройства, а потом в 5, 2, 4).
Но это грубо. лучше если устройство поддерживает в себя балк.
Но не все разработчики это делают.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.