Как стать автором
Обновить

Как работает компьютер: глубокое погружение (на примере Linux)

Уровень сложностиСложный
Время на прочтение48 мин
Количество просмотров140K
Всего голосов 151: ↑151 и ↓0+151
Комментарии36

Комментарии 36

Как работает компьютер, уровнем ниже: 1, 2, 3

Как глубока кроличья нора? (с)

Да, пожалуй если говорить про "глубокое погружение", то стоит опуститься и ниже. И до уровня дешифраторов/счетчиков/регистров, и до уровня стандартной логики. Другое дело, что на каждом шаге мы отбрасываем весьма существенные детали. Иначе это все не влезло бы в статью. Ибо "глубокому пониманию" надо учиться всю жизнь. И то не факт, что постигнешь.

Автору (или все же переводчику) стоит сказать спасибо. Материал полезный (хотя в таком виде и не уникальный). Правда, обычно мы идем все же от электронов к процессам в операционной системе. Но абсолютная высота горы не зависит от выбранной точки отсчета.

Вообще, очень забавно наблюдать тенденции.

В мои 16 (ох, давно это было!) фактически универсальной отмазкой было "Чего с тобой разговаривать - ты даже до конца не понимаешь, как работает транзистор!" При этом, да, черт возьми, мало кто и тогда мог объяснить почему транзистор с двумя PN-переходами работает, а два встречно включенных диода - нет. И замечательное видео от Veritasium (к слову - есть лучше, но как всегда - в нужный момент не найти) появится еще не скоро.

Сейчас далеко не каждый системный программист-контроллерщик представляет себе внутренности того же STM32 с точностью до хотя бы регистров-дешифраторов, но говоря уже о стандартной логике или транзисторах. Ограничиваемся уровнями на выводах и неким "черным ящиком", который их обеспечивает.

Хорошо, что есть желающие опуститься ниже, а не только расти в ширь (как это в основном принято у прикладных программистов). Впрочем, жизнь меняется. Для того чтобы слушать радио или смотреть телевизор не обязательно было знать про лампы и реле. И даже создавать отличные радиоспектакли и телепередачи вполне получалось без этих знаний. Отчасти поэтому приятно скромно чувствовать себя истинным строителем храма, что бы остальные не думали по этому поводу.

Сейчас далеко не каждый системный программист-контроллерщик представляет себе внутренности того же STM32 с точностью до хотя бы
регистров-дешифраторов, но говоря уже о стандартной логике или транзисторах. Ограничиваемся уровнями на выводах и неким "черным
ящиком", который их обеспечивает.

Тут, на мой взгляд, Вы слегка перегибаете. Внутреннее устройство современных вычислетильных ядер (даже таких "простых" как Cortex M1) доступно очень ограниченному кругу лиц. Так, что знать устойство МК до дешифратора мало кто может по чисто организационным причинам. Но вот слепить своё вычислительное ядро из стандартной логики или написать на Verilog-е свой вариант RISC-V, я считаю, полезно каждому программисту и, тем более, железячнику. Почему таких вещей не преподают в наших профильных ВУЗах я радикально не понимаю, зато матана всякого разного-безобразного - до блевоты.

На счет строителей храма. Программисты и электронщики это современные жрецы и заклинатели, без их участия не работает ни один "волшебный шар" и именно поэтому они имеют полное право на привелегии, ровно как и физики, химики и специалисты по материаловедению и обработке материалов. Но почему-то в реальной жизни все получается строго наоборот.

Да, это именно то самый типовой комментарий, с комментариями на тему "почему так". На самом деле, внутренне устройство именно ядра не так и сложно. Во всяком случае в первом приближении. Без оптимизаций для максимальной производительности. Давайте спросим у людей в теме - допустим у присутствующего здесь @YuriPanchul.

Применительно к ARM'ам вообще сложно не ядро. Сложны шины, соединяющие периферийные блоки. И тут да - декомпозиция их вниз до транзисторов - это та еще забава.

Но речь-то даже не об этом. Внутренне устройство банальных I2C/SPI/UART/I2S в терминах регистров и стандартной логики уже не всякий системщик себе представляет. А уж интерфейсы посложнее, типа MIPI или USB - и того меньше, а уж PCIe - вообще магия даже для достаточно продвинутых.

Любимая забава, современный аналог той самой, про "как работает транзистор". Вот Arduino, вот документация на AVR, вот SPI интерфейс (стр. 136). Нарисуй его реализацию, начиная с регистров из документации. Без процессорного ядра. Без шин. Как думаете, много ли могут? Чтоб не спросить "вообще кто-нить может"? Или хотя бы попытается? И это при том, что в документации даже очень подробная структурная схема приведена.

