OSDev http://osdev.su/ |
|
Express OS http://osdev.su/viewtopic.php?f=4&t=178 |
Страница 15 из 19 |
Автор: | Himik [ 04 сен 2013, 00:00 ] |
Заголовок сообщения: | Re: Express OS |
Выпущена промежуточная версия 2013.09.02. * Внедрены 2МБ страницы. * Внедрён менеджер блоков кратностью 4КБ, но пока только для глобальной памяти. Большинство системных объектов располагается именно в ней, поэтому система уже достаточно работоспособна. Локальная память выделяется кратностью 2МБ, менеджер 4КБ блоков будет добавлен в следующей версии. * В обработчике исключения "Ошибка страницы" исправлена ошибка связанная с гонкой потоков. Внутри этого обработчика происходит связывание виртуальных страниц с физическими страницами. Работа состоит из двух действий - подключение физической страницы к таблице страниц, и заполнении её нулями. Если при подключении страницы она сразу становится доступной параллельным процессам, то заполнение нулями пойдёт параллельно с заполнением другими данными. Подключение страницы производится в режиме супервизора, а параллельные процессы являются пользовательскими задачами, поэтому найдено простое решение. Сначала страница подключается без атрибута доступа User, лишь с атрибутом Present, таким образом некоторое время она доступна только ядру. Атрибут User добавляется после заполнения нулями. |
Автор: | Nable [ 04 сен 2013, 00:39 ] |
Заголовок сообщения: | Re: Express OS |
ОМГ, а зачем нулями заполнять? Прогам нефиг закладываться на значение неинициализированных переменных (то что глобальные по стандарту нули - это CRT должна делать, а не ОС). А ещё подумай что вдруг своп будешь реализовывать, а это убрать забудешь. |
Автор: | SII [ 04 сен 2013, 09:07 ] |
Заголовок сообщения: | Re: Express OS |
Обнуление применяют как одно из средств защиты от утечек информации. Например, некая физическая страница принадлежала сначала одному приложению, а потом была выделена другому без такого затирания и без загрузки какой-то информации второго приложения с диска. В результате второе приложение может получить доступ к данным первого приложения, оставшимся в данной странице. Но, вообще говоря, лично я считаю, что такое обнуление должно делаться только для страниц, выделяемых задачам пользователя, и только тогда, когда это требуется повышенной безопасностью системы -- иначе незачем на это время тратить. |
Автор: | Himik [ 04 сен 2013, 10:48 ] |
Заголовок сообщения: | Re: Express OS |
Да, я уже хочу в будущем обойтись без обнуления страниц, и обнулять только некоторые области. Это значительно повышает быстродействие. Если сейчас просто убрать обнуление, тогда некоторые приложения работают, а некоторые нет. Надо проанализировать это дело. Nable писал(а): ОМГ, а зачем нулями заполнять? Прогам нефиг закладываться на значение неинициализированных переменных (то что глобальные по стандарту нули - это CRT должна делать, а не ОС). Нет, именно ОС. CRT обнулениями не занимается. Ну, может быть в отладочном режиме и обнуляет. |
Автор: | Himik [ 05 сен 2013, 01:49 ] |
Заголовок сообщения: | Re: Express OS |
В версии 2013.09.03 в обработчике исключения "Ошибка страницы" исправлена ещё одна ошибка связанная с гонкой потоков, только на этот раз в страницах выделяемых механизмом Fork copy-on-write. Новая страница подключалась к приложению до копирования содержимого. Решение такое же, с помощью манипуляций атрибутов доступа. Теперь система стабильна. |
Автор: | maisvendoo [ 05 сен 2013, 07:48 ] |
Заголовок сообщения: | Re: Express OS |
Himik писал(а): Теперь система стабильна Было бы интересно узнать, какие механизмы синхронизации используются в ядре |
Автор: | Himik [ 05 сен 2013, 12:01 ] |
Заголовок сообщения: | Re: Express OS |
В некоторых процедурах, для блокировки параллельного запуска, на входе стоит мютекс. У каждой процедуры (или группы процедур) свой флаг блокировки, поэтому разнотипные функции и процедуры могут выполняться параллельно несколькими процессорами. В качестве мютекса используется ассемблерная команда "lock cmpxchg [%1],%2". Здесь в [%1] адрес флага, в %2 новое значение для записи, а в регистре eax значение для сравнения со старым значением [%1], и в случае равенства, %2 записывается в [%1]. В eax записывается старое значение из [%1]. В начале в eax указывается 0, а в %2 = 1. Если в результате eax <> 0, то инструкцию зацикливаем. На выходе из процедуры флагу просто присваивается 0. |
Автор: | maisvendoo [ 05 сен 2013, 13:56 ] |
Заголовок сообщения: | Re: Express OS |
А разве это не спин-блокировка? Просто у меня что-то похожее, и оно отчаянно глючит |
Автор: | Himik [ 05 сен 2013, 14:27 ] |
Заголовок сообщения: | Re: Express OS |
maisvendoo писал(а): А разве это не спин-блокировка? Просто у меня что-то похожее, и оно отчаянно глючит Я в этих тонкостях не разбираюсь. Основной сущностью у меня является флаг занятости. Чтобы не глючило, нужно обязательно использовать инструкцию с блокировкой шины, это либо xchg, либо команды с префиксом lock. |
Автор: | maisvendoo [ 05 сен 2013, 14:39 ] |
Заголовок сообщения: | Re: Express OS |
У меня такое Захват мьютекса Код: /*----------------------------------------------------------------------------- * *---------------------------------------------------------------------------*/ bool mutex_get(mutex_t* mutex, bool wait) { bool old_value = true; do { asm volatile ("xchg (,%1,), %0":"=a"(old_value):"b"(mutex), "a"(old_value)); } while (old_value && wait); return !old_value; } Освобождение мьютекса Код: /*----------------------------------------------------------------------------- * *---------------------------------------------------------------------------*/ void mutex_release(mutex_t* mutex) { *mutex = false; } При использовании бывают моменты жесткого блокирования, когда эта хреновина не отпускается даже самим захватившим потоком. Пока не реализовал ничего нового, поэтому у меня анархия процессов/потоков |
Страница 15 из 19 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |