Разбираем на винтики учебный процессор TOY

А давайте возьмём простейший процессор и напишем его эмулятор на Python. Будем кормить его бинарниками и дебажить.
Статья для тех, кто всегда хотел разобраться в машинном коде, но боялся начать.

Обеспечение работы прикладного ПО

А давайте возьмём простейший процессор и напишем его эмулятор на Python. Будем кормить его бинарниками и дебажить.
Статья для тех, кто всегда хотел разобраться в машинном коде, но боялся начать.

Трудно добиться быстродействия ядра, организовать параллельную работу потоков и при этом писать ясный код. Блокировки помогают параллельным потокам работать корректно, но иногда блокировки использовать трудно. Глава расскажет о хитрых сценариях с блокировками в xv6 и о сценариях без блокировок.

Файловая система организует и хранит данные. Пользователи и программы работают с данными, а файловая система сохранит данные даже после перезагрузки компьютера.
Файловая система xv6 предлагает Unix-подобные файлы, директории и пути и хранит данные на virtio-диске.
Глава расскажет, какие задачи решает файловая система xv6.

Данные - это важный компонент системы. Приложение может хранить их где угодно, но в результате все сводится к файлам. Файлы - это хорошая абстракция, но она протекает: если не знать того, как работают ОС или гарантии файловой системы, то легко выстрелить себе в ногу.
Меня увлекла тема отказоустойчивости, а конкретно - отказоустойчивой работы с файлами. В этой статье я попытался соединить все полученные знания:
Кто участвует в процессе записи
Ошибки, которые могут произойти
Что от нас зависит, а что нет
И самое главное - как это этого защититься
Команда Rust рада сообщить о новой версии языка — 1.77.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.77.0 вам достаточно выполнить команду:
$ rustup update stableЕсли у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Глава расскажет, что такое мультиплексирование процессов, как xv6 переключает процессы, как xv6 синхронизирует процессы с помощью sleep и wakeup, как работает семафор, как работает канал (pipe), как случаются инверсии приоритетов и образуются конвои процессов, как правильно убить процесс и укротить грохочущее стадо процессов.

Привет, Хабр! Мне 16 лет, я студент, учусь на первом курсе колледжа на программиста. Начал увлекаться низкоуровневым программированием на Ассемблере и C/C++
Я заметил что на Хабре есть множество статей о написании своих простых "загрузчиков" для BIOS-MBR, которые выводят на экран "Hello World!". И при этом практически нет ни одной статьи о создании того же самого, но только для UEFI, хотя будущее именно за ним, ведь BIOS уже давно устарел! Это я и хочу исправить в этой статье.


Ядро ОС выполняет программы параллельно и переключает потоки по таймеру. Каждый процессор выполняет поток независимо от других. Процессоры используют оперативную память совместно, поэтому важно защитить структуры данных от одновременного доступа. Потоки испортят данные, если процессор переключится на другой поток, когда первый поток еще не завершил запись.
Потоки конкурируют за доступ к структуре данных. Ядро кишит структурами, которые потоки используют совместно. Блокировки защищают данные при конкурентном доступе.
Глава расскажет, зачем нужны блокировки, как xv6 реализует и использует блокировки.

Если у вас есть эмбедед(embedded) проект и он написан на С или на С++ вы можете попробовать запустить этот проект в режиме симуляции на десктопном ПК и даже под Windows, по крайней мере у нас это получилось.
Такая симуляция превращает десктопный ПК в специальное устройство при этом не отнимая у вашего ПК десктопных возможностей-функций, например для отладки вашего встроенного ПО, которое исполняется на ПК в режиме симуляции. Ну а возможности тестирования и диагностики вашего эмбедед проекта в режиме симуляции практически не ограничены.
Дисклеймер: поскольку проект все еще в работе и принадлежит компании мне приходится избегать некоторых специальных технических терминов и подменять их более общеупотребительными, чтобы не создать привязку к бренду или к имени компании. Также я излагаю только общую идею, которая достаточно сложна, чтобы кто-то мог эту идею легко использовать, хотя в принципе это возможно. Нам интересно есть ли у кого-то опыт в обозначенном техническом направлении и любой обмен таким опытом.

Драйвер управляет устройством - настраивает, отправляет команды, обрабатывает прерывания и общается с процессами, которые ожидают завершения ввода-вывода. Код драйвера зависит от конкретного устройства, поэтому изучайте документацию на устройство, чтобы понять код драйвера.
Устройство прерывает процессор, когда требует внимания. Обработчик прерывания опознает устройство и вызовет процедуру драйвера. В xv6 это делает процедура devintr.
Файл kernel/console.c содержит код драйвера терминала. Драйвер обрабатывает символы из последовательного порта UART на RISC-V, которые человек вводит на клавиатуре.
QEMU эмулирует микросхему 16550 UART и подключает клавиатуру и экран к UART. На реальном компьютере 16550 управляет портом RS232, который работает с терминалом или другим компьютером.
Драйвер накапливает символы в кольцевом буфере cons.buf. Индекс cons.r указывает на первый символ, который прочтет функция consoleread. Буфер хранит строки символов, а индекс cons.w указывает на начало последней строки, которую еще вводит человек. Индекс cons.e указывает позицию курсора в последней строке для ввода следующего символа.

Глава расскажет, как xv6 обрабатывает прерывания на RISC-V и о хитростях виртуальной памяти: как использовать ошибки доступа к страницам, чтобы оптимизировать работу ОС.
Глава расскажет о копировании страниц при записи, ленивой выдаче страниц, выдаче страниц по необходимости и сбросе страниц на диск.
Настало время освоить очередное семейство микроконтроллеров: от компании Artery Technology.
Компания Artery Technology уже возвела полноценную экосистему для своих процессоров. Есть фирменные отладочные платы, программаторы, документация, исходные коды MCAL и даже кодо генераторы.
В этом тексте я представил пошаговую инструкцию того как запрограммировать микроконтроллер Artery.
Команда Rust рада сообщить о новой версии языка — 1.76.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.76.0 вам достаточно выполнить команду:
rustup update stableЕсли у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Пользуюсь открытым ПО значительное время. Сижу на Линуксе.
Но в последнее время настолько часто сталкиваюсь с различными багами, что думается иногда, а как оно вообще в принципе работает?
Последний эпизод коснулся совсем уж системного кода - стандартной библиотеки libc от GNU. Системнее может быть только ядро.
История такая. Собрал Хромиум (не быстро). Когда наконец сборка завершилась с попутным решением проблем, думал: ну вот наконец щас запущу, посмотрю как работают интересующие меня вещи. И тут произошёл облом. Хром падал почти в самом начале запуска с ошибкой доступа к памяти. Довольно быстро удалось выяснить, что падение происходит из-за ошибки обращения по нулевому указателю. И происходит оно в динамическом загрузчике, то бишь в libdl, при загрузке библиотеки через dlopen. libdl.so является одной из компонент пакета стандартной библиотеки и понятно, самой системной библиотекой в ОС. Подробности всей ситуации я описал в вопросе на stackoverflow.
Вкратце: при загрузке библиотеки libXcursor.so подтягиваются непонятно откуда взявшиеся зависимости, не имеющие никакого отношения к упомянутой библиотеке. И зависимости эти не инициализированы корректно. Откуда и происходит обращение по нулевому указателю. Впоследствии выяснилось, что проблема начинается с несовпадающих версий библиотек libQt5Core, в результате чего libdl делает полный отбой с попыткой отката всех изменений.
Но, видимо, этот откат реализован из рук вон плохо, поскольку после него начинают происходить весьма странные вещи. И загрузка неинициализированной зависимости с нулевыми указателями лишь одна из них. Я ещё сделал пробник в виде простого приложения, которое пытается воспроизвести ситуацию. И в этом пробнике также происходил сбой, но уже при инициализации (вызов init или конструктор в их терминологии) либы libpthread.so (тоже очень системная) - потерян адрес глобального на процесс хранилища либ.

ОС управляет виртуальной памятью с помощью таблиц страниц. Виртуальная память процесса - адресное пространство, защищенное от других процессов. ОС делит память на страницы одинакового размера и отображает страницы виртуальной памяти на страницы физической памяти. Так ОС предоставит процессу непрерывное адресное пространство, даже если страницы физической памяти расположены в другом порядке. Таблица страниц хранит для виртуальной страницы номер соответствующей физической страницы. Каждый процесс владеет личной таблицей страниц.
Глава рассказывает, как xv6 работает с виртуальной памятью и об устройстве виртуальной памяти RISC-V.

Рассмотрим, как устроены GPIO-драйверы в Linux, и почему это сделано именно так. Поймем, почему для простого мигания светодиодом в этой операционной системе надо пройти через N слоев абстракции.
Эта инструкция - приложение к книге об учебной ОС xv6.
Xv6 работает на RISC-V. Для сборки кода xv6 и запуска под QEMU понадобятся RISC-V версии инструментов: QEMU 5.1+, GDB 8.3+, GCC, и Binutils.

Продолжаем создавать модуль ядра в Линукс на примере виртуальной файловой системы.
Часть 1: Описание задачи, Модуль ядра
...
Часть 4: Inode-операции: symlink, unlink