Ладно, бросаю я ворчать. Все равно ворчанием делу не поможешь.

Мне в свое время вот этот курс понравился. Тут начинается с физики, дальше устройство транзисторов, лоджик гейты и как на этом сделать простой процессор.

Отличная работа по систематизации, спасибо!
Сохраню в закладках для сына-самоделкина :-)

Более удобный формат статьи

Таблица на треть экрана, половину от которой занимает навигация - ни разу не удобнее.

Начал читать и тут же споткнулся: «Код, не загруженный в ОП, не может быть выполнен.»

Что такое ОП? Оперативная память? Почему не ОЗУ, как принято? И вообще это утверждение мне видится неверным, оперативную память сначала надо проинициализировать, прежде чем с ней работать, откуда будет выполняться код сразу после нажатия на кнопку питания?

Код, на загруженный в ОП(ОЗУ), может быть выполнен, если это код, прошитый в ПЗУ.

Неплохой материал для новичков, спасибо. Буду предлагать к почтению юным подаванам.

Вообщем, конечно, не плохо было бы углубиться еще на пару уровней в каждой главе. Но это уже будет не статья, я книга. И тут возник вопрос - а существует ли уже такая книга ?

Полистал оглавление "Архитектура компьютера" от Э. Таненбаум, вроде как присутствуют все темы, должна быть толковой.

У меня есть уже два толмуда со словосочетанием "архитектура компьютера" в названии: "Компьютерная архитектура. Количественный подход" от Хеннесси и Паттерсона и "Цифровая схемотехника и архитектура компьютера" от Харрис и Харрис. Обе сосредоточены на устройствах микропроцессоров и выше почти не поднимаются. Книга Харрисов хороша ровно до середины, где повествование резко перескакивает от аппаратного устройства ПЛИС и ПЛМ сразу на систему команд RISC-V. Зачем такой финт - не ясно. Почему нельзя было постепено рассмотреть куски процессора в отдельности и плавно подвести к системе команд и дальше к программированию ? Книга Паттерсона неплоха, но это скорее диссертация вперемешку с историческим очерком - дано описание развития архитектур в хронологическом порядке, рассмотрены некоторые типовые узлы процессоров, масса формул, выкладок и графиков. Подходит больше для научных сотруников, нежели студентам. :-)

У товарища Таненбаума есть еще такие же монументальные труды о сетях и операционнках (если нужно выше).

Вообще в Беларуси, почти на всех технарских компьютерных специальностях в универах по этим книгам учат. Интересно, думал что все про эти книги знают, но похоже это какая-то локальная особенность моей среды, раз вы раньше не натыкались.

Да нет, не локальная особенность. Может в вузах и не везде применяют, но просто гугля и ища книги по определенным темам не раз натыкалась именно на Таненбаума. Правда, его читать стоит, если действительно погружаешься глубоко в тематику, все же простому бэкендеру многовато будет. Но это мое имхо.

Проектирование 4004 началось в 1970 году, а не в конце 60х.

После выполнения всех инструкций, ЦП возвращает указатель в начало, и процесс повторяется. После выполнения инструкции указатель передвигается за нее в ОП и таким образом указывает на следующую инструкцию.

Как-то очень мутно написано. Если ЦП возвращает указатель в начало, значит программа зациклилась. Вся фишка в том что каждое чтение автоматически увеличивает счётчик команд ведь. Причем там внутри физически счётчик, никаких "указателей" и их "передвижения".

https://ru.wikipedia.org/wiki/Счётчик_команд

Всякие jmp, call, etc же как раз в него и пишут новые значения при вызове. А счётчик и правда вернётся в самое начало, если не будет инструкций его зацикливающих - т.е. пустая память, вся в nop.

На многих архитектурах и пользователю ничто не мешает напрямую писать в “счётчик команд”. Например, на PDP-11 этот самый PC (program counter) — это R7 (%7). А все регистры (8 штук) в PDP-11 равнозначны, там нет каких-то особых “аккумулятора”, “базы”, etc. Просто два регистра имеют “особенности” (R6/SP и R7/PC), но ничто не мешает их использовать точно так же, как и R0-R6.

В режиме ядра разрешено все: ЦП может выполнять любую поддерживаемую инструкцию и обращаться к любой памяти. В режиме пользователя разрешен только определенный набор инструкций, ввод/вывод (input/output, I/O) и доступ к памяти ограничены

