Жорсткий диск працює у режимі pio. Як відновити продуктивність системи, режими PIO та DMA. DMA що це? Про що ви говорите

Привіт всім читачам блоґу. У статті поговоримо у тому, як відновити продуктивність системи. Часто у користувачів виникає проблема дуже повільної роботикомп'ютера, особливо під час записуі при читаннідисків, або просто необґрунтовані «гальма» системи під час роботи чи завантаження. Чому система зависає читайте
Причин виникнення цього може бути безліч, сьогодні пропоную розглянути досить поширену - це неправильний режим роботи CD/DVD - ROM'аабо жорстких дисків , тобто поговоримо про PIO та DMA.Як перевірити жорсткий дискна помилки та усунути їх читайте

У чому суть і різниця PIO та DMA.

PIO та DMA- це два режими роботи жорсткихдисків, у випадку будь-якого приводу.
PIO (Programmable Input/Output)- вже застарілий режим, для роботи йому потрібно
задіятицентральний процесор, що призводить до значної втрати продуктивності.
DMA (Direct MemoryAccess) - сучасний метод, який мине процесор і
звертається безпосередньодо оперативної пам'яті, це дозволяє значно збільшити продуктивністьі позбутися надокучливих «гальм».
Режим DMA в різних варіантахвже давно використовується в операційних системах Windows 7, 8, а також у 10, проте у Windows XP,часто трапляється ситуація в якій DMA автоматично перемикається на PIOі вже вивести його назад звичайними методамине вийде. Чому виникає ця ситуація?
У Windows XP впровадженомеханізм контролю помилок, якщо під час читання з жорсткого дискаабо іншого приводу занадто часто виникають помилки, система автоматично переходить у повільніший режим, де їх відсоток менше. Однак, Windows XPможе перевести в такий режим і нормально працюючий пристрій.
Як усунути помилки Windows читайте

І так, перевіримо режими роботи всіх приводів, щоб система не гальмувала.

1 . Запускаємо консоль «Керування комп'ютером»правою кнопкоюна "Мій комп'ютер"


у випадаючому меню вибираємо пункт "Диспетчер пристроїв", або через
Панель управління.Або Пуск - Виконати - devmgmt.msc

2. Вибираємо « Диспетчер пристроїв", вибираємо IDE ATA/ATAPI контролери,


відкриється кілька рядків із контролерами – нас цікавлять :
Первинний та Вториннийканали IDE→ заходимо по черзі до властивостіцих каналів (правою кнопкою на каналі, рядок « Властивості»), в закладку « Додаткові параметри» ,
тут виділено дві групи «Пристрій 0» та «Пристрій 1», у кожному є рядки
"Режим передачі"– у ній має бути обрано «DMA, якщо доступно», далі рядок "Поточний режим передачі", має бути щось типу «Режим ультра DMA:4,


якщо тут стоїть «Режим PIO», то це якраз нашвипадок і ми будемо його виправляти.
Якщо скрізьстоїть режим ультра DMA,то у Вас все гаразд і подальші діїможна не продовжувати.
3. Для початку спробуємо виправити вручну – у кожному рядку "Режим передачі" ставимо "DMA, якщо доступно", тиснемо "ОК"та перезавантажуємо комп'ютер. Після включення знову
дивимося режими роботи каналів, якщо скрізь стоїть DMA, то все гаразд, якщо залишився PIO, то продовжуємо далі.
4. Знову знайдіть Первинний та Вторинний канали IDEта видаліть їх (правою кнопкою на кожному каналі, у списку вибираємо "Видалити"). Не бійтеся, все нормально працюватиме.
Знову перезавантажте комп'ютер – Windows XP знайде контролериі переведе їх у швидкий режимроботи, тобто в DMA. Перевірте результат, скрізь має стояти режим DMA.
5. Якщо все перераховане не допомогло і у Вас знову висвічується Режим PIO»тоді необхідно буде переставити драйверадля материнської плати– перевантажитись
та знову перевірити результат.
6. Ну і останній пункт, якщо після всіх страждань режим PIOтак і не пропав, тоді доведеться підредагувати в реєстр.Хочу зазначити – робіть будь-які операції з
реєстром дуже обережно та уважно, будь-яке неправильна діяможе призвести до повної непрацездатності вашої системи. Найкраще зробити заздалегідь копію реєстру.
Як настроїти Windows XP за допомогою реєстру читайте

Спочатку спробуйте вимкнути систему контролю помилок.
Для цього у гілці реєстру:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdfs\,
створіть ключ ErrorControlта встановіть його значення рівним 0.


Після цього перевантажтеся та виконайте пункт №4.


у ній можна вручну виставити режим DMA.
Тут розташовуються кілька папок - 0000, 0001, 0002.
0000 - відповідає за сам контролер;
0001 – відповідає за Secondary IDE Chanell;
0002 – відповідає за Primary IDE Chanell;
Відкриваємо папку для потрібного каналу. У ній знаходяться
кілька ключів, для початку вибираємо:
MasteDeviceTimingModeAllowed
SlaveDeviceTimingModeAllowed
і проставляємо значення рівне 0хffffffff.
Після цього виставляємо значення наступних ключів:
MasterDeviceTimingMode
SlaveDeviceTimingMode
відповідно до таких даних, залежно від
підтримуваного UDMA - режим:
UDMA Mode 2 – 0×2010
UDMA Mode 4 – 0×8010
UDMA Mode 5 – 0×10010
UDMA Mode 6 – 0xffff

Після цього перевантажтеся та перевірте результат – має все нормально працювати.
Як прискорити та відновити продуктивність Windows 10, читайте
Яка швидкість передачі інформації в комп'ютерах читайте
Сподіваюся ця стаття допоможе Вам правильно виставити режими PIO та DMAта підвищити загальну продуктивність системи.


Шановні читачі!
Якщо вам сподобався блог та опубліковані матеріали, виявилися корисними для Вас, то прошу надати допомогу на утримання та розвиток даного блогу. Зробити це можна, пожертвувавши будь-яку суму. Ваша фінансова підтримка буде використана для просування блогу на наповнення блогу гарним матеріалом, покращення функціональності та зручності для читача та реалізацію подальших планів.
1) Шляхом перерахування грошей на картку Ощадбанку: 4424 7710 1196 4323
2) Найпростіший спосіб, який не складе великих зусильу кожного користувача, читача блогу - це наприкінці кожної статті є кілька кнопок ( "поділитися") для додавання статті до соціальні мережіабо блоги та інші ресурси спілкування в Інтернеті.
Наперед вдячний усім, хто допоможе у розвитку блогу.

Привіт всім читачам блоґу. У статті поговоримо у тому, як відновити продуктивність системи. Часто у користувачів виникає проблема дуже повільної роботи комп'ютера, особливо під час записуі при читаннідисків, або просто необґрунтовані «гальма» системи під час роботи чи завантаження. Чому система зависає читайте
Причин виникнення цього може бути безліч, сьогодні пропоную розглянути досить поширену - це неправильний режим роботи CD/DVD - ROM'аабо жорстких дисків, тобто поговоримо про PIO та DMA.Як перевірити жорсткий диск на помилки та усунути їх читайте

У чому суть і різниця PIO та DMA.

PIO та DMA- це два режими роботи жорстких дисків, у випадку будь-якого приводу.
PIO (Programmable Input/Output)- вже застарілий режим, для роботи йому потрібно
задіятицентральний процесор, що призводить до значної втрати продуктивності.
DMA (Direct MemoryAccess)- сучасний метод, який мине процесор і
звертається безпосередньодо оперативної пам'яті, це дозволяє значно збільшити продуктивністьі позбутися надокучливих «гальм».
Режим DMA у різних варіантах вже давно використовується в операційних системах Windows 7, 8, а також у 10, проте у Windows XP,часто трапляється ситуація в якій DMA автоматично перемикається на PIOі вже вивести його назад звичайними методами не вдасться. Чому виникає ця ситуація?
У Windows XP впровадженомеханізм контролю помилок, якщо при читанні з жорсткого диска або іншого приводу занадто часто виникають помилки, система автоматично переходить у повільніший режим, де їх відсоток менше. Однак, Windows XPможе перевести в такий режим і нормально працюючий пристрій.
Як усунути помилки Windows читайте

І так, перевіримо режими роботи всіх приводів, щоб система не гальмувала.

1 . Запускаємо консоль «Керування комп'ютером»- Правою кнопкою на "Мій комп'ютер"


у випадаючому меню вибираємо пункт "Диспетчер пристроїв", або через
Панель управління.Або Пуск - Виконати - devmgmt.msc

2. Вибираємо « Диспетчер пристроїв", вибираємо IDE ATA/ATAPI контролери,


відкриється кілька рядків із контролерами – нас цікавлять :
Первинний та Вториннийканали IDE→ заходимо по черзі до властивостіцих каналів (правою кнопкою на каналі, рядок « Властивості»), в закладку « Додаткові параметри",
тут виділено дві групи «Пристрій 0» та «Пристрій 1», у кожному є рядки
"Режим передачі"– у ній має бути обрано «DMA, якщо доступно», далі рядок "Поточний режим передачі", має бути щось типу «Режим ультра DMA:4,


якщо тут стоїть «Режим PIO», то це якраз нашвипадок і ми будемо його виправляти.
Якщо скрізьстоїть режим ультра DMA,то у Вас все гаразд і подальші дії можна не продовжувати.
3. Для початку спробуємо виправити вручну – у кожному рядку "Режим передачі" ставимо "DMA, якщо доступно", тиснемо "ОК"та перезавантажуємо комп'ютер. Після включення знову
дивимося режими роботи каналів, якщо скрізь стоїть DMA, то все гаразд, якщо залишився PIO, то продовжуємо далі.
4. Знову знайдіть Первинний та Вторинний канали IDEта видаліть їх (правою кнопкою на кожному каналі, у списку вибираємо "Видалити"). Не бійтеся, все нормально працюватиме.
Знову перезавантажте комп'ютер – Windows XP знайде контролериі переведе їх у швидкий режим роботи, тобто в DMA. Перевірте результат, скрізь має стояти режим DMA.
5. Якщо все перераховане не допомогло і у Вас знову висвічується Режим PIO»тоді необхідно буде переставити драйверадля материнської плати – перевантажитись
та знову перевірити результат.
6. Ну і останній пункт, якщо після всіх страждань режим PIOтак і не пропав, тоді доведеться підредагувати в реєстр.Хочу зазначити – робіть будь-які операції з
реєстр дуже обережно і уважно, будь-яка неправильна дія може призвести до повної непрацездатності Вашої системи. Найкраще зробити заздалегідь копію реєстру.
Як настроїти Windows XP за допомогою реєстру читайте

Спочатку спробуйте вимкнути систему контролю помилок.
Для цього у гілці реєстру:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdfs\,
створіть ключ ErrorControlта встановіть його значення рівним 0.


Після цього перевантажтеся та виконайте пункт №4.


у ній можна вручну виставити режим DMA.
Тут розташовуються кілька папок - 0000, 0001, 0002.
0000 - відповідає за сам контролер;
0001 – відповідає за Secondary IDE Chanell;
0002 – відповідає за Primary IDE Chanell;
Відкриваємо папку для потрібного каналу. У ній знаходяться
кілька ключів, для початку вибираємо:
MasteDeviceTimingModeAllowed
SlaveDeviceTimingModeAllowed
і проставляємо значення рівне 0хffffffff.
Після цього виставляємо значення наступних ключів:
MasterDeviceTimingMode
SlaveDeviceTimingMode
відповідно до таких даних, залежно від
підтримуваного UDMA - режим:
UDMA Mode 2 – 0×2010
UDMA Mode 4 – 0×8010
UDMA Mode 5 – 0×10010
UDMA Mode 6 – 0xffff

Після цього перевантажтеся та перевірте результат – має все нормально працювати.
Як прискорити та відновити продуктивність Windows 10, читайте
Яка швидкість передачі інформації в комп'ютерах читайте
Сподіваюся ця стаття допоможе Вам правильно виставити режими PIO та DMAта підвищити загальну продуктивність системи.


Шановні читачі!
Якщо вам сподобався блог та опубліковані матеріали, виявилися корисними для Вас, то прошу надати допомогу на утримання та розвиток даного блогу. Зробити це можна, пожертвувавши будь-яку суму. Ваша фінансова підтримка буде використана для просування блогу, на наповнення блогу гарним матеріалом, покращення функціональності та зручності для читача та реалізацію подальших планів.
1) Шляхом перерахування грошей на картку Ощадбанку: 4424 7710 1196 4323
2) Найпростіший спосіб, який не складе великих зусиль у кожного користувача, читача блогу – це наприкінці кожної статті є кілька кнопок ( "поділитися") для додавання статті до соціальних мереж або блогів та інших ресурсів спілкування в інтернеті.
Наперед вдячний усім, хто допоможе у розвитку блогу.

Як ви знаєте, Windows 7отримала більш значні покращення у часі завантаження та відгуку системи в порівнянні з її попередницею Windows Vista . Було внесено суттєві зміни, що дозволили системі не витрачати всю системну пам'ятьпри відкритті великої кількостівікон провідника, оптимізовані системні службита процеси.


У цій статті ми розглянемо:

Увага!
Зверніть увагу на те, що частина розглянутих методів прискорення роботи Windows 7ґрунтуються на відключенні будь-яких завдань, спрощенні або поліпшенні функціональності системи для зручнішого її використання. Тобто. по суті ви вибираєте між зручністю та продуктивністю.

Шляхи оптимізації Windows 7

1. Прискорення меню пуск.

Визначення нещодавно встановлених програм, а також підсвічування цих нещодавно встановлених програм займає у системи деякий час при кожному відкриванні меню пуск. Ви можете заощадити цей час.

Для цього вам необхідно перейти до налаштування меню пуск: у властивостях «Панель завдань та меню Пуск»(для активації перейдіть до панелі керування Windows 7: Пуск -> Панель керування). Перейдіть до закладки «Меню Пуск»та натисніть на кнопку «Налаштувати».
Малюнок 1. Налаштування меню "Пуск"

Заберіть галочку «Виділяти нещодавно встановлені програми», після чого натисніть «Застосувати».
Рисунок 2. Вимкнення виділення нещодавно встановлених програм
Щоб зменшити паузу, з появою вікна меню пуск, перейдіть у редактор реєстру (команда "regedit"у діалозі «Знайти програми та файли»).
Рисунок 3. Запуск редактора реєстру
Після запуску редактора реєстру ( regedit.exe) перейдіть у гілку HKEY_CURRENT_USER -> Control Panel-> Desktop(Рис. 4).

Малюнок 4. Вибір необхідної гілки реєстру
Змініть значення ключа MenuShowDelayз "400"на "50". Пауза значно скоротиться.

Рисунок 5. Зміна паузи під час відображення вікна
2. Оптимізація роботи жорсткого диска у Windows 7

Ця опція знайома ще з часів Windows XP, але якщо у XPвона була спочатку включена, то в Windows 7оптимізацію жорстких дисків визнали зайвою і за замовчуванням вона відключена. Тепер ми розглянемо спосіб включення цієї опції.

Заходимо в Пуск -> Панель керування -> Диспетчер пристроїв -> Дискові пристрої-> (вибираємо свій жорсткий диск) -> Властивості -> Політика...і ставимо там галочку навпроти пункту «Вимкнути очищення буфера кешу записів Windowsдля цього пристрою».
Рисунок 6. Вимкнення очищення буфера кешу Windows
Тепер у цьому ж «Диспетчері пристроїв»розкриваємо іншу гілку - "IDE ATA/ATAPI контролери (IDE ATA/ATAPI Controllers)", після чого у властивостях усіх каналів ATA (ATA Channel 0, ATA Channel 1і т.д.) у вкладці « Додаткові налаштування(Advanced Settings)»перевіряємо, чи варто галочка на "Задіяти/Включити DMA (Enable DMA)".
Малюнок 7. Увімкнення режиму DMA
Якщо галочка не стоїть – встановіть її.

3. Прискорення копіювання та переміщення файлів у Windows 7

Windows 7отримала ще одну цікаву особливість- віддалений різницевий стиск.
З одного боку ця опція обчислює і передає різницю між двома об'єктами, мінімізуючи обсяг даних, але з іншого – це забирає час на калькуляцію.

Ви можете вимкнути цю функцію. Для цього перейдіть до Пуск -> Панель управління -> Програми та компоненти -> Увімкнення та вимкнення компонентів Windows-> Віддалений різницевий стиск (необхідно зняти галочку).

Малюнок 8. Вимкнення різницевого стиснення
4. Вимкнення перевірки цифровий підписдрайверів

Ця дія також може трохи збільшити швидкість роботи системи (при встановленні нових драйверів). Для відключення даної опції Windows 7виконайте наступні дії:

Виконайте в «Пусці» gpedit.msc.
Рисунок 9. Запуск панелі адміністрування
Потім перейдіть наступним шляхом:

Конфігурація користувача -> Адміністративні шаблони -> Система -> Встановлення драйвера -> Цифровий підпис драйверів пристроїв. У цьому вікні потрібно вибрати режим "Відключено".

Рисунок 10. Вимкнення перевірки цифрового підпису драйверів
5. Прискорення завантаження Windows 7

Ми можемо виграти ще кілька секунд, щоправда дана порадавідноситься до тих користувачів, які працюють на багатоядерних процесорахз Windows 7в якості операційної системи.
Отже, виконайте такі дії:

Введіть MSCONFIGу полі пошуку меню «Пуск»та натисніть клавішу "Enter".

У вікні, перейдіть на вкладку і натисніть на кнопку "Додаткові параметри (Advanced options)".

Рисунок 11. Додаткові параметри оптимізації системиВстановіть прапорець навпроти пункту Число процесорів (Number of processors)і у випадаючому меню під цим пунктом виберіть максимальна кількістьядер (2 або 4).

Рисунок 12. Встановлення числа процесорів для систем з багатопотоковими процесорами
Натисніть «Ок»та перезавантажте систему, щоб побачити досить відчутну різницю у швидкості завантаження Windows 7.

6. Прискорення перегляду ескізів (мініатюр).

Ви можете збільшити швидкість перегляду ескізів (мініатюр) у Windows 7. Для цього вам необхідно виконати такі дії:

Введіть regedit(без лапок) у полі пошуку меню «Пуск»та натисніть клавішу "Enter".

Перейдіть у гілку "HKEY_CURRENT_USER -> Control Panel -> Mouse".

Рисунок 13. Вибір потрібної гілки реєстру для оптимізації паузи під час відображення ескізів
Двічі клацніть на параметрі MouseHoverTimeта змініть його значення на 100 .

Рисунок 14. Встановлення нового значення
7. Зменшення часу вимкнення Windows 7

Час завершення роботи Windows 7можна помітно зменшити. Однак це досить варварський спосіб: ми зменшуємо час, який приділяється процесу на завершення роботи програми, після чого програму буде завершено примусово.

Введіть regeditу полі пошуку меню «Пуск»та натисніть клавішу "Enter".

Перейдіть у гілку HKEY_LOCAL_MACHINE -> System -> CurrentControlSet -> Control.


Малюнок 15. Вибір необхідного ключареєстру
Змініть значення параметра "WaitToKillServiceTimeout"зі значення 12000 (12 секунд) на 2000 (2 секунди).

Малюнок 16. Зміна значення.


Тривалий стан стабільності рано чи пізно порушує щось непередбачуване та дивне, ось і настав такий момент. Пару днів тому при копіюванні файлу з одного фізичного дискана інший, раптом помітив, що швидкість катастрофічно низька - 4-6 Мб/с замість очікуваних 50-90 Мб/с (з поправкою на фрагментацію). Дивлюся на завантаження CPU– одне ядро ​​повністю зайняте обробкою переривань, все зрозуміло – диск перейшов у PIO mode.

Початкова конфігурація: ASUS P5Q, 4 x 1 Gb SATA диска, 2 x 1.5 Gb SATA диска, ніяких RAID-ів немає, Windows XP SP3. Диск працював в UDMA режимі, як і решта, я його тестував після установки. Device Manager -> IDE controllers -> канал і дивимось “current transfer mode”. На картинці обидва пристрої працюють у режимі UDMA, у моєму випадку другий пристрій працював у PIO mode, але картинку таку я не зберіг. Щоб зрозуміти, хто висить на якому каналі переключіть вигляд Device Manager-ав View -> Devices by Connection.

Хоча диски SATA, контролери у Device Manager-і - ATA. Справа в тому, що в BIOS SATA контролериза замовчуванням налаштовані прикидатися ATA контролерами, в такому випадку не потрібно додаткових нових драйверів AHCI. Перейти в AHCI режим можна безболісно, ​​це не впливає на логічну організаціюданих вимагає лише відповідних драйверів. В AHCI режимі з'являється підтримка NCQ (переупорядкування команд HDD) і в цілому продуктивність трохи підростає, але зовсім небагато і ще додається підтримка гарячої заміни.

Версії можливих причин:

1) Щось із шлейфом.
2) Щось із драйверами, збій чи конфлікт.
3) Щось із HDD.

Є друга система – Windows 7, збираюся в неї і спостерігаю повну працездатність дисків в UDMA режимах, отже залізо начебто в нормі. Дивлюся журнал подій, у ньому не виявляю повідомлень про проблему з дисками, дивлюся діагностику SMART- Все ок, конфліктів пристроїв немає, все це добре. Беру останні драйвериіз ASUS. Записую старий номерверсії драйвера Intel ICH10R, ставлю новий. Ставиться підозріло швидко, зрештою не оновився. Вручну через INF файлионовлюю драйвери ICH10R, ставиться, але проблема залишається. Іду на Intel, качаю найсвіжішу версію, ставлю знову нічого не ставиться. З'ясовую, що їх драйвери оновлюються тільки якщо пристрій взагалі не має драйвера, щоб форсувати треба використовувати секретний ключик – overlall, пробую, оновлюється, але не вирішує проблеми. Змінюю шлейф, виймаю, встромляю диск – не допомагає. Проміжний результат - залізо працює, новий софт не допомагає.

Знаходжу в Microsoft-і цікаву статтю: "Після появи кількох помилок CRC або закінчення часу очікування диски з інтерфейсами IDE ATA та ATAPI використовують режим PIO". Пишуть, що якщо були збої передачі UDMA, то система послідовно знижує режими аж до PIO mode (або відразу) і заморожує цей стан! Щоб повернути назад пропонують видалити контролер з Device Manager і він відродиться з попелу. На це не пішов, т.к. побоявся, що він може і не відродитися (писали про це десь), тому пішов другим шляхом, описаним там і ще в інших місцях.

Рішення.Відкрити гілку реєстру "HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro lSet\Control\Class\(4D36E96A-E325-11CE-B FC1-08002BE10318)", в ній будуть гілки 0000, 0001 і т.д. Вони відповідають пристроям у Device Manager-і. Нас цікавлять тільки канали, назву дивимося по DriverDesc, в даному випадку"Primary IDE Channel".

Звертаємо увагу на MasterDeviceTimingModeAllowed та SlaveDeviceTimingModeAllowed – вони задають маску допустимих режимів, якщо 0xffffffff, отже, все допустимо, а якщо 0x1f, то тільки PIO mode. У мене є проблема на Slave. Самі поточні режими зберігаються в MasterDeviceTimingMode та SlaveDeviceTimingMode, вони відрізняються (у мережі можна знайти значення чисел). MS пропонує зробити наступне – виставити додатковий ключ ResetErrorCountersOnSuccess (DWORD) = 1 та перевантажитися. Я це зробив, але це нічого не дало, дало тільки те, що бажаний режим UserSlaveDeviceTimingModeAllowed теж скинувся в 0x1f. Я його повернув у Device Manager, але думаю можна і тут вручну виставити 0xffffffff. Далі я виставив SlaveDeviceTimingModeAllowed = 0xffffffff, перевантажився і вуаля!, все запрацювало. Разом, я думаю треба було зробити лише наступне (проблема на Slave):

UserSlaveDeviceTimingModeAllowed = 0xffffffff, SlaveDeviceTimingModeAllowed = 0xffffffff, ResetErrorCountersOnSuccess = 1 і перевантажитися.

На наступному малюнку підсумковий стан реєстру після перезавантаження. Режими тепер однакові, маски збереглися і в Device Manager бачимо картинку, як на початку посту.

Тепер про причину.Як випливає зі статті MS, одна з причин виправлення їхнього драйвера була в тому, що час очікування старту HDD було недостатнім (у Win2000 - 4 сек, зробили 10 сек) і це було проблемою у разі виходу дисків зі сну. Я постійно використовував налаштування вимкнення дисків по бездіяльності через 2 години, що призводило іноді до віялового прокидання, коли деякі програми хотіли полізти відразу на кілька розділів. Я вважаю, що може за якогось сценарію таймаут таки був перевищений і був зафіксований збій, який призвів до відключення UDMA. Тепер я відмовився від відключення дисків, нехай працюють, до того ж часті включенняі вимикання можливо більше шкодять, ніж приносять користь.

Всім привіт сьогодні ми з вами поговоримо про DMA: саме про ту технологію, яка допомагає вашому комп'ютеру відтворювати для вас музику, виводити зображення на екран, записувати інформацію на жорсткий диск, і при цьому надавати на центральний процесор просто мізерне навантаження.

DMA що це? Про що ви говорите?

DMA або Direct Memory Access – технологія прямого доступу до пам'яті, минаючи центральний процесор. В епоху 486-х і перших Pentium всю царювала шина ISA, а також метод обміну даними між пристроями - PIO (Programmed Input/Output).

PIO по суті простий: щоб отримати дані з пристрою, драйвер операційної системи (або firmware іншого пристрою), повинен був читати ці дані з регістрів пристрою. Давайте розберемося на прикладі:

  • На мережеву карту надійшло 1500 байт даних.
  • Мережева карта ініціює переривання з метою повідомити процесору, що дані необхідно забрати з пристрою, інакше станеться так званий buffer overrun.
  • Операційна система ловить переривання від контролера переривань і віддає його обробку драйверу.
  • Драйвер у циклі побайтно читає дані з регістрів мережевої карти.
У результаті, якщо читання одного байта забирає близько 1 мс процесорного часу, читання 1500 байт – відповідно 1500 мс. Але це лише один Ethernet пакет, уявіть собі, скільки пакетів отримує мережева карта, коли ви читаєте улюблений хабрахабр. Звичайно в реальності читання в PIO режимі можна організовувати по 2, 4 байти, проте втрати продуктивності при цьому будуть катастрофічними.

Коли обсяги даних, якими оперує процесор, почали зростати, стало зрозуміло, що потрібно мінімізувати участь процесора в ланцюжку обміну даними, а то доведеться туго. І тоді активне застосування знайшла технологія прямого доступу до пам'яті.

До речі, DMA використовується не тільки для обміну даними між пристроєм і ОЗУ, але також між пристроями в системі, можливий DMA трансфер між двома ділянками ОЗУ (хоча даний маневр не застосовується до x86 архітектури). Також у своєму процесорі Cell IBM використовує DMA як основний механізм обміну даними між синергетичними процесорними елементами (SPE) і центральним процесорним елементом (PPE). Також кожен SPE та PPE може обмінюватися даними через DMA з оперативною пам'яттю. Цей прийом– насправді велика перевага Cell, тому що позбавляє проблем когерентності кешів при мультипроцесорній обробці даних.

І знову теорія

Перш ніж ми перейдемо до практики, я хотів би висвітлити кілька важливих аспектівпрограмування PCI, PCI-E пристроїв.

Я мимохіть згадав про регістри пристрою, але як же до них має доступ центральний процесор? Як багато хто з вас знає, є така сутність в комп'ютерні технології, як IO порти (Input/Output ports). Вони призначені для обміну інформацією між центральним процесором та периферійними пристроямиа доступ до них можливий за допомогою спеціальних асемблерних інструкцій - in/out. BIOS (або OpenFirmware на PPC based системах) на ранніх етапах ініціалізації PCI пристроїв, а також деяких інших (Super IO контролера, контролера PS/2 пристроїв, ACPI timer і т.д.), закріплює за певним контролером власний діапазон IO портів, куди відображаються регістри пристрою.

Також регістри пристрою можуть відображатися у ОЗУ (Memory Mapped Registers), тобто. на фізичний адресний простір. Цей метод має ряд переваг, а саме:

  • Швидкість доступу до фізичної пам'ятівище, ніж до IO портів.
  • IO порти можуть відображати не більше 65 535 байт регістрів, в той час як розмір ОЗУ сучасних комп'ютеріву рази більше.
  • Читати регістри пристрою з ОЗУ простіше, ніж за допомогою портів IO:)
Дані про те, який діапазон портів IO або ОЗУ закріплений за пристроєм, зберігаються в конфігураційному просторі PCI, а саме в регістрах BAR0, BAR1, BAR2, BAR4, BAR5 .

Отже, існує два методи утилізації DMA: contiguous DMA та scatter/gather DMA.

Contiguous DMA

Даний метод дуже простий і зараз практично віджив своє, проте досі використовується для програмування звукових контролерів(наприклад Envy24HT). Його принцип такий:
  • Виділяється один буфер достатньо великого розмірув оперативній пам'яті.
  • Фізична адреса (точніше сказати адресу на шині ділянки пам'яті, тому що physical address і bus address - рівні в архітектурі x86, але не рівні в PPC) цього буфера записується в регістр пристрою.
  • Під час того, як надходять дані на пристрій, контролер пристрою ініціює DMA трансфер.
  • Після того, як буфер повністю заповнений, контролер пристрою ініціює переривання, щоб повідомити центральному процесорущо буфер слід передати операційній системі.
  • Драйвер операційної системи обробляє переривання і передає отримані дані з буфера, далі по стеку пристроїв операційної системи.
Як бачите все досить просто, і як тільки шина ISA отримала підтримку DMA, даний методзнайшов дуже широке застосування. Наприклад драйвера мережевих картмали два таких DMA буфера: один прийом даних (rx), інший на відсилання (tx).

Scatter/gather DMA

Зі зростанням швидкості EthernetАдаптерів, незмінний DMA показав свою неспроможність. В основному через те, що були потрібні області пам'яті досить великого розміру, які часом неможливо було виділити, оскільки в сучасних системахФрагментація фізичної пам'яті досить висока. У всьому винен механізм віртуальної пам'яті, без якого нині нікуди:)

Рішення напрошується само собою: використовувати замість однієї великої ділянки пам'яті кілька, але в різних регіонахцієї пам'яті. Виникає питання, але як повідомити контролеру пристрою, як ініціювати DMA трансфер і за якою адресою писати дані? І тут знайшли рішення використовувати дескриптори, щоб описувати кожну ось таку ділянку в оперативній пам'яті.

Типовий дескриптор DMA буфера містить такі поля:

  1. Адреса ділянки ОЗУ (саме bus address), яка призначена для DMA трансферу.
  2. Розмір описуваної ділянки ОЗП.
  3. Опціональні прапори та інші специфічні аргументи.
  4. Адреса наступного дескриптора у пам'яті.
Структура дескрипторів визначається конкретним виробником контролера пристрою, і може містити будь-які інші поля. Дескриптор також як і DMA буфер розміщується в оперативній пам'яті.

Алгоритм scatter/gather DMA наступний:

  • Драйвер операційної системи виділяє та ініцілізує дескриптори DMA буферів.
  • Драйвер виділяє DMA буфери (ділянки ОЗУ для DMA трансферу) та записує необхідну інформацію про них у дескриптори.
  • Пристрій у міру виникнення потреби заповнює DMA буфери, і після того, як заповнений один або кілька буферів ініціює переривання.
  • Драйвер ОС переглядає всі дескриптори DMA буферів, визначає які були заповнені контролером пристрою, пересилає дані з буфера далі по стеку пристроїв і позначає буфер як готовий до DMA трансферу.
Порядок у якому контролер пристрою заповнює DMA буфери, що визначається виробником. Контролер може писати в перший вільний DMA буфер, або просто писати поспіль (дескриптори DMA буферів у даному випадку утворюють кільцевий список однозв'язний) у всі буфера і т.д.

Стоп...

На сьогодні, мабуть, усе, інакше інформації стане занадто багато. У наступній статті я покажу вам, як із цією вуличною магією працює IOKit. Чекаю відгуків та доповнень;)