У цій темі є чудові відповіді, але я просто хотів додати свою, оскільки у мене теж колись було те саме питання. (Також я хотів би зазначити, що книга, запропонована Джо-Інтернетом, є чудовим ресурсом.)
По-перше, питання про те, як працює комп’ютер? Це так: Введення -> Обчислення -> Вихід.
Спочатку розглянемо частину «Обчислити». Ми розглянемо, як працює вхід і вихід згодом.
Комп'ютер по суті складається з процесора (або процесора) і деякої пам'яті (або оперативної пам'яті). Пам'ять - це сукупність локацій, кожне з яких може зберігати кінцеву кількість біт, і кожне таке місце пам'яті може посилатися самим номером, це називається адресою пам'яті. Процесор - це гаджет, який може отримувати дані з пам’яті виконайте деякі операції на основі даних і запишіть деякі дані назад у пам’ять. Як процесор розбирається, що читати і що робити після зчитування даних із пам'яті?
Щоб відповісти на це, нам потрібно зрозуміти структуру процесора. Далі - досить простий погляд. Процесор по суті складається з двох частин. Один - це набір пам'яті, вбудований всередині процесора, який служить робочою пам'яттю. Вони називаються «регістри». Друга - це купа електронних машин, побудованих для виконання певних операцій з використанням даних у регістрах. Є два спеціальні регістри, що називаються «Програма лічильника» або ПК та «Реєстр інструкцій», або ІР Процесор вважає пам'ять розділеною на три частини. Перша частина - це «пам'ять програми», в якій зберігається виконана комп'ютерна програма. Друга - «пам'ять даних». Третій використовується для якихось спеціальних цілей, про це ми поговоримо пізніше. Лічильник програм містить місце наступної інструкції для читання з пам'яті програми. Лічильник інструкцій містить число, яке посилається на поточну операцію, що виконується. Кожна операція, яку може виконувати процесор, посилається на число, яке називається опкодом операції. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр. Лічильник інструкцій містить число, яке посилається на поточну операцію, що виконується. Кожна операція, яку може виконувати процесор, посилається на число, яке називається опкодом операції. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр. Лічильник інструкцій містить число, яке посилається на поточну операцію, що виконується. Кожна операція, яку може виконувати процесор, посилається на число, яке називається опкодом операції. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр. Кожна операція, яку може виконувати процесор, посилається на число, яке називається опкодом операції. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр. Кожна операція, яку може виконувати процесор, посилається на число, яке називається опкодом операції. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр. Як працює комп'ютер, він читає місце пам'яті, на яке посилається лічильник програм, в Реєстр інструкцій (і збільшує лічильник програм так, щоб він вказував на місце пам'яті наступної інструкції). Далі він зчитує Реєстр інструкцій та виконує бажану операцію. Наприклад, інструкцією може бути зчитування певного місця пам'яті в регістрі, або запис у якийсь реєстр, або виконання певної операції, використовуючи значення двох регістрів, і запис результатів у третій регістр.
Тепер, як комп'ютер виконує введення / вихід? Я дам дуже спрощену відповідь. Дивіться http://en.wikipedia.org/wiki/Input/output та http://en.wikipedia.org/wiki/Interrupt. для більш. Він використовує дві речі, третю частину пам'яті і щось, що називається Переривання. Кожен пристрій, підключений до комп'ютера, повинен мати можливість обмінюватися даними з процесором. Це робиться з використанням третьої частини пам'яті, згаданої раніше. Процесор виділяє шматочок пам'яті кожному пристрою, а пристрій і процесор спілкуються через цей фрагмент пам'яті. Але як процесор знає, яке розташування посилається на який пристрій і коли пристрою потрібно обмінюватися даними? Тут відбувається надходження переривань. Переривання - це, по суті, сигнал процесору, щоб призупинити те, що він є, і зберегти всі регістри у відомому місці, а потім почати робити щось інше. Там багато переривань, кожен ідентифікується унікальним числом. Для кожного переривання існує спеціальна програма, пов’язана з ним. Коли відбувається переривання, процесор виконує програму, відповідну перериванню. Тепер, залежно від біографії та того, як апаратні пристрої підключені до материнської плати комп'ютера, кожен пристрій отримує унікальний перерив і шматочок пам'яті. Під час завантаження операційної системи за допомогою біоси визначає місце переривання та пам'ять кожного пристрою та встановлює спеціальні програми для переривання для належного поводження з пристроями. Тому коли пристрою потрібні деякі дані або хочуть надіслати деякі дані, це сигналізує про перерву. Процесор призупиняє те, що робить, обробляє переривання і повертається до того, що робить. Існує багато видів переривань, таких як hdd, клавіатура тощо. Важливим із них є системний таймер, який викликає переривання через рівні проміжки часу. Також є опкоди, які можуть викликати переривання, звані програмними перериваннями.
Зараз ми майже можемо зрозуміти, як працює операційна система. Коли він завантажується, os встановлює таймер переривання, щоб він керував osм через рівні проміжки часу. Він також встановлює інші переривання для обробки інших пристроїв і т. Д. Тепер, коли на комп'ютері працює купа програм, а тимчасове переривання трапляється, осі отримує контроль і виконує важливі завдання, такі як управління процесами, управління пам’яттю і т.д. абстрактний спосіб доступу програм до апаратних пристроїв, а не дозволити їм отримати доступ безпосередньо до пристроїв. Коли програма хоче отримати доступ до пристрою, вона викликає якийсь код, наданий os, який потім спілкується з пристроєм. У них багато теорії, яка стосується паралельності, потоків, блокування, управління пам'яттю тощо.
Тепер теоретично можна написати програму безпосередньо, використовуючи опкоди. Це те, що називається машинним кодом. Це, очевидно, дуже боляче. Тепер мова складання для процесора - це не що інше, як мнемоніка для цих опкодів, що спрощує написання програм. Простий ассемблер - це програма, яка приймає програму, написану в зборі, і замінює мнемоніку відповідними опкодами.
Як ідеться про розробку процесора та мови складання. Щоб знати, що вам потрібно прочитати деякі книги з архітектури комп’ютера. (див. глави 1-7 книги, на яку посилається Джо-Інтернет). Це включає вивчення булевої алгебри, побудови простих комбінаторних схем для додавання, множення тощо, як побудувати пам'ять та послідовні схеми, як побудувати мікропроцесор тощо.
А тепер як писати комп'ютерні мови. Можна почати з написання простого асемблера в машинному коді. Потім використовуйте цей асемблер, щоб написати компілятор для простого підмножини C. Потім використовуйте цей підмножина C, щоб написати більш повну версію C. Нарешті, використовуйте C, щоб написати більш складну мову, наприклад python або C ++. Звичайно, щоб написати мову, ви повинні спершу її розробити (так само, як і для процесора). Ще раз подивіться на деякі підручники з цього приводу.
І як можна написати ос. Спочатку ви орієнтуєтесь на платформу, таку як x86. Тоді ви з'ясуєте, як вона завантажується і коли буде викликати ваш ос. Типовий ПК завантажується таким чином. Він запускається, і біос проводить деякі тести. Потім біос читає перший сектор hdd і завантажує вміст у певне місце в пам'яті. Потім він налаштовує процесор, щоб розпочати виконання цих завантажених даних. Це пункт, на який ви звертаєтесь. Типовий ос у цей момент завантажує спокій самої пам'яті. Потім він ініціалізує пристрої та налаштовує інші речі, і нарешті вітає вас з екраном входу.
Отже, щоб написати ОС, ви повинні написати "завантажувач". Потім потрібно написати код для обробки переривань і пристроїв. Потім ви повинні написати весь код для управління процесами, управління пристроями і т.д. І нарешті, ви повинні написати код, який читає програму з диска, налаштовує її як процес і починає виконувати її.
Звичайно, моя відповідь відверто спрощена і, мабуть, мало практична. На свій захист я зараз аспірант теорії, тому я багато чого забув. Але ви можете в Google багато цих речей і дізнатися більше.
lex
,yacc
іbison
.