А почему не выделить один процессор для ядра, а другой для user mode? Или одно из ядер процессора. И разделить память (шины) физически, чтобы из user mode в запрещенную память не залезть?

Нужно определиться в терминах. Суть в том, что нет такой единой сущности как "защищённая память". Есть физические страницы памяти, которые временно принадлежат каким-то процессам или ядру. И чтобы пресечь попытки одного процесса (из-за ошибки программиста или его злого умысла) подглядывать или что-то записывать в память другого процесса, ядро операционной системы "защищает" память каждого процесса от подобных действий. Придумано это было для разделения ресурсов (процессорных тактов, пространства оперативной памяти, доступа к переферицным устройствам).


Иначе, если отказаться от принципа разделения и защиты областей памяти каждого процесса друг от друга и, следуя вашему предложению, но довести его до логического конца, нужно будет строить некоторую аппаратную реализацию компьютера, в котором есть условно бесконечное количество процессоров, у каждого из которых есть своя собственная оперативная память и некий способ коммуникации между такими доменами. (Чем-то напоминает локальную сеть). Тогда каждый процесс получает свой выделенный процессор и всю оперативную память этого процессора, живёт в физическом адресном пространстве и ему никто не может помешать, как и он, собственно. А коммуникация с переферийными устройствами будет проходить через некоторый коммутатор-посредник, к которому имеет доступ каждый такой домен.

Т.е. уже сейчас это можно реализовать в примитивном виде на каких-нибудь одноплатниках, но тогда у вас дома будет столько маленьких компьютеров в локальной сети, сколько процессов вы захотите запустить. И при этом, т.к. ресурсы одноплатников ограниченны, если у процесса закончилась оперативная память, то увы и ах, вам нужно его запустить заново на другом таком одноплатнике, но с большим количеством оперативной памяти. Т.е. идея начинает выглядеть абсурдно, т.к. каждая новая вкладка в браузере будет требовать своего микрокомпьютера с достаточным количеством ресурсов. А чтобы управлять всей этой сворой железа будет нужен какой-нибудь отдельный компьютер-супервайзер-мастер-майнд, который будет распоряжаться доступными одноплатниками и руководить функциями загрузки и запуска процессов, а также диспетчеризацией обмена данными и убийством процессов.

Дальше перефразируя по М.М. Жванецкого: "Чем ядро сейчас и занято, но без этих хлопот". Т.е. виртуализируя адресное пространство оперативной памяти и работая супервайзером.

Не, ну речь не шла о том, что на каждый процесс свое процессорное ядро, это перебор. )
Один процессор и память для ядра, другой - для user mode с . ЧТобы пользовательский процесс физически не мог залезть в память ядра. Другой момент - а как организовать в этом случае взаимодействие между ядром и пользовательскими процессами.

Эм.. странный вопрос :) с какой целью? Ядро - это та же библиотека, но которой можно больше чем всем )

Ну это же классика:
Профессор: - Как работает трансформатор?
Студент: - У-у-у-у (изображает звук гудения трансформатора)
П: - Правильно
:))))

Слишком сумбурно. Такую обширную тему в такой объём не уместить.

В цикле работы ЦП ничего не сказано про обработку прерываний, а это ключевой момент для понимания работы компьютера.

Планировщики (schedulers) ОС используют чипы таймеров, такие как PIT, для запуска программных прерываний в целях многозадачности:

От таймера же прилетает аппаратное прерывание, а не программное.

Как работает компьютер:

Ну без Линуха это конечно не объяснить.

Ну дык смешались в кучу кони, люди...

Вообще-то, 4004 -- отнюдь не первый массовый ЦП. Это первый доступный (не секретный) микропроцессор, но компьютеры к моменту его появления выпускались уже порядка 25 лет -- и все они имели центральные процессоры. Ну а что они были выполнены (и ещё достаточно долго выполнялись) на целой куче деталек, а не в виде единственной микросхемы -- это технические подробности, а не принципиальное различие.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

За ссылку спс, в ней не хватает буквовки "l" в конце.

Подскажите, пожалуйста, зачем выделять ядру верхнюю память, если можно воспользоваться таблицей виртуальной памяти?

НЛО прилетело и опубликовало эту надпись здесь

Любой неофит найдёт в статье что-то новое и полезное, да. Но сама по себе статья — какой-то эклектичный микс поверхностности и глубинных раскопок.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории