Ви згадуєте про те, як, якщо код є специфічним для процесора, чому він повинен бути специфічним і для ОС. Це насправді більше цікавого питання, на яке припускають багато відповідей тут.
Модель безпеки процесора
Перша програма, запущена в більшості архітектур процесора, працює всередині того, що називається внутрішнім кільцем або кільцем 0 . Те, як конкретна арка CPU реалізує кільця, змінюється, але видно, що майже кожен сучасний процесор має щонайменше 2 режими роботи, один привілейований і працює з «голим металом» коду, який може виконувати будь-яку юридичну операцію, яку може виконувати процесор, а інший - ненадійний і працює захищений код, який може виконувати лише визначений безпечний набір можливостей. Деякі процесори мають набагато більшу деталізацію, але для безпечного використання VM необхідні принаймні 1 або 2 додаткові кільця (часто позначені негативними номерами), однак це не виходить за межі цієї відповіді.
Куди входить ОС
Ранні одиночні операційні завдання
У дуже ранніх DOS та інших ранніх системах, що базуються на одній задачі, весь код запускався на внутрішньому кільці, кожна програма, яку ви коли-небудь запускали, мала повну владу над усім комп’ютером і могла робити буквально все, щоби недобре поводилося, включаючи стирання всіх ваших даних або навіть пошкодження обладнання. в декількох крайніх випадках, таких як встановлення недійсних режимів відображення на дуже старих екранах дисплея, що ще гірше, це може бути викликано просто баггі-кодом без жодної злісті.
Цей код був насправді агностичним ОС, доки у вас був завантажувач, здатний завантажувати програму в пам'ять (досить простий для ранніх бінарних форматів), і код не покладався на жодні драйвери, реалізуючи весь апаратний доступ, до якого він повинен працювати. будь-яка ОС, якщо вона запускається в кільці 0. Зверніть увагу, дуже просту ОС на зразок цієї, як правило, називають монітором, якщо вона просто використовується для запуску інших програм і не пропонує додаткових функціональних можливостей.
Сучасні багатозадачні ОС
Більш сучасні операційні системи, включаючи UNIX , версії Windows, що починаються з NT та інші інші тепер неясні ОС, вирішили покращити цю ситуацію, користувачі хотіли додаткових функцій, таких як багатозадачність, щоб вони могли запускати відразу кілька додатків і захист, тому помилка ( або шкідливий код) у додатку більше не може завдати необмеженої шкоди машині та даним.
Це було зроблено за допомогою згаданих вище кілець, ОС займе єдине місце, що працює в кільці 0, а програми працюватимуть у зовнішніх ненадійних кільцях, лише в змозі виконувати обмежений набір операцій, які дозволяла ОС.
Однак ця підвищена утиліта та захист принесли ціну, програмам тепер довелося працювати з ОС для виконання завдань, які їм не дозволяли виконувати самі, вони вже не могли, наприклад, безпосередньо керувати жорстким диском, отримуючи доступ до його пам'яті та змінюючи довільну роботу даних, замість цього вони повинні були попросити ОС виконати для них ці завдання, щоб вони могли перевірити, чи їм дозволяється виконувати операцію, не змінюючи файли, які їм не належать, він також перевірить, чи дійсно операція дійсна і не залишать обладнання в невизначеному стані.
Кожна ОС вирішила іншу реалізацію цих захистів, частково спираючись на архітектуру, для якої ОС була розроблена, а частково ґрунтувалася на дизайні та принципах відповідної ОС, UNIX, наприклад, зосередила увагу на машинах, які корисні для багатокористувацького використання та зосереджені доступні функції для цього в той час, як Windows було розроблено простіше, працювати на більш повільному обладнання з одним користувачем. Те, як програми для простору користувачів також розмовляють з ОС, на X86 зовсім інший, як це було б, наприклад, на ARM або MIPS, змушуючи багатоплатформенну ОС приймати рішення, грунтуючись на потребі роботи над обладнанням, на яке вона орієнтована.
Ці специфічні взаємодії з ОС зазвичай називають "системними дзвінками" і охоплюють те, як програма простору користувача взаємодіє з обладнанням через ОС повністю, вони принципово відрізняються залежно від функції ОС, і, отже, програма, яка виконує свою роботу через системні дзвінки, потребує бути специфічним для ОС.
Завантажувач програми
Окрім системних викликів, кожна ОС забезпечує інший метод завантаження програми з вторинного носія інформації та в пам'ять , для того щоб бути завантаженою певною ОС, програма повинна містити спеціальний заголовок, який описує ОС, якою вона може бути завантажується і біжить.
Цей заголовок раніше був досить простим, що написання завантажувача для іншого формату було майже тривіальним, однак із сучасними форматами, такими як elf, які підтримують розширені функції, такі як динамічне посилання та слабкі декларації, зараз ОС майже неможливо спробувати завантажувати бінарні файли які не були призначені для цього, це означає, що навіть якщо не було несумісності системного виклику, надзвичайно важко навіть розмістити програму в операційному режимі таким чином, щоб її можна було запустити.
Бібліотеки
Програми рідко використовують системні дзвінки безпосередньо, проте вони майже виключно набувають своєї функціональності, хоча бібліотеки, які завершують системні виклики у трохи дружнішому форматі для мови програмування, наприклад, у C є стандартна бібліотека C та glibc під Linux та аналогічні та win32 libs під У Windows NT і вище, більшість інших мов програмування також мають подібні бібліотеки, які належним чином переносять функціональність системи.
Ці бібліотеки можуть певною мірою навіть подолати проблеми міжплатформенності, як описано вище. Існує цілий ряд бібліотек, які розроблені навколо надання єдиної платформи для додатків при внутрішньому керуванні дзвінками до широкого кола операційних систем, таких як SDL , це означає, що хоча програми не можуть бути бінарними сумісними, програми, які використовують ці бібліотеки, можуть мати загальне джерело між платформами, що робить перенос таким же простим, як і перекомпіляція.
Винятки з вищевикладеного
Незважаючи на все, що я тут говорив, були спроби подолати обмеження неможливості запуску програм на більш ніж одній операційній системі. Деякі хороші приклади - проект Wine, який успішно наслідував завантажувач програм win32, бінарний формат і системні бібліотеки, що дозволяє програмам Windows запускатися на різних UNIX. Також існує рівень сумісності, який дозволяє декільком операційним системам BSD UNIX запускати програмне забезпечення Linux, і, звичайно, власний лайф Apple, який дозволяє запускати старе програмне забезпечення MacOS під MacOS X.
Однак ці проекти працюють через величезний рівень зусиль, спрямованих на розробку вручну. Залежно від того, наскільки обидві ОС відрізняються, складність варіюється від досить невеликої лайки до майже повної емуляції іншої ОС, яка часто є більш складною, ніж написання всієї операційної системи сама по собі, і це виняток, а не правило.