Застосування KolibriOS. Частина 2: Экзоверсия ядра для розробників заліза

За вікном вже настало літо, ну а ми представляємо вам продовження циклу статей про практичне застосування КолибриОС. першої частини ми провели теоретичний огляд можливих сфер застосування, а тепер, як і було обіцяно переходимо до більш практичній частині: экзоверсии ядра для розробників заліза.


Хочеться сказати спасибі art_zh, за витрачений час на підготовку матеріалу для даної статті.

Напевно, деякі наші читачі пам'ятають ті давні-давні часи, «коли комп'ютери були великими» і практично не використовувалися для діловодства та розваг. Основними сферами застосування цих дорогущих монстрів були зубодробильні обчислення, автоматизовані системи збору даних, проектування і управління складними технологічними процесами.

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

Один з наших розробників — art_zh, інженер-електронник з Англії, прийшов в проект після довгих і безуспішних пошуків оптимальної РС для системи «швидкого» технічного зору на х86-платформі. Конкретне завдання вимагала обробки широкосмугового відеопотоку (500 SXGA-кадрів, 660 мільйонів пікселів в секунду), – з цієї лавини даних потрібно було виділити кілька характерних зон, знайти середню яскравість в кожній зоні і стежити за зміною цієї яскравості протягом 10-12 годин. Періодично відображаючи повноформатну картинку на екрані.



Завдання ускладнювалася нестандартністю застосовуваного заліза. Фреймграбер і DMA-контролер були реалізовані на експериментальній PCI-express карти з мотором Virtex-5 від Xilinx. Суворий Verilog-код вимагав ретельної налагодження всіх пакетних трансакцій протоколу TLP-PCIe. Цю тему ми більш детально обговоримо в одній з наступних публікацій цього циклу, тут обмежимося констатацією того, що середовище Windows для такої налагодження представляється абсолютно непридатною, а в Лінуксі цикл модифікація коду — компіляція драйвера – перезавантаження – аналіз printk-повідомлень займав неприйнятно довгий час.

Отже, потрібна була швидка, графічна, 32-розрядна операційна система з экзоядром, прозорим для доступу з додатка до апаратних ресурсів найнижчого рівня – конфігураційного простору PCI, регістрів PCIe Root Complex, адресами MMIO (отображаемного на пам'ять вводу виводу) і т. п.

КолибриОС приваблювала своєю швидкістю і мінімальною латентністю, простим і зручним графічним інтерфейсом, дуже компактним і відкритим кодом ядра. Проблема була з обмеженим набором функцій для роботи з апаратною частиною ПК.

У стандартному ядрі Колібрі додатком був відкритий доступ тільки до обмеженого діапазону портів вводу-виводу, системним повідомленням про деяких апаратних перериваннях і дуже кривий PCI-сервіс. Щоб максимально прискорити роботу програм з комп'ютерним залізом, треба було прорубати экзодыру у монолітному ядрі.

Так з'явилася Колібрі-А, экзоверсия КолибриОС для платформ на базі AMD Fusion. Оскільки будь экзоядро несе в собі небезпеку фатального пошкодження даних та обладнання ПК через некоректну доступу до критичних системних ресурсів, а також враховуючи, що переважна більшість користувачів нашої системи – чайники малодосвідчені користувачі, пробують нові ОС з чистої цікавості, Колібрі-А спочатку позиціонувалася як зовсім окрема гілка КолибриОС, призначена тільки для кваліфікованих користувачів, які мають уявлення як і з якими пристроями можна (і як не можна) звертатися, і несуть повну відповідальність за наслідки своїх дій.

Першим ділом додатком безпосередньо був відкритий доступ до
  1. Введення/висновку в усі порти (в основній гілці ядра додаток досі має «замовляти» потрібний діапазон портів вводу/виводу через потворне менуэтовское спадщина – т. зв. «сорокові функції»).
    Цього виявилося мало. Зараз вже важко знайти пристрій, общающееся з процесором винятково через порти. Додано зручний
  2. Доступ до MMIO (відображеним на пам'ять простору вводу/виводу) з допомогою сисфункции 62:12. Сервіс працює подібно линуксовской функції ioremap(), але реалізовано простіше і гнучкіше. Додаток вказує номер BAR-регістра в конфігураційному просторі вибраного пристрою і вибирає діапазон MMIO, до якого буде звертатися, а ядро відображає вибраний діапазон на лінійне простір програми.
    Але і це ще не все. Додаток повинен мати повний доступ до конфігураційного простору вибраного пристрою. PCI-сервіс ядра КолибриОС був реалізований через повільні і незручні порти CF8/CFC. В А-версію був доданий швидкий доступ до
  3. Конфігураційного простору PCI (включаючи розширений конфигспейс PCI Express) з відображенням на віртуальний адресний простір програми починаючи з адреси 0xF0000000. Приклад читання заголовка PCI-пристрою 1:18:2
    mov  eax, (1 shl 20) + (18 shl 15) + (2 shl 12)
    or   eax, 0xF0000000
    mov  [device_vendor], [eax]
    Потрібно зауважити, що відображення конфигспейса на пам'ять реалізовано тільки для платформ на базі AMD-процесорів (до речі, саме це подчекивает назва «Колібрі-А»). Для интелов экзосервис поки не розроблений: art_zh працює тільки з AMD-залізом, а всі інші розробники, на жаль, особливого інтересу до экзоядру не проявляють.
    Ну добре, конфигспейс відкритий. Тепер ми можемо ідентифікувати пристрою, дозволяти переривання, стежити за станом PCI-лінії і звертатися до будь-яких внутрішніх ресурсів, контролюючи потоки даних і організовуючи прямого доступу в пам'ять… Хоча тут ось є неув'язочка: пристрій адже знає тільки фізичні адреси DMA-області, а додаток живе у своєму лінійному просторі. Для цього
  4. Виділена статична область DMA. Використовуючи спеціальну сисфункцию 62:12-DA, додаток може запросити її лінійний адресу і працювати з нею безпосередньо:
    mcall  62,11,0x0500                     ; init MMIO/DMA: bus=5, device=0, fn=0
    mov  [dma],eax                           ; store phys.addr of the DMA buffer: 
    mcall 62,0+12,4096,0                  ; map MMIO access to BAR0-space
    mov  [mio],eax                            ; store MMIO linear address
    mcall 62,0xDA0C,4096,0              ; 0x0da0c = create user DMA channel
    mov  [mem],eax                          ; store DMA buffer: linear @
    mov  eax, [dma]
    or   eax, DMA_FLAGS
    mov  dword[mio+4], eax              ; program device-specific DMA-register
    ;  ....
    mov  ecx, [mem]
    mov  eax, [index]
    mov  edx, dword[ecx+eax*4]       ; load the fresh data від DMA-buffer
    Ось тепер з пристроєм можна повноцінно працювати прямо з інтерфейсу програми. Вийшов гнучкий і універсальний інструмент, який art_zh вже 5 років використовує в повсякденній роботі для розробки нового заліза і налагодження нізькорівневої коду дуже різних вбудованих х86-пристроїв.
    На жаль, розробивши такий інструмент, автор переключився на інші завдання і нечасто публікує нові версії свого коду (залишаючись у проекті в ролі «просунутого користувача» і вічного буркухи на форумі). Але незважаючи на тривалі перерви, робота потихеньку триває. Крім перерахованих вище, на сьогоднішній день в Колібрі-А є й інші экзофишки:
  5. Організація MSI переривань може бути організована через доступне юзеру адресний простір LAPIC.
  6. Фізична пам'ять також може бути прочитана з програми. Цей сервіс дуже корисний при налагодженні ядра.
  7. Бездискова завантаження ОС випробувана через CoreBoot (Xvilka) і через BIOS Extension ROM – з бортовий пам'яті PCIe-пристроїв.
  8. Відкрито простір GPU – поки тільки для установки апаратних курсорів і реверс-інжинірингу ресурсів графічного процесора AMD/ATI. Але хто знає, можливо, коли-небудь у Колібрі будуть програми GPU-асемблері...


(далі буде)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.