Операционные системы урок 1 что такое компьютер и операционная система
Добрый день/вечер/ночь/утро! Есть один экспериментальный курс по операционным системам. Есть он в Стэнфордском университете. Но часть материалов доступно всем желающим. Помимо слайдов доступны полные описания практических занятий.
Чем этот курс отличается от прочих других? Большая часть кода пишется самостоятельно и выполняется на вполне реальном современном железе. В качестве целевой платформы выбран Raspberry Pi 3 model B. Т.е. достаточно актуальная архитектура AArch64. ARMv8 Cortex-A53, четыре ядра, 64-бита и вот это всё. В качестве основного языка программирования выбран Rust. Который безопасный, быстрый, без GC и так далее. Его, Rust, предполагается изучать во время курса.
Тут есть про диски, файловые системы, операции ввода-вывода, потоки /процессы, планирование, виртуальную память, защиту и безопасность, прерывания, параллелизм и синхронизацию. Как и в любом другом, уважающем себя курсе. Разница в актуальности материала и в количестве практики. Коддить придётся много.
8. Планирование выполнения задач. Диспетчеризация.
Вы изучите классические методы планирования процессов, а также сложности, возникающие вместе с ними.
Защита
Операционная система необходима в качестве механизма защиты, если вы запускаете несколько приложений одновременно. Также она ограничивает доступ к определенным ресурсам как программам, так и пользователям.
Например, что произойдет, если программе предоставится неограниченный доступ к памяти?
А если юзер попробует израсходовать все ресурсы?
Теперь немного о железе
Взаимодействие подавляющего большинства современных аппаратных устройств с ПО осуществляется через отображение его в память Memory-mapped I/O. Суть такова: с устройствами можно общаться так, будто это просто некая часть памяти. При этом предоставляется спецификация о том, что будет происходить при записи или чтении определённых адресов в памяти. Адреса обычно разделяются на кусочки по 32 или 64 бита, которые называют регистрами. Регистры могут быть доступны только для чтения из них, для записи или для того и другого сразу.
Как мы узнаем, какие регистры и для чего использовать, и где в памяти они находятся? Производители различных устройств пишут документацию на эти самые устройства. Обычно их зовут даташитами (data sheet), мануалами (device manual), ну или просто документацией. Нет какого либо общего широко распространённого формата для документирования устройств. Иногда документация может быть недостаточной или её может не быть вообще. Умение читать и понимать аппаратную документацию это вполне себе полезный скилл и в некотором роде даже искусство.
Определение
Операционная система — это программное обеспечение между приложением и оборудованием, то есть железными и не совсем составляющими компьютера. Основной её задачей является обеспечение оптимальной среды экзекуции для приложений. Стандартные функции ОС: предоставление разных уровней абстракций, защита и управление ресурсами. Разберём каждую отдельно.
Операционная система
Операционная система, сокращенно ОС — комплекс взаимосвязанных программ, предназначенных для управления ресурсами компьютера и организации взаимодействия пользователя с компьютером.
ОС добивается своей эффективности в первую очередь, через самую главную технику — технику виртуализации. ОС взаимодействует с физическим ресурсом (процессором, памятью, диском и тому подобные) и трансформирует его в более общую, с большими возможностями и более простую для использования форму самого себя. Поэтому для общего понимания, можно очень грубо сравнить операционную систему с виртуальной машиной.
Для того чтобы позволять пользователям давать команды операционной системе и таким образом использовать возможности виртуальной машины (такие как: запуск программы, выделение памяти, доступ к файлу и так далее), операционная система предоставляет некоторый интерфейс, называемый API (application programming interface) и к которому можно делать вызовы (call). Типичная операционная система дает возможность сделать сотни системных вызовов.
И наконец, поскольку виртуализация позволяет множеству программ работать (таким образом, совместно использовать CPU), и одновременно получать доступ к их инструкциям и данным (тем самым разделяя память), а также получать доступ к дискам (таким образом, совместно использовать устройства ввода-вывода), операционную систему еще называют менеджером ресурсов. Каждый процессор, диск и память это ресурс системы и таким образом одной из ролей операционной системы становится задача по управлению этими ресурсами, делая это эффективно, честно или, наоборот, в зависимости от задачи, для которой эта операционная система разработана.
Установка Rust и Xargo
Для того, чтоб компилять программы на Rust, нам следует этот самый компейлятор установить. Помимо этого мы установим xargo , который является обёрткой, связанной с менеджером пакетов cargo . Xargo позволяет нам компейлировать наш код для Rasbperry Pi и всего такого.
Теперь у нас есть вполне себе рабочий компилятор Rust.
Фон-Неймановская модель вычисления
Описанная нами упрощенная форма работы похожа на Фон-Неймановскую модель вычислений. Фон-Нейман это один из пионеров компьютерных систем, также он один из авторов теории игр. Во время работы программы происходит еще куча других событий, работает множество других процессов и сторонней логики, основная цель которых — упрощение запуска, работы и обслуживания системы.
Существует набор программного обеспечения, который ответственен за простоту запуска программ (или даже позволяющий запускать несколько программ одновременно), он позволяет программам разделять одну и ту же память, а так же взаимодействовать с различными устройствами. Такой набор ПО (программного обеспечения) по сути и называют операционной системой и в его задачи входит отслеживание того, чтобы система работала корректно и эффективно, а также обеспечение простоты управления этой системой.
Согласованность
Еще одна из важных тем в рамках операционных систем — согласованность. Этот термин используется, когда речь идет о проблемах в системе, которые могут возникать при работе со многими вещами одновременно в пределах одной программы. Проблемы согласованности возникают даже в самой операционной системе. В предыдущих примерах с виртуализацией памяти и процессора, мы поняли, что ОС управляет многими вещами одновременно — запускает первый процесс, затем второй и так далее. Как оказалось, такое поведение может привести к некоторым проблемам. Так, например современные многопоточные программы испытывают такие трудности.
Рассмотрим следующую программу:
Программа в главной функции создает два потока, используя вызов Pthread_create(). В данном примере о потоке можно думать как о функции, запущенной в одном пространстве памяти рядом с другими функциями, причем количество запущенных одновременно функций явно более одной. В данном примере каждый поток стартует и выполняет функцию worker() которая в свою очередь просто инкрементирует переменную,.
Запустим эту программу с аргументом 1000. Как вы уже могли догадаться, результатом должно стать 2000, поскольку каждый поток инкрементировал переменную 1000 раз. Однако все не так просто. Попробуем запустить программу с числом повторений на порядок больше.
Подавая на вход число, например, 100000 мы ожидаем увидеть на выходе число 200000. Однако, запустив число 100000 несколько раз, мы не только не увидим правильный ответ, но и получим разные неправильные ответы. Разгадка кроется в том, что для увеличения числа требуется три операции — извлечение числа из памяти, инкрементация и затем запись числа обратно. Поскольку все эти инструкции не осуществляются атомарно (все одновременно), такие странные вещи могут происходить. Эта проблема называется в программировании race condition — состояние гонки. Когда неизвестные силы в неизвестный момент могут повлиять на выполнение каких-либо ваших операций.
Подключение малинки
Теперь подключаем Raspberry Pi к CP2102. Вот таблица соответствия разъёмов:
Разъёмы на CP2102 | Разъёмы на Raspberry Pi |
---|---|
+5v | 4 |
GND | 6 |
RXD | 8 |
TXD | 10 |
Нумерация пинов на малинке (ещё есть интерактивная версия):
Всё вместе будет выглядеть так (цвета проводов можно выбирать произвольно):
Важно: проверьте и перепроверьте соединения перед подключением этого всего к компьютеру. Нам нужна свежая малинка, а не подгоревшее варенье.
Если есть уверенность в правильности сопряжения малинки и переходника — можно таки подключить CP2102 к компу.
Настройка драйверов
На линуксе всё должно заработать сразу из коробки. На маках потребуется установить драйвер. Скачиваем этот архив и распаковываем. Запускаем SiLabsUSBDriverDisk.dmg и соглашаемся с пунктами о продаже души по лицензии. После этого на подмонтированном томе запускаем Silicon Labs VPC Driver.pkg . Устанавливаем и перезагружаемся.
Попробуйте вставить CP2102 в свободный USB-слот. Если всё работает, то должны появится соответствующие файлы в /dev . В случае мака /dev/tty.SLAB_USBtoUART . В случае линукса что-то вроде /dev/ttyUSB0 . Запишите — пригодится. Вынимаем переходник.
Фаза 4: Ржавчина
В этот раз мы будем писать программу, подобную gpio16-blink.bin , но уже на Rust. Код пишем в phase4/src/lib.rs .
История в датах
1950 — Single user programmable computer.
Пользователи должны были регистрироваться для доступа к компьютеру, который находился в лаборатории или, скажем, в вычислительном центре. Им выдавались интервалы времени, в которые они единолично могли запускать свои программы (например, с двух до трёх часов ночи). В это время никто иной не имел доступа к компьютеру. Для запуска программы надо было загрузить ее в память поверх старых данных. Операционная система тогда была не нужна, так как всегда запускалась всего одна программа и существовал лишь один участок памяти. Программы хранились на перфокартах. Для запуска была необходима сама программа, данные и компилятор языка программирования (тоже хранящийся на перфокартах). Результат программы переносили на другой набор перфокарт. Из-за роста спроса на использование таких компьютеров вскоре только работники в белых халатах стали иметь доступ к "священной" машине.
1955 — Пакетная обработка (batch processing).
Очень скоро стало понятно, что такое использование компьютера очень неэффективно и неудобно для пользователей, так как сидеть в лаборатории в 3 часа ночи в одиночестве и ждать результатов — такая себе перспектива. К тому же, это затратно в плане времени, ведь компьютер не был занят никакими процессами во время настройки и загрузки программы.
Именно поэтому была представлена модель пакетной обработки. Идея заключалась в том, чтобы комбинировать перфокарты нескольких пользователей в одну колоду.
Все программы запускались одна за другой, и пользователь получал результат после того, как все перфокарты были обработаны. Тоже не совсем эффективно, ведь такая система неинтерактивна, и если в программе был баг, то узнать об этом в процессе было невозможно.
1965 — IBM System/360
Этот мэйнфрейм со стандартной архитектурой был разработан для научного и коммерческого программирования. OS/360 был операционной системой System/360.
1959-1965 — Time-Sharing OS: CTSS (Compatible Time Sharing System)
Произошел переход от перфокарт к системе распределения времени. Такие компьютеры обладали четырьмя консолями и разными оболочками. Пользователи могли дебажить интерактивно, в процессе запуска программы. Однако такие системы не отличались хорошей защитой.
1963-1970 — Time-sharing OS: Multics
MIT, Bell Labs и GE изменили дизайн всего. Появилось кастомизированное оборудование, увидели свет новые языки программирования и операционные системы. Несмотря на то, что эта система никогда по-настоящему не работала, она является самой влиятельной ОС, так как положила начало Unix, MacOS, Linux и Windows.
1969 — Time-sharing OS: Unix
Кен и Деннис
Кен Томпсон и Деннис Ритчи (Bell Labs) разработали операционную систему Unix. Система написана на языке высокого уровня — языке С. Unix обладала простой оболочкой, которую можно было заменить на другую. Файловая система представляла собой структуру-дерево, а сами файлы были имплементированы в виде неструктурированных последовательностей байтов. Также операционная система обладала многопроцессорностью: одни процессы могли создавать другие. В приоритете была интерактивная система. Множество пользователей имели одновременный доступ к компьютеру через неинтеллектуальные терминалы. В первой Unix системе не было компоновщика. Наверно, этот концепт не был известен в то время. Но вполне возможно, что его просто забыли имплементировать. И такое бывает.
Эволюция Unix и Unix-like систем с 1969 по 2008 год
IEEE разработал стандарт для Unix систем (POSIX), чтобы избежать хаоса. Этот стандарт представляет собой набор системных вызовов, который должен поддерживаться операционными системами Unix.
Запуск
Raspberry Pi подгружает программки с microSD-карточки во время включения. Прямо сейчас мы разберёмся, как это готовить.
Для начала нам нужно скинуть на microSD-шку файлики из склонированного репозитория. А именно те, которые лежат в папке files/firmware . Т.е. bootcode.bin , config.txt и start.elf . Скопировать их следует в корень флеш-карты. Если вдруг в склонированном репозитории нет этих файликов — вы забыли про make fetch .
Зачем нужны bootcode.bin , config.txt и start.elf ?
Это всё является загрузчиком для малинки. bootcode.bin — первый загрузчик. Его задача — загрузить start.elf . Который настраивает процессор в соответствии с содержимым файла config.txt . После этого он загружает kernel8.img и передаёт ему управление. Кстати где он?
Теперь копируем files/activity-led-blink.bin из репо в корень флеш-карты и даём этому файлику имя kernel8.img . Размонтируем карту и вытаскиваем. Убеждаемся, что малинка отключена. Затем вставляем карточку в малинку и подключаем малинку к питанию. Мы должны увидеть мигающий светодиод на малинке и на CP2102-переходнике. Мигание последнего означает, что там передаются некие данные.
Данные? Какие данные? Для того, чтоб посмотреть их нам нужно подключить эмулятор последовательного терминала к CP2102 и прочитать, что там происходит. Будем использовать screen ибо он установлен и на Linux, и на macOS. Вспомните путь к устройству из папки /dev и запустите
В Linux может потребоваться использовать sudo для запуска этой команды. Впрочем можно добавить своего пользователя в группу dialout и не писать перед этой командой sudo постоянно:
Так или иначе, но мы должны увидеть приветствия от малинки. Для выхода из screen следует нажать k , а затем ответить y на предложение о выходе.
Фаза 3: Няшный Си
На этот раз мы будем писать на сях прогу, которая будет делать тоже, что и gpio16-blink.bin . Для того, чтоб иметь возможность компилировать няшную сишечку под малинку нам нужен кросс-компилятор под aarch64-none-elf .
Установка кросс-компилятора
Нам нужно установить GNU-тулчейн для под архитектуру aarch64-none-elf (компилятор gcc и его компанию вроде objcopy).
Под macOS
Для начала стоит установить менеджер пакетов homebrew. Если уже установлен, то эту часть можно пропустить.
- Установите инструменты Xcode для командной строки. Появится диалоговое окно. Когда появится — нажмите "Установить", "Продолжить" или что там обычно.
- Запустите скрипт установки Homebrew. Оный проведет вас через остальную часть процесса установки.
Теперь установим тулчейн aarch64-none-elf используя homebrew.
Проверим, всё ли правильно установлено:
Под Linux
- Загрузим и распакуем aarch64-none-elf-linux-x64.tar.gz. После этого переместим arch64-none-elf в /usr/local/bin :
- Добавим /usr/local/bin/aarch64-none-elf/bin к переменной окружения PATH . Как именно — это зависит от вашего конкретного диструбутива Linux. В большинстве случаев следует добавить в ~/.profile следующее:
- Проверяем, всё ли нормально. В качетве вывода мы должны получить версию gcc и всё такое.
Можно собрать самому из исходников, если такое желание возникнет. Подробнее вот тут.
Продолжение развития
IBM Personal Computer
Данный экспонат обладал микропроцессором Intel 8088 4.77 MHz и имел цветной монитор. Его стоимость составляла 6000$. Открытая архитектура позволяла юзерам писать собственный софт и производить оборудование.
MS-DOS
Ранняя DOS была очень примитивной, если так можно сказать об операционной системе. Microsoft разработала основанную на GUI систему Windows, которая работала на MS-DOS (в самом начале OC Windows была простым GUI для MS-DOS). Windows 95 и 98 были GUI операционными системами, разработанными на 16-bit Intel ассемблере. В 90-х также вышла в свет ОС Windows NT ( “New Technology”) .За Windows 98 появились Windows 2000 (Windows NT версия 5.0), Windows XP, Windows Vista и Windows 7.
1991 — Linux
Open source операционная система, которую разработал Линус Торвальдс на основе 80386 процессора. Linux v.01 запускалась на ограниченном количестве устройств и не имела абсолютно никакого нетворкинга. Зато с соответствующей Unix поддержкой ;)
Все последующие релизы обозначались четным числом, если версия считалась успешной, и нечетным — если там были косяки и недоработки.
Зоопарк Операционных Систем
После развития разных ОС основной целью стала разработка уникальной операционной системы, которая запускалась бы на всех устройствах. Все перечисленные выше ОС предназначены лишь для какого-то определенного вида оборудования.
Мэйнфреймные ОS
Стали развиваться мэйнфреймные операционные системы. Мэйнфрейм — это огромная компьютерная система, обычно занимающая целую комнату. Она довольно дорогая (>1 млн EUR). Такие компьютеры содержат много процессоров (доходит до 64) и еще больше дисков (>1000, иногда даже >65 000).
RAM у таких устройств соответствующая (> 100 GB). Такие системы очень надежные: никаких ребутов в течение 10 лет, а то и дольше. Они оптимизированы для обработки больших данных на высокой скорости. Мэйнфреймы обычно продаются вместе с ПО: System/z с z/OS, IBM 390 с OS/390, IBM 360 с OS/360.
Серверные ОS.
Подобное серверное устройство подключено к сети. Непринципиально, к какой (например, к TCP/IP или SNA) . Такое устройство должно предоставлять услуги множеству пользователей (email-server, web-server, printing-server, Application-server и другие). Эта система должна быть всегда доступна для клиента, то есть, downtime не должно составлять более одного часа в неделю (зависит от конкретного случая, конечно). Также вид платформ не должен влиять на доступ пользователей к серверу. Серверные системы работают на Unix/Linux (Enterprise Edition) операционных системах.
Personal Computer ОS
Модифицированная серверная операционная система с GUI. Обычные ОС на таких устройствах — Linux, Android, Windows 98, XP, Windows 8, Mac OS (BSD Unix), iOS. Такая система обеспечивает эффективную коммуникацию с пользователем через GUI. Ещё одним преимуществом является доступ к интернету. Не на последнем месте находятся мобильность и выполнение операций offline, так как было бы проблематично положить мэйнфрейм в рюкзак. Зато так можно сделать с ноутбуком.
Real-Time ОS
Такие системы выполняют задания за определенный период времени и могут реагировать на изменения. Обычно они нуждаются в приложениях контроля. Real-Time OS встречается, например, в контрольной системе ядерного реактора или в системах наблюдения. Также данный вид ОС используют во многих медицинских приборах. Параллелизм является проблемой, так как надо обеспечить 100%-ую гарантию того, что какой-нибудь процесс не будет прерван другим. Типичным ПО для таких систем являются Realtime Linux, QNX, VxWorks.
Embedded Systems OS
Встраиваемые системы (Embedded Systems) представляют собой малые или очень маленькие вычислительные системы. К малым относятся мобильные телефоны. Они похожи на PC, но у них более ограниченный функционал. Эти системы работают на Embedded Linux, Windows CE, Symbian. К очень маленьким можно отнести микроконтроллеры и сенсоры. Они предназначены для выполнения узкого спектра задач. ПО: VxWorks, QNX, TinyOS.
Chip Cards OS
Это, наверно, самые маленькие системы, которые встречаются в кредитных картах. У них тоже есть ЦП и память, но микроскопические. Такие системы чаще всего используются в целях безопасности. Некоторые модели ориентированы на Java.
Для более углубленного изучения операционных систем советуем вам ознакомиться с нашими статьями 7 книг по UNIX/Linux и UNIX-подобная операционная система: пишем ядро на языке C.
Привет, Хабр! Хочу представить вашему вниманию серию статей-переводов одной интересной на мой взгляд литературы — OSTEP. В этом материале рассматривается достаточно глубоко работа unix-подобных операционных систем, а именно — работа с процессами, различными планировщиками, памятью и прочиими подобными компонентами, которые составляют современную ОС. Оригинал всех материалов вы можете посмотреть вот тут. Прошу учесть, что перевод выполнен непрофессионально (достаточно вольно), но надеюсь общий смысл я сохранил.
Лабораторные работы по данному предмету можно найти вот тут:
Фаза 2: Мигаем светодиодом
На этом этапе мы подключим 16-й вывод GPIO (физический контакт №36) малинки к светодиодику на макетке. Проверим его работу используя предварительно подготовленный бинарник с прошивкой. Убедитесь что малинка отключена.
GPIO: General Purpose I/O (Ввод-вывод общего назначения)
Как следует из названия, GPIO является общим механизмом передачи данных/сигналов между какими либо двумя устройствами через электрические контакты.
GPIO-выводы на малинке могут работать как входы или как выходы. Когда контакт является выходным, его можно включить или выключить. Под включением контакта подразумевается, что с него можно взять 3.3 вольта. Под выключением подразумевается, что через этот контакт ток не идёт. Когда же GPIO-контакт является входным, то малинка проверяет, есть ли на оном 3.3 вольта, либо же нет.
Эти контакты невероятно, умопомрачительно универсальны и их можно использовать для реализации огромного спектра различных функций. Подробности можно узнать в документации. Документация не просто так прилагается. Её можно, а иногда необходимо, читать по ходу курса.
Написание кода
В каталоге phase3/ репы есть заготовка кода для построения двоичного файла для малинки. Пока обойдёмся без объяснения того, зачем нужны crt0.S , layout.ld и Makefile . Вместо этого сосредоточимся на blinky.c . В нём вы обнаружите, что уже указаны адреса всех трёх необходимых нам регистров в верхней части. Кроме этого там есть парочка функций, которыми можно создать временную задержку. Задача состоит в том, чтоб дополнить функцию main так, чтобы вывод №16 GPIO был настроен как выход, а затем то включался, то выключался для мигания светодиодом.
Когда код будет готов — его следует протестировать. Для начала скомпилируйте его, запустив make , находясь в директории phase3/ . Если всё хорошо и нет ошибок, то создастся файлик blinky.bin . Переименовываем его в kernel8.img , копируем на microSD-карточку и запускаем это всё на малинке. Если уже есть работающий kernel8.img — можно переходить к следующей фазе.
Настройка/включение/выключение пинов могут быть реализованы за одну строку кода.
Тут пригодятся операторы
В сишечке можно использовать шестнадцатеричную и двоичную формы. Для числа три что-то вроде 0x03 и 0b011 соответственно.
Примечание переводчика
Если вы хотели увидеть дословный перевод, то его не будет. Вместо этого я буду стараться сделать текст полезным и понятным. Например в тех местах, которые актуальны только для студентов Стэнфорда, я помещу информацию полезную остальным. Тут может быть немного сленга, чуточку несвязанных с оригиналом иллюстраций и небольшое количество дополнительных комментариев. В угоду читабельности тут не будет явных Примечаний Переводчика™. Текст можно считать художественным переводом или статьёй по мотивам. Я не сварщик — не обижусь.
Откуда я узнал про этот курс? Некто выложил ссылочку на Hacker News. Я случайно увидел и проникся. Немного сам тыкал материалы курса и в итоге решился это дело переводить.
Виртуализация памяти
Теперь давайте рассмотрим память. Физическая модель памяти в современных системах представляется как массив байт. Для чтения из памяти нужно указать адрес ячейки, чтобы получить к ней доступ. Чтобы записать или обновить данные нужно также указать данные и адрес ячейки, куда их записать.
Обращения к памяти происходит постоянно в процессе работы программы. Программа хранит в памяти всю ее структуру данных, и обращается к ней, выполняя различные инструкции. Инструкции между тем тоже хранятся в памяти, поэтому обращение к ней происходит также на каждый запрос к следующей инструкции.
Вызов malloc()
Программа делает несколько вещей. Во-первых, выделяет некоторый объем памяти (строка 7), затем выводит адрес выделенной ячейки (строка 9), записывает ноль в первый слот выделенной памяти. Далее программа входит в цикл, в котором инкрементирует значение, записанное в памяти по адресу в переменной “p”. Также она выводит идентификатор процесса самого себя. Идентификатор процесса уникален для каждого запущенного процесса. Запустив же несколько копий, мы наткнемся на интересный результат: В первом случае, если не сделать ничего и просто запустить несколько копий, то адреса будут разными. Но это же не попадает под нашу теорию! Верно, поскольку в современных дистрибутивах включена по умолчанию функция рандомизации памяти. Если ее отключить, получим ожидаемый результат — адреса памяти у двух одновременно работающих программ будут совпадать.
В итоге получается, что две независимые программы работают со своими собственными приватными адресными пространствами, которые в свою очередь отображаются операционной системой в физической памяти. Поэтому использование адресов памяти в пределах одной программы никак не будет затрагивать другие и каждой программе кажется, что у нее собственный кусок физической памяти, целиком отданный в ее распоряжение. Реальность, однако, такова, что физическая память — разделяемый ресурс, управление которым осуществляет операционная система.
2. Эволюция ОС. Фундаментальные проблемы. Слои абстракции.
Главные проблемы компьютера и разработки ОС.
Интерфейс GPIO в памяти
Документацию на многие периферийные устройства, которые есть у Rasbperry Pi, можно найти в документе BCM2837 ARM Peripherals Manual. Про GPIO можно почитать на 89 странице.
Падажжи, там же местами про BCM2835, а у нас BCM2837. Это норм?
Если открыть руководство, то там можно увидеть во многих местах упоминание BCM2835. Мы просто взяли руководство к нему и исправили некоторые ошибки. Ну и заголовок поменяли на BCM2837. BCM2837 и BCM2835 имеют одинаковые периферийные устройства с теми же относительными адресами в памяти. Основное отличие в общей конфигурации физической памяти. Базовый физический адрес периферийных устройств на BCM2837 — 0x3F000000 , в отличии от 0x20000000 в BCM2835. Однако оба чипа отображают эти адреса на 0x7E000000 . Вкратце на BCM2837 "периферийный" адрес 0x7EXXXXXX будет находится на физическом адресе 0x3FXXXXXX . Приведённая документация изменена с учётом этого.
Для нашей задачи нам достаточно следующих регистров:
имя | адрес | описание | размер | чтение/запись |
---|---|---|---|---|
GPFSEL1 | 0x7E200004 | GPIO Function Select 1 | 32 бита | и то и другое |
GPSET0 | 0x7E20001C | GPIO Pin Output Set 0 | 32 бита | только запись |
GPCLR0 | 0x7E200028 | GPIO Pin Output Clear 0 | 32 бита | только запись |
Тащемто это непосредственно скопировано прямо из документации со страницы 90.
Теперь почитайте документацию для регистра GPFSELn на страницах 91 и 92. Мы записываем в этот регистр для настройки пинов в качестве выходных или входных. Какое должно быть значение в каждом поле регистра GPFSEL1 для настройки вывода №16 GPIO, чтоб он стал выходом?
Теперь опять читаем документацию на странице 95. Про регистры GPSET0 и GPCLR0 . Мы записываем в регистр GPSET0 для включения контакта. А в GPCLR0 для выключения. Какое значение нам требуется записать в эти регистры для включения/выключения вывода 16?
3. Представление и обработка процессов. Структуры данных. Очереди.
Здесь вам помогут разобраться в способах представления задач в ОС.
6. Дедлок. Проблема обедающих философов.
Видео о проблемах, связанных с ограниченными ресурсами и несколькими процессами.
9. Ввод и вывод
В заключительном видео курса будут рассмотрены принципы работы с устройствами ввода и вывода.
Интересует история развития операционных систем? Супер! Вы узнаете, почему "Яблоко" круче "Окон", и разберетесь в принципах работы основных ОС.
4. Треды. SMP. Микроядро
Главная цель очередного видео – объяснить, что такое потоки и чем они отличаются от процессов. Также вы узнаете, что такое категории параллельных машин и микроядро.
Если вы хотели узнать, как решить проблемы, которые могут возникнуть с работой множества процессов на одной системе.
Виртуализация CPU
Она не выполняет каких-то особых действий, по сути всё что она делает — вызывает функцию spin(), задача которой циклическая проверка времени и возврат, после того как прошла одна секунда. Таким образом, она повторяет бесконечно строку, которую пользователь передал в качестве аргумента.
Запустим эту программу, и передадим ей аргументом символ “А”. Результат получается не особо интересный — система просто выполняет программу, которая периодически выводит на экран символ “А”.
Теперь попробуем вариант, когда запущено множество экземпляров одной и той же программы, но выводящие разные буквы, чтобы было понятнее. В этом случае, результат получится несколько иной. Не смотря на то, что у нас один процессор, программа выполняется одновременно. Как же так получается? А получается что операционная система, не без помощи возможностей оборудования, создает иллюзию. Иллюзию того, что в системе есть несколько виртуальных процессоров, превращая один физический процессор в теоретически бесконечное количество и тем самым позволяя, программам на вид выполняться одновременно. Такую иллюзию и называют Виртуализацией CPU.
Подобная картина порождает много вопросов, например, если несколько программ желают запуститься одновременно, то какая именно будет запущена? За этот вопрос отвечают “политики” ОС. Политики используются во многих местах ОС и отвечают на подобные вопросы, а так же являются базовыми механизмами, которые ОС воплощает. Отсюда и роль ОС как ресурсного менеджера.
Фаза 0: Начало работы
Перед выполнением курса следует достать себе в непосредственное пользование unix-подобную операционную систему. Это может быть Linux, BSD или macOS с установленными git , wget , tar , screen и make . Теоретически может заработать в Windows 10 с подсистемой linux, но никто не проверял наверняка. По крайней мере такая конфигурация не поддерживается. Т.е. для виндузятников нет готовых рецептов и рекомендуется установить Ubuntu LST или Fedora.
Из железа нам потребуются:
- Raspberry Pi 3 model B (обязательно с процем BCM2837)
- Макетная плата, она же доска для прототипирования
- microSD карточка (плюс адаптер/переходник)
- USB-UART переходник (CP2102 USB TTL)
- Десяток многоцветных светодиодов
- Резисторы на 100 Ом и на 1 кОм по четыре штуки
- проводки
В обсуждении на reddit есть ссылочки на amazon с тем, что может потребоваться. Впрочем всё это можно купить в любом другом магазине. В том числе и в офлайне. Кроме этого всего можно докупить ещё каких либо компонентов на свой вкус.
Внимание: малинка чувствительна к электростатике. Старайтесь не трогать голыми руками контакты. Вас током не убьёт и даже не поцарапает, а вот саму малинку вполне себе может вывести из строя. Заземляйтесь.
Когда это всё есть в наличии можно стянуть код задания:
Не стесняйтесь исследовать содержимое самостоятельно.
Написание кода
Для написания кода в файле phase4/src/lib.rs нужно знать по крайней мере следующие конструкции:
1) Вы можете читать из и писать в то, что находится за голыми указателями ( *mut T ) при помощи методов read_volatile() и write_volatile() . Например у нас объявлено такое:
Мы можем записать 32-разрядное целое число без знака с адресом 0x12 в ячейку с адресом 0x34 примерно вот так:
2) Локальные переменные обявляются при помощи конструкции let имя_переменной = некое_выражение; .
Можно прочитать A из предыдущего примера (т.е. значение, расположенное по адресу 0x12 ) в переменную вот таким образом:
3) Вызвать функцию fn f(param: usize); можно вот так: f(123); .
4) Блок loop можно использовать для бесконечного повторения чего либо:
5) В Rust есть следующие побитовые операторы:
Теперь вы готовы помигать светодиодом из кода на Rust. Код пишем в phase4/src/lib.rs . Переведите сишный код в аналогичный rust-код (в функции kmain ). Тут уже объявлены необходимые регистры и функция "сна", которая создаёт задержку на некоторое время. Используйте это всё.
Когда будете готовы проверить свою прогу, скомпилируйте её, запустив make в каталоге phase4 . Если всё нормально, то создастся файл build/blinky.bin , который переименовываем в kernel8.img и кладём на microSD-карточку, которую затем вставляем в малинку. Когда светодиодик снова замигает — можно считать, что данная часть туториала завершена.
Обращаем Ваше внимание, что в соответствии с Федеральным законом N 273-ФЗ «Об образовании в Российской Федерации» в организациях, осуществляющих образовательную деятельность, организовывается обучение и воспитание обучающихся с ОВЗ как совместно с другими обучающимися, так и в отдельных классах или группах.
Рабочие листы и материалы для учителей и воспитателей
Более 2 500 дидактических материалов для школьного и домашнего обучения
Столичный центр образовательных технологий г. Москва
Получите квалификацию учитель математики за 2 месяца
от 3 170 руб. 1900 руб.
Количество часов 300 ч. / 600 ч.
Успеть записаться со скидкой
Форма обучения дистанционная
- Онлайн
формат - Диплом
гособразца - Помощь в трудоустройстве
Видеолекции для
профессионалов
- Свидетельства для портфолио
- Вечный доступ за 120 рублей
- 311 видеолекции для каждого
Операционные системы. Основные определения
Операционная система (ОС) - это программа, которая обеспечивает возможность рационального использования оборудования компьютера удобным для пользователя образом.
Структура вычислительной системы
Из чего состоит любая вычислительная система? В первую очередь, это hardware, или техническое обеспечение: процессор, память, монитор, дисковые устройства и т.д., обычно объединенные магистральным соединением, которое называется шиной
Во вторую очередь это программное обеспечение. Все программное обеспечение принято делить на две части: прикладное и системное.
К прикладному программному обеспечению, как правило, относятся разнообразные банковские и прочие business программы, игры, текстовые процессоры, и т.п.
Под системным программным обеспечением обычно понимают программы, способствующие функционированию и разработке прикладных программ.
Деление на прикладное и системное программное обеспечение является отчасти условным и зависит от того, кто осуществляет такое деление.
Так, обычный пользователь, неискушённый в программировании, может считать Microsoft Word системной программой, а с точки зрения программиста это приложение. Компилятор языка Си для обычного программиста это системная программа, а для системного прикладная. Несмотря на эту нечеткую грань, эту ситуацию можно отобразить в виде последовательности слоев:
Операционная система как виртуальная машина
Архитектура большинства компьютеров на уровне машинных команд очень неудобна для ее использования прикладными программами. Например, работа с диском предполагает знакомство с внутренним устройством его электронного компонента - контроллера для ввода команд вращения диска, поиска и форматирования дорожек, чтения и записи секторов и т.д. Ясно, что средний программист не в состоянии учитывать все особенности работы оборудования (в современной терминологии заниматься разработкой драйверов устройств), а должен иметь простую высокоуровневую абстракцию, скажем, представляя информационное пространство диска как набор файлов
Файл можно открывать для чтения или записи, использовать для получения или сброса информации, а потом закрывать. Это концептуально проще, чем заботиться о деталях перемещения головок дисков или организации работы мотора. Аналогичным образом, с помощью простых и ясных абстракций, скрываются от программиста все ненужные ему подробности организации прерываний, работы таймера, управления памятью и т.д. Более того, на современных вычислительных комплексах может быть создана иллюзия неограниченного размера операционной памяти и числа процессоров. Всем этим занимается операционная система. Таким образом, операционная система представляется пользователю виртуальной машиной, с которой проще иметь дело, чем непосредственно с оборудованием компьютера.
Операционная система как менеджер ресурсов
Операционная система предназначена для управления всеми частями весьма сложной архитектуры компьютера. Представим для примера, что случится, если несколько программ, работающих на одном компьютере, будут пытаться одновременно осуществлять вывод на принтер. Мы получили бы неупорядоченную смесь строчек и страниц, выведенных различными программами. Операционная система предотвращает хаос такого рода за счет буферизации информации, предназначенной для печати, на диске и организации очереди на печать. Для многопользовательских компьютеров, необходимость управления ресурсами и их защиты еще более очевидна.
Следовательно, операционная система как менеджер ресурсов, осуществляет упорядоченное и контролируемое распределение процессоров, памяти и других ресурсов между различными программами, их использующими.
Операционная система как защитник пользователей и программ
Если вычислительная система допускает совместную работу нескольких пользователей, то возникает проблема организации их безопасной деятельности. Необходимо обеспечить сохранность информации на диске, чтобы никто не мог удалить или повредить чужие файлы. Нельзя разрешить программам одних пользователей произвольно вмешиваться в работу программ других пользователей. Нужно пресекать попытки несанкционированного использования вычислительной системы. Всю эту деятельность осуществляет операционная система как организатор безопасной работы пользователей и их программ. С такой точки зрения операционная система выглядит системой безопасности в государстве, на которую возложены полицейские и контрразведывательные функции.
Операционная система как постоянно функционирующее ядро
Наконец, можно дать и такое определение: операционная система это программа, постоянно работающая на компьютере и взаимодействующая со всеми прикладными программами. Казалось бы, это абсолютно правильное определение, но во многих современных операционных системах постоянно работает на компьютере лишь часть операционной системы, которую принято называть ее ядром.
Краткая история эволюции вычислительных систем
• Первый период (1945 - 1955). Ламповые машины. Операционные систем отсутствовали.
• Второй период (1955 - Начало 60-х). Компьютеры на основе транзисторов. Пакетные операционные системы
• Третий период (Начало 60-х - 1980). Компьютеры на основе интегральных микросхем. Первые многозадачные ОС.
• Четвертый период (1980 – настоящее время). Персональные компьютеры. Классические, сетевые и распределенные системы.
Появление мультипрограммирования требует целой революции в строении вычислительной системы. Большую роль, здесь играет аппаратная поддержка, наиболее существенные особенности которой:
Реализация защитных механизмов. Программы не должны иметь самостоятельного доступа к распределению ресурсов, что приводит к появлению привилегированных и непривилегированных команд. Привилегированные команды, например команды ввода-вывода, могут исполняться только операционной системой. Говорят, что она работает в привилегированном режиме. Переход управления от прикладной программы к ОС сопровождается контролируемой сменой режима. Во-вторых, это защита памяти, позволяющая изолировать конкурирующие пользовательские программы друг от друга, а ОС от программ пользователей.
Наличие прерываний. Внешние прерывания оповещают ОС о том, что произошло асинхронное событие, например, завершилась операция ввода-вывода. Внутренние прерывания (сейчас их принято называть исключительными ситуациями) возникают, когда выполнение программы привело к ситуации, требующей вмешательства ОС, например, деление на ноль или попытка нарушения защиты.
Роль операционной системы в организации мультипрограммирования
Интерфейс между прикладной программой и ОС был организован при помощи набора системных вызовов.
Организация очереди из заданий в памяти и выделение процессора одному из заданий потребовали планирования заданий.
Для переключения процессора с одного задания на другое возникла потребность в сохранении содержимого регистров и структур данных, необходимых для выполнения задания, иначе говоря, контекста, для обеспечения правильного продолжения вычислений.
Поскольку память является ограниченным ресурсом, оказались нужны стратегии управления памятью, то есть потребовалось упорядочить процессы размещения, замещения и выборки информации из памяти.
Так как программы могут пожелать произвести санкционированный обмен данными, стало необходимо их обеспечить средствами коммуникации.
Для корректного обмена данными необходимо предусмотреть координацию программами своих действий, т.е. средства синхронизации.
Основные функции классических операционных:
• Планирование заданий и использования процессора.
• Обеспечение программ средствами коммуникации и синхронизации.
• Управление файловой системой.
Каждая из приведенных функций обычно реализована в виде подсистемы, являющейся структурным компонентом ОС. В каждой конкретной операционной системе эти функции, конечно, реализовывались по-своему, в различном объеме. Они не были придуманы как составные части деятельности операционных систем изначально, а появились в процессе развития, по мере того, как вычислительные системы становились удобнее, эффективнее и безопаснее.
Основные понятия ОС
В любой операционной системе поддерживается некоторый механизм, который позволяет пользовательским программам обращаться за услугами ядра ОС. Эти средства общения с ядром часто назывались экстракодами или системными макрокомандами. В ОС UNIX такие средства называются системными вызовами.
Системные вызовы (system calls) интерфейс между операционной системой и пользовательской программой. Они создают, удаляют и используют различные объекты, главные из которых процессы и файлы. Пользовательская программа запрашивает сервис у операционной системы, осуществляя системный вызов. Имеются библиотеки процедур, которые загружают машинные регистры определенными параметрами и осуществляют прерывание процессора, после чего управление передается обработчику данного вызова, входящему в ядро операционной системы. Цель таких библиотек сделать системный вызов похожим на обычный вызов подпрограммы.
Основное отличие состоит в том, что при системном вызове задача переходит в привилегированный режим или режим ядра (kernel mode). Поэтому системные вызовы иногда еще называют программными прерываниями в отличие от аппаратных прерываний, которые чаще называют просто прерываниями.
В этом режиме работает код ядра операционной системы, причем он исполняется в адресном пространстве и в контексте вызвавшей его задачи. Таким образом, ядро операционной системы имеет полный доступ к памяти пользовательской программы, и при системном вызове достаточно передать адреса одной или нескольких областей памяти с параметрами вызова и адреса одной или нескольких областей памяти для результатов вызова.
В большинстве операционных систем системный вызов осуществляется командой программного прерывания (INT). Таким образом, программное прерывание это синхронное событие.
Прерывания
Прерывание (hardware interrupt) событие, генерируемое внешним (по отношению к процессору) устройством. Посредством аппаратных прерываний аппаратура либо информирует центральный процессор о том, что возникло какое-либо событие, требующее немедленной реакции (например, пользователь нажал клавишу), либо сообщает о завершении асинхронной операции ввода-вывода (например, закончено чтение данных с диска в основную память).
Важный тип аппаратных прерываний - прерывания таймера, которые генерируются периодически через фиксированный промежуток времени. Прерывания таймера используются операционной системой при планировании процессов. Каждый тип аппаратных прерываний имеет собственный номер, однозначно определяющий источник прерывания.
Аппаратное прерывание это асинхронное событие, то есть оно возникает вне зависимости от того, какой код исполняется процессором в данный момент. Обработка аппаратного прерывания не должна учитывать, какой процесс является текущим.
Исключительные ситуации
Исключительная ситуация (exception) событие, возникающее в результате попытки выполнения программой недопустимой команды, доступа к ресурсу при отсутствии достаточных привилегий или обращения к отсутствующей странице памяти.
Исключительные ситуации так же, как и системные вызовы, являются синхронными событиями, возникающими в контексте текущей задачи. Исключительные ситуации можно разделить на исправимые и неисправимые. К исправимым относятся такие исключительные ситуации, как отсутствие нужной информации в оперативной памяти. После устранения причины исправимой исключительной ситуации программа может продолжить выполнение.
Возникновение в процессе работы операционной системы исправимых исключительных ситуаций является нормальным явлением. Неисправимые исключительные ситуации обычно возникают в результате ошибок в программах. Обычно операционная система реагирует на такие ситуации завершением программы, вызвавшей исключительную ситуацию.
Файлы
Файлы предназначены для хранения информации на внешних носителях, то есть, принято, что информация, лежащая, например, на диске, должна находиться внутри файла. Обычно под файлом понимают часть пространства на носителе информации, имеющую имя.
Главная задача файловой системы (file system) скрыть особенности ввода-вывода и дать программисту простую абстрактную модель файлов, независимых от устройств. Для чтения, создания, удаления, записи, открытия и закрытия файлов также имеется обширная категория системных вызовов (create, delete, open, close, read, write ).
Пользователям хорошо знакомы такие понятия, связанные с организацией файловой системы, как каталог, текущий каталог, корневой каталог, путь, для манипулирования которыми в операционной системе имеются системные вызовы.
ОС - программное обеспечение, которое позволяет управлять ресурсами компьютера и предоставляет общие службы для компьютерных программ. Ниже приведен курс лекций по операционным системам.
Операционные системы позволяют управлять ресурсами компьютера и обеспечивают взаимодействие пользователя с устройством. Изучив ОС, вы будете знать о том, как на самом деле происходит работа компьютера, и что кроется за выполнением самой элементарной программы.
Курс по операционным системам состоит из 9 лекций, каждая из которых посвящена определенной теме. Его цель - объяснить основные принципы дизайна ОС. Вы узнаете о причинах их появления, о том, какие проблемы пришлось решать инженерам и как им это удалось. Также курс расскажет, какие ресурсы компьютера используются ОС, что такое треды, виртуальная память. После просмотра вы узнаете, как бороться с дедлоками, сегментацией памяти, а также множество других понятий, которые являются неотъемлемой частью курса операционных систем.
1. Что такое компьютер и операционная система
В этом видео вы познакомитесь с такими понятиями как компьютер, операционная система, и другими ключевыми определениями курса.
Разные уровни абстракции
Абстракции необходимы для работы с hardware, так как без них использование металла практически невозможно. Также операционная система должна создавать виртуальные ресурсы или делать невозобновляемые ресурсы возобновляемыми. Примером невозобновляемых ресурсов может стать память (4GB виртуальной памяти vs 1GB физической памяти).
7. Организация памяти. Виртуальная память.
Для чего нужно использовать виртуальную память и как решать проблемы организации памяти – тема этой лекции.
Управление ресурсами
Многие ресурсы являются ограниченными, поэтому нужно максимально точно распределить их между приложениями и программами.
Что произойдёт, если сразу несколько программ запросят много памяти?
Фаза 1: Готовим малинку
Первое, что нам требуется сделать — это настройка CP2102-переходника. Он нужен для общения между компьютером и Pi. По мимо этого малинка получает через него жизненно необходимые 5 вольт. С одной стороны USB, с другой штук пять штырьков, посередине платка.
Работа программы
Что же происходит когда работает какая-либо программа? Запущенная программ выполняет одну простую вещь — она исполняет инструкции. Каждую секунду миллионы и даже возможно миллиарды инструкций извлекаются процессором из оперативной памяти, в свою очередь он декодирует их (например, распознает к какому типу, принадлежат эти инструкции) и исполняет. Это могут быть сложение двух чисел, доступ к памяти, проверка условия, переход к функции и так далее. После окончания выполнения одной инструкции процессор переходит к выполнению другой. И так инструкция за инструкцией, они исполняются до тех пор, пока программа не завершится.
Данный пример естественно рассмотрен упрощенно — на самом деле для ускорения работы процессора современное железо позволяет исполнять инструкции вне очереди, просчитывать возможные результаты, выполнять инструкции одновременно и тому подобные ухищрения.
Обзор
В этой части будем настраивать малинку и необходимые инструменты. По итогам у нас будет малинка, мигающая светодиодом. Тут есть четыре основных этапа. Для начала нам требуется убедиться, что связь Pi с компьютером вполне себе работает. Запустим предварительно подготовленную программу. Во втором этапе разберёмся, как светодиодики подключать. Про макетную плату и проводки. На третьем этапе соберём няшный сишный код и запустим его на Pi. Установим кросскомпилятор aarch64-none-elf и попробуем его в деле. И на четвёртом этапе перепишем это всё дело на Rust.
Парочка полезных ссылок:
-
— главным образом про периферию про макетную плату и проводки для тех, кто и так неплохо программирует на ангельском (русскоязычная версия ещё не готова — можно помочь с переводом) (синий текст кликабелен)
Подключение светодиода.
Начнём с построения вот такой схемки:
Если никогда не пользовали макетку, то рекомендуется почитать (или хотяб посмотреть картинки) вот в этом руководсве. На нашей схеме мы подсоединяем светодиодик к контакту 3.3 вольта (вывод №1) и к контакту с нулевым потенциалом (за номером 14). Обратите внимание на правильность подключения светодиода. Более короткая его ножка должна быть подключена через резистор к пину 14 (нулевой потенциал, или земля (ground) по другому). После этого можно подключить малинку к питанию. Светодиод будет гореть (если всё подключено правильно). Если светодиод перевернуть, то он просто не будет гореть. Он в конце концов такой же диод, как и любые его друзья.
Если всё заработало с равномерно горящим светодиодом, то можно попробовать оным помигать. Отрубаем малинку от питания. Теперь переподключаем светодиод от пина 1 к пину 36 (GPIO 16) вот таким образом:
Опять вынимаем карту памяти. Копируем на неё files/gpio16-blink.bin под именем kernel8.img вместо старого с тем же именем. Ставим карточку обратно и подключаем малинку к питанию. Теперь светодиод должен безудержно мигать.
Читайте также: