Пишем свою операционную систему. Доступ к ListFS из обычной ОС

Всем доброго времени суток! Последний выпуск рассылки выходил очень давно. Приношу свои извинения, но у меня, к сожалению, стало слишком мало времени. Да и теперь, спустя такой длительный интервал времени, возникает желание переписать ОС с чистого листа, исправив старые ошибки (и добавив новых, кхе-кхе. Наверное, стоит оформить ОС как OpenSource проект, чтобы всегда был доступен полный исходный код, а все желающие могли вносить исправления (мне неоднократно приходили письма с просьбами выслать полный исход...

2014-02-03 10:18:16 + Комментировать

Пишем свою операционную систему. Улучшение обработки IRQ прерываний и многозадачности

Давненько не писал новых выпусков. пришло время это исправить. Сегодня мы сильно изменим структуру обработки IRQ-прерываний. Раньше, каждое прерывание описывалось отдельно. Теперь мы сведём обработку всех прерываний в одну функцию. Если сейчас выигрыш от этого не очевиден, то потом он будет заметнее. Ведь в конечном счёте ядро должно при возникновении IRQ-прерывания отправить сообщение программе-драйверу (у нас же микроядро. И меняться в этом сообщении будет только номер прерывания. Не будем же мы писать 1...

2013-02-11 09:51:31 + Комментировать

Пишем свою операционную систему. Начало реализации многозадачности

Во-первых, вот исправление функции list_remove из stdlib.c, чтобы она нормально компилировалась: void list_remove(ListItem *item) { mutex_get(&( item-> list->mutex, true); if ( item-> list->first = item) { item-> list->first = item->next; if ( item-> list->first = item) { item-> list->first = NULL; } } item->next->prev = item->prev; item->prev->next = item->next; item-> list->count-; mutex_release(&( item-> list->mutex); } Во-вторых, се...

2012-08-24 04:51:51 + Комментировать

Пишем свою операционную систему. Начало реализации многозадачности

Во-первых, вот исправление функции list_remove из stdlib.c, чтобы она нормально компилировалась: void list_remove(ListItem *item) { mutex_get(&( item-> list->mutex, true); if ( item-> list->first = item) { item-> list->first = item->next; if ( item-> list->first = item) { item-> list->first = NULL; } } item->next->prev = item->prev; item->prev->next = item->next; item-> list->count-; mutex_release(&( item-> list->mutex); } Во-вторых, се...

2012-08-24 04:51:38 + Комментировать

Пишем свою операционную систему. Улучшение стандартной библиотеки

Причина падения ОС при включении оптимизации была найдена - memset (как и memcpy) меняет значение регистра EDI, который считается неизменным по соглашению вызова C (вызываемая функция обязана сохранить его значение. Я принял достаточно радикальное решение - часть функций стандартной библиотеки будет вынесена в ассемблерный файл для лучшей оптимизации (строковые операции компилятор делает неэффективно) и простоты написания. Теперь в нашем проекте появляется файл stdlib.i386.asm: format ELF public memset pub...

2012-08-15 20:48:06 + Комментировать

Пишем свою операционную систему. Многозадачность

В этом выпуске мы рассмотрим теорию многозадачности и подготовим наш код к её поддержке. До конца в этом выпуске мы многозадачность не сделаем, потому что это достаточно сложная тема. Теория Многозадачность - это способность ОС выполнять несколько программ параллельно. В идеальной ситуации каждое приложение выполняется на отдельном ядре процессора, независимо и полностью параллельно. Однако, это идеальная ситуация и в реальности как правило недостижимая, поэтому сразу много процессов вынуждены делить один ...

2012-08-15 18:17:14 + Комментировать

Пишем свою операционную систему Менеджер виртуальной памяти

В этом выпуске мы наконец-то реализуем менеджер виртуальной памяти, который знает не только "что спроецировать", но и "куда спроецировать". Его реализацию на текущий момент можно считать черновой (в отличии от менеджера физической памяти) и безупречную работу я гарантировать не могу. Для начала исправим небольшую ошибку в map_pages: bool map_pages(phyaddr page_dir, void *vaddr, phyaddr paddr, size_t count, unsigned int flags) { for (; count; count) { phyaddr page_table = page_dir; char ...

2012-08-14 20:40:37 + Комментировать

Пишем свою операционную систему Защита памяти и работа над ошибками

В этом выпуске мы проставим правильные атрибуты для памяти ядра, а также исправим некоторые ошибки в коде. Открытие адресной линии A20 Работа с виртуальной машиной Bochs немного отличается от работы с реальным железом. Например, тем, что адресная линия A20 после загрузки в Bochs по умолчанию открыта. Это приводит к тому, что разработчику ОС не требуется открывать её вручную, потому что всё и так работает, однако ошибка проявится на реальном железе. Адресная линия A20 позволяет процессору обращаться к памят...

2012-07-30 20:12:36 1 комментарий

Пишем свою операционную систему. Немного улучшений менеджера памяти

В этом выпуске мы рассмотрим работу менеджера виртуальной памяти, а также улучшим некоторые другие части memory_manager.c. Заголовочный файл memory_manager.h теперь будет выглядеть так: #ifndef MEMORY_MANAGER_H #define MEMORY_MANAGER_H #include "stdlib.h" #define PAGE_SIZE 0x1000 #define PAGE_OFFSET_BITS 12 #define PAGE_OFFSET_MASK 0xFFF #define PAGE_TABLE_INDEX_BITS 10 #define PAGE_TABLE_INDEX_MASK 0x3FF #define PHYADDR_BITS 32 #define PAGE_PRESENT (1 << 0) #define PAGE_WRITABLE (1 <&lt...

2012-07-27 22:28:41 + Комментировать

Пишем свою операционную систему. Менеджер физической памяти

Доброго времени суток! Сегодня в этом выпуске мы напишем реализацию менеджера физической памяти. Его задача - найти N свободных физических страниц, пометить их как занятые и отдать адрес первой. А также обратную операцию - пометка блока физических страниц как свободных. Мне известно 4 различных алгоритма: 1) Стек страниц. Создаётся специальная структура данных - массив физических адресов, количество элементов равно количеству страниц физической памяти. При 32-битном адресе это будет лишь 1/1024 всей памяти...

2012-07-26 03:02:21 + Комментировать