Код (Text): wrt: MOV AH, 43h MOV DL, 80h MOV SI, dap INT 13h inc [X_SEC] jmp wrt dap: packet_size db 1 reserved db 00h N_SEC dw 1 buf_seg dw 00h buf_off dw 7c00h X_SEC dd 0 dd 0 данный кусок программы работает из под загрузочного сектора дискеты(или HDD), и пишет на диск со скоростью примерно 8,5 МБ/с, хотя на тот же самый диск винда пишет как минимум в 2-3 раза быстрее(>20 МБ/с). Объясните, почему так?
потому, что это BIOS. и в нем все процедуры универсальные и примитивные. А в Винде под каждое устройство свой драйвер и много памяти.
Под каждый ЖД драйвер не нужен. В отличии от других устройств тут всё стандартно. Просто винда или любая другая полноценная ОС: 1) Сначала буферизует в память 2) Может писать по несколько секторов за раз. Кстати, BIOS тоже может (N_SEC).
Расширенный дисковый сервис биос вполне возможно тоже dma юзает. Просто автор читает по одному сектору за раз, а надо побольше, тогда и скорость повыше будет.
Для дисков, а точнее для контроллеров, есть понятие универсального драйвера и родного (фирменного) драйвера. Если бы последние не давали каких-либо преимуществ, они не были бы так распространены. Думаю, они способны установить и использовать как более эффективные стандартные режимы, так и расширенные режимы. Кэширование и блочные (многосекторные) операции тоже играют существенную роль.
я пробовал менять все значения из блока dapв том числе и число записываемых секторов) - разницы никакой. Скажите, стоит ли попробовать вместо биоса через порты и насколько это раельно?
Можешь сравнить PIO и DMA. В целом же пока не выставишь более производительный режим, существенных улучшений не получишь, а просто будешь делать работу вместо BIOS.
1. в этих статьях описывается в чистом виде работа с портами. правильно ли я понимаю, что не получится переключить контроллер в дма, а потом тупо использовать int 13h? 2. все это про IDE диски, c sata диском работать явно не будет. Будел ли с ним работать int 13h?(саташного диска, который можно насиловать вышеприведенной программой не имею, потому и спрашиваю)
Переключаться особо не нужно. Ты просто осуществляешь обмен данными либо через порт, либо сразу указываешь области памяти для обмена данными (поищи по ключевым словам PCI IDE, Bus Mastering).
1. В общем да. 2. Кто тебе сказал? Просто не надейся только на режим совместимости и не используй SATA-регистры.
Потому что Windows сама настраивает скоростной режим, а BIOS использует тот, который задан в настройках контроллера SATA/IDE и в настройках конкретных каналов (кури доки по настройке BIOS). Советую проверить настройки BIOS, и для контроллера поменять режим Legacy/Compatible на Enhanced. А в настройке канала самого винчестера установить максимальный режим DMA, включить использование 32-битного режима, установить максимальное количество секторов на блок, установить размер буфера. Ещё возможно, что режим DMA отдельной настройкой вообще выключен, надо проверять. При правльной настройке BIOS, скорость может быть до 32МБ/с. Читать/писать лучше блоками по 64 сектора (32КБ). Вообще, скорость передачи не должна быть ниже 16МБ/с при любых настройках, стоит поискать ошибку в алгоритме измерения.