Смекни!
smekni.com

Низькорівневе програмування контроллера клавіатури (стр. 1 из 4)

Введення

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

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

Працює максимально ефективно і має мінімальне запізнювання за часом завершення.

Має маленьку бібліотеку часу виконання (RTL) або не має її взагалі.

Дозволяє пряме управління (прямий доступ) до пам'яті і логіки, що управляє.

Дозволяє робити асемблерні вставки в код.

Відладка програми може бути утруднена при неможливості запустити її у відладчику із-за обмежень на ресурси, тому може застосовуватися комп'ютерне моделювання для вирішення цієї проблеми.

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

1. Огляд низькорівневих команд

Низькорівнева мова програмування (мова програмування низького рівня) - мова програмування, близький до програмуванню безпосередньо в машинних кодах використовуваного реального або віртуального (наприклад, Java, Microsoft .NET) процесора. Для позначення машинних команд зазвичай застосовується мнемонічне позначення. Це дозволяє запам'ятовувати команди не у вигляді послідовності двійкових нулів і одиниць, а у вигляді осмислених скорочень слів людської мови (зазвичай англійських).

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

Як правило, використовує особливості конкретного сімейства процесорів. Загальновідомий приклад низкоуровнего мови - мова асемблера, хоча правильніше говорити про групу мов асемблера. Більш того! Для одного і того ж процесора існує декілька видів мови асемблера! Вони збігаються в машинних командах, але розрізняються набором додаткових функцій (директив і макросів).

Також до мов низького рівня умовно можна зарахувати MSIL, вживаний в платформі Microsoft .NET, Форт, Java байт-код.

Спочатку, програмісти безвариантно писали на мові асемблера. Експерименти з підтримкою устаткування в мовах високого рівня (1960s привели до появи таких, як BLISS і BCPL. Проте, мова програмування Сі, що зіграла значну роль в створенні UNIX, завоювала велику популярність і розповсюдилася повсюдно до 1980-м роках.

В даний час (2006) деяке застосування знайшлося для вбудовуваного C++. Реалізація основних часток в операційній системі і при використанні мереж потребує розробників системного ПО. Наприклад, реалізація постраничности (через віртуальну пам'ять) або драйвери пристроїв.

Термін Системне програмування безпосередньо пов'язаний з терміном Системний програміст. Це програміст, що працює (що створює, відладжує, діагностує і т. п.) над системним програмним забезпеченням.

Мова асемблера (автокод) - мова програмування низького рівня. На відміну від мови машинних кодів, дозволяє використовувати зручніші для людини мнемонічні (символьні) позначення команд. При цьому для перекладу з мови асемблера в машинний код, що розуміється процесором, потрібна спеціальна програма, звана асемблером.

Команди мови асемблера один до одного відповідають командам процесора, фактично, вони є зручнішою для людини символьною формою запису (мнемокод) команд і їх аргументів.

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

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

Кожна модель (або сімейство) процесорів має свій набір команд і відповідну йому мову асемблера. Найбільш популярні синтаксиси: Intel-синтаксис і AT&T-синтаксис.

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

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

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

При програмуванні на асемблері можливий безпосередній доступ до апаратури, у тому числі портів ввода-вывода, регістрів процесора, і ін.

Мова асемблера застосовується для створення драйверів устаткування і ядра операційної системи

Мова асемблера використовується для створення «прошивок» BIOS.

За допомогою мови асемблера створюються компілятори і інтерпретатори мов високого рівня, а також реалізується сумісність платформ.

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

Але є в цієї програми і недоліки. Головна перевага асемблера практично повністю нівелюється хорошою оптимізацією в сучасних компіляторах мов високого рівня.

Через свою машинну орієнтацію («низького» рівня) людині в порівнянні з мовами програмування високого рівня складніше читати і розуміти програму, вона складається з дуже «дрібних» елементів - машинних команд, відповідно ускладнюються програмування і відладка, росте трудомісткість, велика вірогідність внесення помилок. В значній мірі зростає складність спільної розробки.

Як правило, менша кількість доступних бібліотек в порівнянні з сучасними індустріальними мовами програмування.

Відсутня переносимість програм на комп'ютери з іншою архітектурою і системою команд (окрім двійково-сумісних).

Історично можна розглядувати асемблер як друге покоління мов програмування ЕОМ (якщо першим рахувати машинний код). Недоліки асемблера, складність розробки на нім великих програмних комплексів привели до появи мов третього покоління - мов програмування високого рівня (Фортран, Лісп, Кобол, Паскаль, Сі і ін.). Саме мови програмування високого рівня і їх спадкоємці в основному використовуються в даний час в індустрії інформаційних технологій. Проте, мови асемблера зберігають свою нішу, обуславливаемую їх унікальними перевагами в частці ефективності і можливості повного використання специфічних засобів конкретної платформи.

На асемблері пишуться програми або фрагменти програм, для яких критично важливі:

- швидкодія (драйвери, ігри);

- об'єм використовуваної пам'яті (завантажувальні сектори, вбудовуване (англ. embedded) програмне забезпечення, програми для мікроконтролерів і процесорів з обмеженими ресурсами, віруси, програмні захисту).

З використанням програмування на асемблері проводяться:

- оптимізація критичних до швидкості ділянок програм написаних на мові високого рівня, такому як C++. Це особливо актуально для ігрових приставок, біля яких фіксована продуктивність, і для мультимедійних кодеків, які прагнуть робити менш ресурсоємними і популярнішими;

- створення операційних систем (ОС). ОС часто пишуть на Сі, мові, яка спеціально була створена для написання однієї з перших версій Unix. Апаратні залежні ділянки коду, такі, як завантажувач ОС, рівень абстрагування від апаратного забезпечення - HAL і ядро, часто пишуться на асемблері. Асемблерний коду в ядрах Windows або Linux зовсім небагато, оскільки автори прагнуть до переносимості і надійність, але проте він присутній. Деякі любительські ОС, такі, як MENUETOS, цілком написані на асемблері. При цьому MENUETOS поміщається на дискету і містить графічний багатовіконний інтерфейс;

- програмування мікроконтролерів (МК) і інших вбудовуваних процесорів. На думку професора Танненбаума, розвиток МК повторює історичний розвиток комп'ютерів новітнього часу. На сьогоднішній день для програмування МК вельми часто застосовують ассемблер;

- створення драйверів. Деякі ділянки драйверів, що взаємодіють з апаратним забезпеченням, програмують на асемблері. Хоча в цілому в даний час драйвери прагнуть писати на мовах високого рівня у зв'язку з підвищеними вимогами до надійності. Надійність для драйверів грає особливу роль, оскільки в Windows NT і Linux драйвери працюють в режимі ядра. Одна помилка може привести до краху системи;

- створення антивірусів і інших захисних программ;

- написання трансляторів мов програмування.

Програмування на мові асемблера характерний також для нелегальних сфер діяльності в ІТ, зокрема, з використанням асемблера проводяться: