Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт ноя 23, 2017 4:15 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 147 сообщений ]  На страницу 1 2 3 4 510 След.
Автор Сообщение
 Заголовок сообщения: Скорость работы с IDE дисками
СообщениеДобавлено: Пт май 15, 2015 12:02 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
А теперь про жуть. Общение с диском производится блоками по 16 секторов. Чтобы продолжить чтение/запись, диск должен сделать полный оборот. Диск делает 120 оборотов в секунду. Таким нехитрым способом скорость ограничена до 960 кб/сек. Не знаю, на каком жёстком диске был выбран такой оптимальный размер, но современные диски имеют около 1000 секторов в дорожке и скорость, соответственно, ~60 мб/сек. Я заменил чтение на новую функцию, но при копировании ntfs -> ntfs ничего не изменилось. Я так понял, чтение или запись в новых функциях тоже осуществляется по блочно ?

CleverMouse: обсуждение выделено из темы NTFS.


Последний раз редактировалось Pathoswithin Вс янв 08, 2017 11:56 pm, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Пт май 15, 2015 5:15 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1601
Самый медленный верблюд определяет скорость каравана.
* kfar копирует блоками по 64K. kfm берёт четверть от свободной физической памяти, что намного лучше.
* В функциях файловой системы запись отложенная, в момент переполнения кэша либо вызова disk_sync, и в рамках одного системного вызова объединяет подряд идущие изменённые секторы. Если записываемый файл фрагментирован на мелкие кусочки - будет писать посекторно. Чтение через fs_read32*, не попавшее в кэш, запросит 16 секторов. Чтение через fs_read64* прочитает ровно столько, сколько спросили.
* Драйверы IDE /hd* и BIOS /bd* пришедшие запросы в свою очередь разбивают по 16 секторов. Драйвер USB mass storage передаёт запрос так, как спросили пришедшие запросы разбивает по 65535 секторов - ограничение протокола.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Пт май 15, 2015 7:04 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
Цитата:
; Worker procedures take max 16 sectors per time
:shock: Почему? Там же 2 байта под количество


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Пт май 15, 2015 7:22 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1601
Потому что "Worker procedures" пропускают все данные через буфер _IDE_DMA, чтобы преобразование в физические адреса проще было, а размер буфера - 16*512.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Пт май 15, 2015 9:11 pm 
Не в сети
Just Flooding
Аватара пользователя

Зарегистрирован: Чт дек 11, 2014 1:31 am
Сообщения: 173
Предположу, что все это следствие закоса архитектуры подсистемы ввода-вывода под драйверы в стиле *nix...


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Пт май 15, 2015 11:04 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
DMA :) по 16 секторов :D А тонкие у вас, однако, тролли :wink: Смешнее чем компресс для трупа :lol: PIO 4 даёт 16 мб/сек :) PIO 0 даёт 3 мб/сек :) А тут DMA на 1 мб/сек :lol: Это был бы позор ещё тогда, когда кто-то додумался сделать чтение по 1 сектору.

Получается, что ntfs нужно откладывать до лучших времён, и заниматься драйверами. Надеюсь, что здесь мне хотя-бы не придётся заниматься обратной разработкой. Буфер ради преобразование в физические адреса? Чтобы проще? Значит можно от него избавится?


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Пт май 15, 2015 11:44 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1601
Цитата:
Буфер ради преобразование в физические адреса? Чтобы проще? Значит можно от него избавится?

Можно, даже нужно. Заодно можно объяснить нижнему уровню про 64-битные номера секторов, а то код для LBA48 есть, но вход у него 32-битный.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Сб май 16, 2015 2:35 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
Ну с PIO всё ясно, а вот в DMA не разбираюсь... Буфер просто лежит в стеке. Мне нужен инструктаж.


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Сб май 16, 2015 10:41 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Занятно как вышло. Я думал, что IDE прямо с кешем работает, а оно по старинке. Но скорость всё же не 1 Мб/с, были где-то тесты.
Pathoswithin
Это надо править код ide_read и hd_read_dma


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Сб май 16, 2015 6:01 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
Serge, извиняюсь, забыл что при копировании происходит сначала чтение, а потом запись. Тогда у меня получается целых 2 Мб/с !

Почитал wasm, разобрался. Благодаря хитрожопому оформлению, посредине драйвера находится структура IDE_descriptor_table. read_dma/write_dma почему-то начинаются с конца - команда rep movsd перекачивает данные между esi/edi и буфером (OS_BASE+IDE_DMA). IDE_DMA определена как... (_IDE_DMA-OS_BASE).

Значит мне нужно узнать физический адрес приходящего буфера и проверить, что он физически непрерывен. Serge?
И ещё вопрос, вам нужен LBA28 ?


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Сб май 16, 2015 10:04 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Ничего особо сложного нет. _IDE_DMA буфер на 16 секторов в .bss ядра. IDE_DMA физический адрес этого буфера, (OS_BASE+IDE_DMA) артефакт правок кода за несколько лет.
IDE_descriptor_table единственая таблица дескрипторов на все контроллеры. Это конечно круто.
Функция get_pg_addr возвращает физический адрес страницы.
Спойлер: Показать
Код:
; param
;  eax= linear address
;
; retval
;  eax= phisical page address

align 4
get_pg_addr:
        sub     eax, OS_BASE
        cmp     eax, 0x400000
        jb      @f
        shr     eax, 12
        mov     eax, [page_tabs+(eax+(OS_BASE shr 12))*4]
@@:
        and     eax, 0xFFFFF000
        ret
Если буфер в кеше, то физически непрерывен. Неплохо бы закрепить в документации, что буфер должен быть непрерывным.


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Вс май 17, 2015 5:13 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
В идеале нужно убирать вообще всё кэширование. До сих пор не понял, почему было лень сделать нормально, но не лень делать такой жуткий костыль.
Буфер запросто может быть фрагментирован, если файл большой, а главное, при редактировании карты раздела. Все страницы по 4 кб? По 2 Мб нет? Нужно проверять адресс каждой страницы? Или по 8?


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Вс май 17, 2015 10:51 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Цитата:
Буфер запросто может быть фрагментирован, если файл большой, а главное, при редактировании карты раздела
Ты хочешь читать диск в обход кеша ? Сейчас все операции через кеш идут. Файловая система давно нуждается в переделке, только героев нет. Если так, то надо проверять адрес каждой страницы.


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Вс май 17, 2015 6:12 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1194
Serge, выбора нет, сейчас летает как кирпич. Линейно по 4 кб смотреть наверно долго... А если бинарная проверка? Может такое быть, что буфер кажется непрерывным по началу и концу, но в середине кусок из другого места?


Вернуться к началу
 Заголовок сообщения: Re: NTFS
СообщениеДобавлено: Вс май 17, 2015 10:13 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Смотря откуда буфер пришёл. Из usermode всё, что угодно может быть. Но сейчас оттуда ничего не приходит напрямую и mmap() не предвидится. Из ядра если размер буфера был кратен 8 страницам, то одним куском. Если нет, целый кусок кратный 8 и остаток набирается по странице.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 147 сообщений ]  На страницу 1 2 3 4 510 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB