Рубрика «системное программирование» - 71

Как запустить программу без операционной системы: часть 3: Графика

В этой части попробуем сделать “невозможное”: научимся использовать графический дисплей без операционной системы. На самом деле это задача не из легких, особенно в случае работы в 32-х битном защищенном режиме, и особенно если хочется использовать приличное разрешение экрана а не 320x200x8. Но все по порядку: раз хотим графику – значит нужно работать с видеокартой.

Современные графические карты – это практически полноценные компьютеры по мощности не уступающие основному: тут и декодирование MPEG2 в качестве 1080p, поддержка 3D графики и шейдеров, технологии вроде CUDA, и многое другое. Это все выглядит весьма сложно. С другой стороны видеокарты – это всего лишь очередной PCI девайс, такой же, как и остальные. Это устройство мы даже “нашли” в предыдущей статье с номером класса устройства 0x03 (class_name=graphics adapter). Как и с любым, устройством с видеокартой можно работать при помощи портов ввода-вывода или MMIO областей памяти, а сама видеокарта может использовать DMA и прерывания для взаимодействия с основным процессором. Если посмотреть на диапазон портов ввода-вывода, доступных у видео карт, то мы увидим, что всего ей выделяется менее 50-ти байт – не так уж и много с учетом огромной функциональности, которой обладают современные видеокарты.
Читать полностью »

Очень тривиальное, но боевое решение, где-то на грани Unix Way. Я покажу только метод решения, без привязки к каким-то конкретным средам. Реализуйте по своему вкусу и убеждениям.

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

Читать полностью »

Пишу игрушечную ОС (о прерываниях)
Данная статья написана в форме поста для блога. Если она окажется вам интересной, то будет продолжение.

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

Общая задумка (пока весьма далёкая от реализации) следующая: единое 64-битное адресное пространство с вечно живущими нитями (как у Phantom OS); виртуальная машина, обеспечивающая безопасность исполнения кода. На данный момент реализованы:

1. загрузка ядра при помощи multiboot-загрузчика (GRUB);
2. текстовый VGA-режим (16-цветов, kprintf);
3. простой интерфейс настройки отображения страниц;
4. возможность обработки прерываний на C;
5. идентификация топологии процессоров (сокеты, ядра, потоки) и их запуск;
6. работающий прототип SMP-планировщика с поддержкой приоритетов;

Пропустим описание multiboot-загрузки и работы с VGA-режимом (об этом не писал, разве что, ленивый). Про отображение страниц тоже не хочу писать, боюсь это будет скучно (может, в другой раз). Давайте лучше поговорим об обработке прерываний.
Читать полностью »

Как запустить программу без операционной системы: часть 2

В первой части нашей статьи мы рассказали о том, каким образом можно получить простую программу “Hello World”, которая запускается без операционной системы и печатает сообщение на экран.

В этой части статьи, хочется развить получившийся в первой части код таким образом, чтобы он мог быть отлажен через GDB, компилировался через оболочку Visual Studio и печатал на экран список PCI устройств.

! ВАЖНО!: Все дальнейшие действия могут успешно осуществляться только после успешного прохождения всех 6-ти шагов описанных в первой части статьи).

Читать полностью »

Должно ли C++ сообщество придерживаться стандарта или отойти от него, чтобы создавать лучшие вещи с Boost?

Сравнение C++ Standard и Boost
Погодите, не та библиотека.

В марте 2011 года комитет ISO C++ утвердил финальную версию черновика новейшего стандарта C++. Языка, который официально был стандартизирован в августе того же года и стал известен как C++ 11. Теперь, по прошествии 2 лет, мы можем оглянуться назад и посмотреть на некоторые проблемы, затронувшие язык(аж с момента принятия первого международного стандарта в 1998 году) и сравнить его финальный вариант с популярной C++ библиотекой Boost.

Читать полностью »

Так вышло, что в нашей статье, описывающей механизм опроса PCI шины, не было достаточно подробно описано самого главного: как же запустить этот код на реальном железе? Как создать собственный загрузочный диск? В этой статье мы подробно ответим на все эти вопросы (частично данные вопросы разбирались в предыдущей статье, но для удобства чтения позволим себе небольшое дублирование материала).

В интернете существует огромное количество описаний и туториалов о для того как написать собственную мини-ОС, даже существуют сотни готовых маленьких хобби-ОС. Один из наиболее достойных ресурсов по этой тематике, который хотелось бы особо выделить, это портал osdev.org. Для дополнения предыдущей статьи про PCI (и возможности писать последующие статьи о различных функциях, которые присутствуют в любой современной ОС), мы опишем пошаговые инструкции по созданию загрузочного диска с привычной программой на языке С. Мы старались писать максимально подробно, чтобы во всем можно было разобраться самостоятельно.

Итак, цель: затратив как можно меньше усилий, создать собственную загрузочную флешку, которая всего на всего печатает на экране компьютера классический “Hello World”.

Читать полностью »

Давно и с недоверием присматриваюсь к некоторым функциям WinAPI ориентированным на повышение производительности приложения. Открыв MSDN, нашел описание интересующих меня функций:

BOOL WINAPI SetPriorityClass(
  _In_  HANDLE hProcess,
  _In_  DWORD dwPriorityClass
);

Sets the priority class for the specified process. This value together with the priority value of each thread of the process determines each thread's base priority level.

BOOL WINAPI SetProcessWorkingSetSize(
  _In_  HANDLE hProcess,
  _In_  SIZE_T dwMinimumWorkingSetSize,
  _In_  SIZE_T dwMaximumWorkingSetSize
);

Sets the minimum and maximum working set sizes for the specified process.

BOOL WINAPI SetProcessPriorityBoost(
  _In_  HANDLE hProcess,
  _In_  BOOL DisablePriorityBoost
);

Disables or enables the ability of the system to temporarily boost the priority of the threads of the specified process.
Читать полностью »

        Приветствую. Микроядра редко появляются на Хабре, но на неделе был  топик о GNU/Hurd, где вспоминали  разные микроядра и известные проекты. Было сказано много неточностей, так что я решил рассказать о том, как обстоят дела в отрасли с нашей точки зрения. Дело в том, что мы активно участвуем в развитии проектов Fiasco.OC и Genode и ведем разработки на их основе, так что нам есть о чем рассказать.
Читать полностью »

Что такое  1.#IND и  1.#J?
Любой опытный программист знает, что стандарт представления значений с плавающей точкой (IEEE 754) оставляет несколько зарезервированных значений, соответствующих не-числам (NaN, not-a-number). Стандартная библиотека Visual C печатает не-числа следующим образом:

Печатается Означает
1.#INF Положительная бесконечность
-1.#INF Отрицательная бесконечность
1.#SNAN Положительное сигнальное не-число (signaling NaN)
-1.#SNAN Отрицательное сигнальное не-число (signaling NaN)
1.#QNAN Положительное несигнальное не-число (quiet NaN)
-1.#QNAN Отрицательное несигнальное не-число (quiet NaN)
1.#IND Положительная неопределённость
-1.#IND Отрицательная неопределённость

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

Оружие спаммера — ложный адрес отправителя. При этом в SMTP нет ничего, что бы заставило указывать истинный обратный адрес. Решить проблему подлинности были призваны механизмы аутентификации, которые проверяют письмо на соответствие реальному адресу отправки. Сегодня широко известны две технологии аутентификации: SIDF (система кода отправителя) и DKIM (идентификация почты ключом домена). Эта статья — обзор работы брендов и новичка SenderInspector.

SIDF и DKIM vs SI. Или кто на новенького

1. Технология SIDF
SIDF построен на основе протокола IP и объединяет технологии Microsoft Caller ID for E-Mail (идентификатор отправителя почты от Майкрософт) и SPF (фреймворк политики отправителя).

Механизм SIDF пытается определить, что сообщение было послано отправителем,
указанным в заголовке письма. Причем, отправляющий сервер должен находиться в списке серверов, которым разрешено отправлять почту. SIDF требует внесения специальных текстовых записей (SPF-записей) в файл зон DNS. Записи вносятся хозяином домена. Каждая такая запись должна включать список всех авторизованных серверов исходящей почты (с указанием домена и соответствующих IP-адресов). Принимающий сервер проверяет наличие записи SPF для
входного домена. Проверка выполняется автоматически, еще до того, как письмо попало в папку Входящие. Если адрес исходящего сервера найден, то письмо прошло проверку, иначе его относят к спаму или фишингу.

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js